From 246a79b85682683548679790d7e1c037de051be9 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 16:44:00 +0200 Subject: [PATCH 1/4] fix iife --- src/index.ts | 744 +++++-------------------------------------------- src/main.ts | 597 +++++++++++++++++++++++++++++++++++++++ vite.config.ts | 6 +- 3 files changed, 677 insertions(+), 670 deletions(-) create mode 100644 src/main.ts diff --git a/src/index.ts b/src/index.ts index 8779445..94c5646 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,674 +1,84 @@ "use strict"; -import CSSMatrix from "@thednp/dommatrix"; -import { arcTools } from "./math/arcTools"; -import { bezierTools } from "./math/bezier"; -import { cubicTools } from "./math/cubicTools"; -import { lineTools } from "./math/lineTools"; -import { quadTools } from "./math/quadTools"; -import { polygonTools } from "./math/polygonTools"; -import distanceSquareRoot from "./math/distanceSquareRoot"; -import midPoint from "./math/midPoint"; -import rotateVector from "./math/rotateVector"; -import roundTo from "./math/roundTo"; +import SVGPathCommander from "./main"; -import type { PathArray, PointTuple, TransformObjectValues } from "./types"; -import type { Options, TransformEntries, TransformObject } from "./interface"; -export * from "./types"; -export * from "./interface"; -import defaultOptions from "./options/options"; - -import pathToAbsolute from "./convert/pathToAbsolute"; -import pathToRelative from "./convert/pathToRelative"; -import pathToCurve from "./convert/pathToCurve"; -import pathToString from "./convert/pathToString"; - -import error from "./parser/error"; -import parsePathString from "./parser/parsePathString"; -import finalizeSegment from "./parser/finalizeSegment"; -import invalidPathValue from "./parser/invalidPathValue"; -import isArcCommand from "./parser/isArcCommand"; -import isDigit from "./parser/isDigit"; -import isDigitStart from "./parser/isDigitStart"; -import isMoveCommand from "./parser/isMoveCommand"; -import isPathCommand from "./parser/isPathCommand"; -import isSpace from "./parser/isSpace"; -import paramsCount from "./parser/paramsCount"; -import paramsParser from "./parser/paramsParser"; -import pathParser from "./parser/pathParser"; -import scanFlag from "./parser/scanFlag"; -import scanParam from "./parser/scanParam"; -import scanSegment from "./parser/scanSegment"; -import skipSpaces from "./parser/skipSpaces"; -import getPathBBox from "./util/getPathBBox"; -import getTotalLength from "./util/getTotalLength"; -import distanceEpsilon from "./util/distanceEpsilon"; -import getClosestPoint from "./util/getClosestPoint"; -import getDrawDirection from "./util/getDrawDirection"; -import getPathArea from "./util/getPathArea"; -import getPointAtLength from "./util/getPointAtLength"; -import getPropertiesAtLength from "./util/getPropertiesAtLength"; -import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; -import getSegmentAtLength from "./util/getSegmentAtLength"; -import getSegmentOfPoint from "./util/getSegmentOfPoint"; -import isAbsoluteArray from "./util/isAbsoluteArray"; -import isCurveArray from "./util/isCurveArray"; -import isNormalizedArray from "./util/isNormalizedArray"; -import isPathArray from "./util/isPathArray"; -import isPointInStroke from "./util/isPointInStroke"; -import isRelativeArray from "./util/isRelativeArray"; -import isValidPath from "./util/isValidPath"; -import shapeParams from "./util/shapeParams"; -import shapeToPath from "./util/shapeToPath"; -import shapeToPathArray from "./util/shapeToPathArray"; -import normalizePath from "./process/normalizePath"; -import optimizePath from "./process/optimizePath"; -import reversePath from "./process/reversePath"; -import splitPath from "./process/splitPath"; -import transformPath from "./process/transformPath"; -import absolutizeSegment from "./process/absolutizeSegment"; -import arcToCubic from "./process/arcToCubic"; -import getSVGMatrix from "./process/getSVGMatrix"; -import iterate from "./process/iterate"; -import lineToCubic from "./process/lineToCubic"; -import normalizeSegment from "./process/normalizeSegment"; -import projection2d from "./process/projection2d"; -import quadToCubic from "./process/quadToCubic"; -import relativizeSegment from "./process/relativizeSegment"; -import reverseCurve from "./process/reverseCurve"; -import roundPath from "./process/roundPath"; -import roundSegment from "./process/roundSegment"; -import segmentToCubic from "./process/segmentToCubic"; -import shortenSegment from "./process/shortenSegment"; -import splitCubic from "./process/splitCubic"; -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance - */ -class SVGPathCommander { - // declare class properties - declare segments: PathArray; - declare round: number | "off"; - declare origin: [number, number, number]; - - /** - * @constructor - * @param pathValue the path string - * @param config instance options - */ - constructor(pathValue: string, config?: Partial) { - const instanceOptions = config || {}; - const undefPath = typeof pathValue === "undefined"; - - if (undefPath || !pathValue.length) { - throw TypeError( - `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}` - ); - } - - this.segments = parsePathString(pathValue); - - // // set instance options.round - const { round: roundOption, origin: originOption } = instanceOptions; - let round: number | "off"; - - if (Number.isInteger(roundOption) || roundOption === "off") { - round = roundOption as number | "off"; - } else { - round = defaultOptions.round as number; - } - - // set instance options.origin - // the SVGPathCommander class will always override the default origin - let origin = defaultOptions.origin as [number, number, number]; - /* istanbul ignore else @preserve */ - if (Array.isArray(originOption) && originOption.length >= 2) { - const [originX, originY, originZ] = originOption.map(Number); - origin = [ - !Number.isNaN(originX) ? originX : 0, - !Number.isNaN(originY) ? originY : 0, - !Number.isNaN(originZ) ? originZ : 0, - ]; - } - - this.round = round; - this.origin = origin; - - return this; - } - get bbox() { - return getPathBBox(this.segments); - } - get length() { - return getTotalLength(this.segments); - } - - /** - * Returns the path bounding box, equivalent to native `path.getBBox()`. - * - * @public - * @returns the pathBBox - */ - getBBox() { - return this.bbox; - } - - /** - * Returns the total path length, equivalent to native `path.getTotalLength()`. - * - * @public - * @returns the path total length - */ - getTotalLength() { - return this.length; - } - - /** - * Returns an `{x,y}` point in the path stroke at a given length, - * equivalent to the native `path.getPointAtLength()`. - * - * @public - * @param length the length - * @returns the requested point - */ - getPointAtLength(length: number) { - return getPointAtLength(this.segments, length); - } - - /** - * Convert path to absolute values - * - * @public - */ - toAbsolute() { - const { segments } = this; - this.segments = pathToAbsolute(segments); - return this; - } - - /** - * Convert path to relative values - * - * @public - */ - toRelative() { - const { segments } = this; - this.segments = pathToRelative(segments); - return this; - } - - /** - * Convert path to cubic-bezier values. In addition, un-necessary `Z` - * segment is removed if previous segment extends to the `M` segment. - * - * @public - */ - toCurve() { - const { segments } = this; - this.segments = pathToCurve(segments); - return this; - } - - /** - * Reverse the order of the segments and their values. - * - * @param onlySubpath option to reverse all sub-paths except first - * @public - */ - reverse(onlySubpath?: boolean) { - const { segments } = this; - const split = splitPath(segments); - const subPath = split.length > 1 ? split : false; - - const absoluteMultiPath = subPath - ? subPath.map((x, i) => { - if (onlySubpath) { - return i ? reversePath(x) : x.slice(0); - } - return reversePath(x); - }) - : segments.slice(0); - - let path = [] as unknown as PathArray; - if (subPath) { - path = absoluteMultiPath.flat(1) as PathArray; - } else { - path = onlySubpath ? segments : reversePath(segments); - } - - this.segments = path.slice(0) as PathArray; - return this; - } - - /** - * Normalize path in 2 steps: - * * convert `pathArray`(s) to absolute values - * * convert shorthand notation to standard notation - * - * @public - */ - normalize() { - const { segments } = this; - this.segments = normalizePath(segments); - return this; - } - - /** - * Optimize `pathArray` values: - * * convert segments to absolute and/or relative values - * * select segments with shortest resulted string - * * round values to the specified `decimals` option value - * - * @public - */ - optimize() { - const { segments } = this; - const round = this.round === "off" ? 2 : this.round; - - this.segments = optimizePath(segments, round); - return this; - } - - /** - * Transform path using values from an `Object` defined as `transformObject`. - * - * @see TransformObject for a quick refference - * - * @param source a `transformObject`as described above - * @public - */ - transform(source?: Partial) { - if ( - !source || - typeof source !== "object" || - (typeof source === "object" && - !["translate", "rotate", "skew", "scale"].some((x) => x in source)) - ) { - return this; - } - - const { - segments, - origin: [cx, cy, cz], - } = this; - const transform = {} as TransformObjectValues; - for (const [k, v] of Object.entries(source) as TransformEntries) { - // istanbul ignore else @preserve - if (k === "skew" && Array.isArray(v)) { - transform[k] = v.map(Number) as PointTuple; - } else if ( - (k === "rotate" || - k === "translate" || - k === "origin" || - k === "scale") && - Array.isArray(v) - ) { - transform[k] = v.map(Number) as [number, number, number]; - } else if (k !== "origin" && typeof Number(v) === "number") { - transform[k] = Number(v); - } - } - - // if origin is not specified - // it's important that we have one - const { origin } = transform; - - if (Array.isArray(origin) && origin.length >= 2) { - const [originX, originY, originZ] = origin.map(Number); - transform.origin = [ - !Number.isNaN(originX) ? originX : cx, - !Number.isNaN(originY) ? originY : cy, - originZ || cz, - ]; - } else { - transform.origin = [cx, cy, cz]; - } - - this.segments = transformPath(segments, transform); - return this; - } - - /** - * Rotate path 180deg vertically - * - * @public - */ - flipX() { - const { cx, cy } = this.bbox; - this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] }); - return this; - } - - /** - * Rotate path 180deg horizontally - * - * @public - */ - flipY() { - const { cx, cy } = this.bbox; - this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] }); - return this; - } - - /** - * Export the current path to be used - * for the `d` (description) attribute. - * - * @public - * @return the path string - */ - toString() { - return pathToString(this.segments, this.round); - } - - /** - * Remove the instance. - * - * @public - * @return void - */ - dispose() { - Object.keys(this).forEach((key) => delete this[key as keyof typeof this]); - } +export default SVGPathCommander; - static get CSSMatrix() { - return CSSMatrix; - } - static get arcTools() { - return arcTools; - } - static get bezierTools() { - return bezierTools; - } +export { default as CSSMatrix } from "@thednp/dommatrix"; +export { arcTools } from "./math/arcTools"; +export { bezierTools } from "./math/bezier"; +export { cubicTools } from "./math/cubicTools"; +export { lineTools } from "./math/lineTools"; +export { quadTools } from "./math/quadTools"; +export { polygonTools } from "./math/polygonTools"; - static get cubicTools() { - return cubicTools; - } - static get lineTools() { - return lineTools; - } - static get polygonTools() { - return polygonTools; - } - static get quadTools() { - return quadTools; - } - static get pathToAbsolute() { - return pathToAbsolute; - } - static get pathToRelative() { - return pathToRelative; - } - static get pathToCurve() { - return pathToCurve; - } - static get pathToString() { - return pathToString; - } - static get distanceSquareRoot() { - return distanceSquareRoot; - } - static get midPoint() { - return midPoint; - } - static get rotateVector() { - return rotateVector; - } - static get roundTo() { - return roundTo; - } - static get parsePathString() { - return parsePathString; - } - static get finalizeSegment() { - return finalizeSegment; - } - static get invalidPathValue() { - return invalidPathValue; - } - static get isArcCommand() { - return isArcCommand; - } - static get isDigit() { - return isDigit; - } - static get isDigitStart() { - return isDigitStart; - } - static get isMoveCommand() { - return isMoveCommand; - } - static get isPathCommand() { - return isPathCommand; - } - static get isSpace() { - return isSpace; - } - static get paramsCount() { - return paramsCount; - } - static get paramsParser() { - return paramsParser; - } - static get pathParser() { - return pathParser; - } - static get scanFlag() { - return scanFlag; - } - static get scanParam() { - return scanParam; - } - static get scanSegment() { - return scanSegment; - } - static get skipSpaces() { - return skipSpaces; - } - static get distanceEpsilon() { - return distanceEpsilon; - } - static get getClosestPoint() { - return getClosestPoint; - } - static get getDrawDirection() { - return getDrawDirection; - } - static get getPathArea() { - return getPathArea; - } - static get getPathBBox() { - return getPathBBox; - } - static get getPointAtLength() { - return getPointAtLength; - } - static get getPropertiesAtLength() { - return getPropertiesAtLength; - } - static get getPropertiesAtPoint() { - return getPropertiesAtPoint; - } - static get getSegmentAtLength() { - return getSegmentAtLength; - } - static get getSegmentOfPoint() { - return getSegmentOfPoint; - } - static get getTotalLength() { - return getTotalLength; - } - static get isAbsoluteArray() { - return isAbsoluteArray; - } - static get isCurveArray() { - return isCurveArray; - } - static get isNormalizedArray() { - return isNormalizedArray; - } - static get isPathArray() { - return isPathArray; - } - static get isPointInStroke() { - return isPointInStroke; - } - static get isRelativeArray() { - return isRelativeArray; - } - static get isValidPath() { - return isValidPath; - } - static get shapeParams() { - return shapeParams; - } - static get shapeToPath() { - return shapeToPath; - } - static get shapeToPathArray() { - return shapeToPathArray; - } - static get absolutizeSegment() { - return absolutizeSegment; - } - static get arcToCubic() { - return arcToCubic; - } - static get getSVGMatrix() { - return getSVGMatrix; - } - static get iterate() { - return iterate; - } - static get lineToCubic() { - return lineToCubic; - } - static get normalizePath() { - return normalizePath; - } - static get normalizeSegment() { - return normalizeSegment; - } - static get optimizePath() { - return optimizePath; - } - static get projection2d() { - return projection2d; - } - static get quadToCubic() { - return quadToCubic; - } - static get relativizeSegment() { - return relativizeSegment; - } - static get reverseCurve() { - return reverseCurve; - } - static get reversePath() { - return reversePath; - } - static get roundPath() { - return roundPath; - } - static get roundSegment() { - return roundSegment; - } - static get segmentToCubic() { - return segmentToCubic; - } - static get shortenSegment() { - return shortenSegment; - } - static get splitCubic() { - return splitCubic; - } - static get splitPath() { - return splitPath; - } - static get transformPath() { - return transformPath; - } -} +export { default as distanceSquareRoot } from "./math/distanceSquareRoot"; +export { default as midPoint } from "./math/midPoint"; +export { default as rotateVector } from "./math/rotateVector"; +export { default as roundTo } from "./math/roundTo"; -export default SVGPathCommander; +export * from "./types"; +export * from "./interface"; -export { - CSSMatrix, - arcTools, - bezierTools, - cubicTools, - lineTools, - polygonTools, - quadTools, - pathToAbsolute, - pathToRelative, - pathToCurve, - pathToString, - distanceSquareRoot, - midPoint, - rotateVector, - roundTo, - parsePathString, - finalizeSegment, - invalidPathValue, - isArcCommand, - isDigit, - isDigitStart, - isMoveCommand, - isPathCommand, - isSpace, - paramsCount, - paramsParser, - pathParser, - scanFlag, - scanParam, - scanSegment, - skipSpaces, - distanceEpsilon, - getClosestPoint, - getDrawDirection, - getPathArea, - getPathBBox, - getPointAtLength, - getPropertiesAtLength, - getPropertiesAtPoint, - getSegmentAtLength, - getSegmentOfPoint, - getTotalLength, - isAbsoluteArray, - isCurveArray, - isNormalizedArray, - isPathArray, - isPointInStroke, - isRelativeArray, - isValidPath, - shapeParams, - shapeToPath, - shapeToPathArray, - absolutizeSegment, - arcToCubic, - getSVGMatrix, - iterate, - lineToCubic, - normalizePath, - normalizeSegment, - optimizePath, - projection2d, - quadToCubic, - relativizeSegment, - reverseCurve, - reversePath, - roundPath, - roundSegment, - segmentToCubic, - shortenSegment, - splitCubic, - splitPath, - transformPath, -}; +export { default as pathToAbsolute } from "./convert/pathToAbsolute"; +export { default as pathToRelative } from "./convert/pathToRelative"; +export { default as pathToCurve } from "./convert/pathToCurve"; +export { default as pathToString } from "./convert/pathToString"; + +export { default as parsePathString } from "./parser/parsePathString"; +export { default as finalizeSegment } from "./parser/finalizeSegment"; +export { default as invalidPathValue } from "./parser/invalidPathValue"; +export { default as isArcCommand } from "./parser/isArcCommand"; +export { default as isDigit } from "./parser/isDigit"; +export { default as isDigitStart } from "./parser/isDigitStart"; +export { default as isMoveCommand } from "./parser/isMoveCommand"; +export { default as isPathCommand } from "./parser/isPathCommand"; +export { default as isSpace } from "./parser/isSpace"; +export { default as paramsCount } from "./parser/paramsCount"; +export { default as paramsParser } from "./parser/paramsParser"; +export { default as pathParser } from "./parser/pathParser"; +export { default as scanFlag } from "./parser/scanFlag"; +export { default as scanParam } from "./parser/scanParam"; +export { default as scanSegment } from "./parser/scanSegment"; +export { default as skipSpaces } from "./parser/skipSpaces"; +export { default as getPathBBox } from "./util/getPathBBox"; +export { default as getTotalLength } from "./util/getTotalLength"; +export { default as distanceEpsilon } from "./util/distanceEpsilon"; +export { default as getClosestPoint } from "./util/getClosestPoint"; +export { default as getDrawDirection } from "./util/getDrawDirection"; +export { default as getPathArea } from "./util/getPathArea"; +export { default as getPointAtLength } from "./util/getPointAtLength"; +export { default as getPropertiesAtLength } from "./util/getPropertiesAtLength"; +export { default as getPropertiesAtPoint } from "./util/getPropertiesAtPoint"; +export { default as getSegmentAtLength } from "./util/getSegmentAtLength"; +export { default as getSegmentOfPoint } from "./util/getSegmentOfPoint"; +export { default as isAbsoluteArray } from "./util/isAbsoluteArray"; +export { default as isCurveArray } from "./util/isCurveArray"; +export { default as isNormalizedArray } from "./util/isNormalizedArray"; +export { default as isPathArray } from "./util/isPathArray"; +export { default as isPointInStroke } from "./util/isPointInStroke"; +export { default as isRelativeArray } from "./util/isRelativeArray"; +export { default as isValidPath } from "./util/isValidPath"; +export { default as shapeParams } from "./util/shapeParams"; +export { default as shapeToPath } from "./util/shapeToPath"; +export { default as shapeToPathArray } from "./util/shapeToPathArray"; +export { default as normalizePath } from "./process/normalizePath"; +export { default as optimizePath } from "./process/optimizePath"; +export { default as reversePath } from "./process/reversePath"; +export { default as splitPath } from "./process/splitPath"; +export { default as transformPath } from "./process/transformPath"; +export { default as absolutizeSegment } from "./process/absolutizeSegment"; +export { default as arcToCubic } from "./process/arcToCubic"; +export { default as getSVGMatrix } from "./process/getSVGMatrix"; +export { default as iterate } from "./process/iterate"; +export { default as lineToCubic } from "./process/lineToCubic"; +export { default as normalizeSegment } from "./process/normalizeSegment"; +export { default as projection2d } from "./process/projection2d"; +export { default as quadToCubic } from "./process/quadToCubic"; +export { default as relativizeSegment } from "./process/relativizeSegment"; +export { default as reverseCurve } from "./process/reverseCurve"; +export { default as roundPath } from "./process/roundPath"; +export { default as roundSegment } from "./process/roundSegment"; +export { default as segmentToCubic } from "./process/segmentToCubic"; +export { default as shortenSegment } from "./process/shortenSegment"; +export { default as splitCubic } from "./process/splitCubic"; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..7ae0f0f --- /dev/null +++ b/src/main.ts @@ -0,0 +1,597 @@ +"use strict"; +import CSSMatrix from "@thednp/dommatrix"; +import { arcTools } from "./math/arcTools"; +import { bezierTools } from "./math/bezier"; +import { cubicTools } from "./math/cubicTools"; +import { lineTools } from "./math/lineTools"; +import { quadTools } from "./math/quadTools"; +import { polygonTools } from "./math/polygonTools"; + +import distanceSquareRoot from "./math/distanceSquareRoot"; +import midPoint from "./math/midPoint"; +import rotateVector from "./math/rotateVector"; +import roundTo from "./math/roundTo"; + +import type { PathArray, PointTuple, TransformObjectValues } from "./types"; +import type { Options, TransformEntries, TransformObject } from "./interface"; +import defaultOptions from "./options/options"; + +import pathToAbsolute from "./convert/pathToAbsolute"; +import pathToRelative from "./convert/pathToRelative"; +import pathToCurve from "./convert/pathToCurve"; +import pathToString from "./convert/pathToString"; + +import error from "./parser/error"; +import parsePathString from "./parser/parsePathString"; +import finalizeSegment from "./parser/finalizeSegment"; +import invalidPathValue from "./parser/invalidPathValue"; +import isArcCommand from "./parser/isArcCommand"; +import isDigit from "./parser/isDigit"; +import isDigitStart from "./parser/isDigitStart"; +import isMoveCommand from "./parser/isMoveCommand"; +import isPathCommand from "./parser/isPathCommand"; +import isSpace from "./parser/isSpace"; +import paramsCount from "./parser/paramsCount"; +import paramsParser from "./parser/paramsParser"; +import pathParser from "./parser/pathParser"; +import scanFlag from "./parser/scanFlag"; +import scanParam from "./parser/scanParam"; +import scanSegment from "./parser/scanSegment"; +import skipSpaces from "./parser/skipSpaces"; +import getPathBBox from "./util/getPathBBox"; +import getTotalLength from "./util/getTotalLength"; +import distanceEpsilon from "./util/distanceEpsilon"; +import getClosestPoint from "./util/getClosestPoint"; +import getDrawDirection from "./util/getDrawDirection"; +import getPathArea from "./util/getPathArea"; +import getPointAtLength from "./util/getPointAtLength"; +import getPropertiesAtLength from "./util/getPropertiesAtLength"; +import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; +import getSegmentAtLength from "./util/getSegmentAtLength"; +import getSegmentOfPoint from "./util/getSegmentOfPoint"; +import isAbsoluteArray from "./util/isAbsoluteArray"; +import isCurveArray from "./util/isCurveArray"; +import isNormalizedArray from "./util/isNormalizedArray"; +import isPathArray from "./util/isPathArray"; +import isPointInStroke from "./util/isPointInStroke"; +import isRelativeArray from "./util/isRelativeArray"; +import isValidPath from "./util/isValidPath"; +import shapeParams from "./util/shapeParams"; +import shapeToPath from "./util/shapeToPath"; +import shapeToPathArray from "./util/shapeToPathArray"; +import normalizePath from "./process/normalizePath"; +import optimizePath from "./process/optimizePath"; +import reversePath from "./process/reversePath"; +import splitPath from "./process/splitPath"; +import transformPath from "./process/transformPath"; +import absolutizeSegment from "./process/absolutizeSegment"; +import arcToCubic from "./process/arcToCubic"; +import getSVGMatrix from "./process/getSVGMatrix"; +import iterate from "./process/iterate"; +import lineToCubic from "./process/lineToCubic"; +import normalizeSegment from "./process/normalizeSegment"; +import projection2d from "./process/projection2d"; +import quadToCubic from "./process/quadToCubic"; +import relativizeSegment from "./process/relativizeSegment"; +import reverseCurve from "./process/reverseCurve"; +import roundPath from "./process/roundPath"; +import roundSegment from "./process/roundSegment"; +import segmentToCubic from "./process/segmentToCubic"; +import shortenSegment from "./process/shortenSegment"; +import splitCubic from "./process/splitCubic"; +/** + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] + * + * @class + * @author thednp + * @returns a new SVGPathCommander instance + */ +class SVGPathCommander { + // declare class properties + declare segments: PathArray; + declare round: number | "off"; + declare origin: [number, number, number]; + + /** + * @constructor + * @param pathValue the path string + * @param config instance options + */ + constructor(pathValue: string, config?: Partial) { + const instanceOptions = config || {}; + const undefPath = typeof pathValue === "undefined"; + + if (undefPath || !pathValue.length) { + throw TypeError( + `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}` + ); + } + + this.segments = parsePathString(pathValue); + + // // set instance options.round + const { round: roundOption, origin: originOption } = instanceOptions; + let round: number | "off"; + + if (Number.isInteger(roundOption) || roundOption === "off") { + round = roundOption as number | "off"; + } else { + round = defaultOptions.round as number; + } + + // set instance options.origin + // the SVGPathCommander class will always override the default origin + let origin = defaultOptions.origin as [number, number, number]; + /* istanbul ignore else @preserve */ + if (Array.isArray(originOption) && originOption.length >= 2) { + const [originX, originY, originZ] = originOption.map(Number); + origin = [ + !Number.isNaN(originX) ? originX : 0, + !Number.isNaN(originY) ? originY : 0, + !Number.isNaN(originZ) ? originZ : 0, + ]; + } + + this.round = round; + this.origin = origin; + + return this; + } + get bbox() { + return getPathBBox(this.segments); + } + get length() { + return getTotalLength(this.segments); + } + + /** + * Returns the path bounding box, equivalent to native `path.getBBox()`. + * + * @public + * @returns the pathBBox + */ + getBBox() { + return this.bbox; + } + + /** + * Returns the total path length, equivalent to native `path.getTotalLength()`. + * + * @public + * @returns the path total length + */ + getTotalLength() { + return this.length; + } + + /** + * Returns an `{x,y}` point in the path stroke at a given length, + * equivalent to the native `path.getPointAtLength()`. + * + * @public + * @param length the length + * @returns the requested point + */ + getPointAtLength(length: number) { + return getPointAtLength(this.segments, length); + } + + /** + * Convert path to absolute values + * + * @public + */ + toAbsolute() { + const { segments } = this; + this.segments = pathToAbsolute(segments); + return this; + } + + /** + * Convert path to relative values + * + * @public + */ + toRelative() { + const { segments } = this; + this.segments = pathToRelative(segments); + return this; + } + + /** + * Convert path to cubic-bezier values. In addition, un-necessary `Z` + * segment is removed if previous segment extends to the `M` segment. + * + * @public + */ + toCurve() { + const { segments } = this; + this.segments = pathToCurve(segments); + return this; + } + + /** + * Reverse the order of the segments and their values. + * + * @param onlySubpath option to reverse all sub-paths except first + * @public + */ + reverse(onlySubpath?: boolean) { + const { segments } = this; + const split = splitPath(segments); + const subPath = split.length > 1 ? split : false; + + const absoluteMultiPath = subPath + ? subPath.map((x, i) => { + if (onlySubpath) { + return i ? reversePath(x) : x.slice(0); + } + return reversePath(x); + }) + : segments.slice(0); + + let path = [] as unknown as PathArray; + if (subPath) { + path = absoluteMultiPath.flat(1) as PathArray; + } else { + path = onlySubpath ? segments : reversePath(segments); + } + + this.segments = path.slice(0) as PathArray; + return this; + } + + /** + * Normalize path in 2 steps: + * * convert `pathArray`(s) to absolute values + * * convert shorthand notation to standard notation + * + * @public + */ + normalize() { + const { segments } = this; + this.segments = normalizePath(segments); + return this; + } + + /** + * Optimize `pathArray` values: + * * convert segments to absolute and/or relative values + * * select segments with shortest resulted string + * * round values to the specified `decimals` option value + * + * @public + */ + optimize() { + const { segments } = this; + const round = this.round === "off" ? 2 : this.round; + + this.segments = optimizePath(segments, round); + return this; + } + + /** + * Transform path using values from an `Object` defined as `transformObject`. + * + * @see TransformObject for a quick refference + * + * @param source a `transformObject`as described above + * @public + */ + transform(source?: Partial) { + if ( + !source || + typeof source !== "object" || + (typeof source === "object" && + !["translate", "rotate", "skew", "scale"].some((x) => x in source)) + ) { + return this; + } + + const { + segments, + origin: [cx, cy, cz], + } = this; + const transform = {} as TransformObjectValues; + for (const [k, v] of Object.entries(source) as TransformEntries) { + // istanbul ignore else @preserve + if (k === "skew" && Array.isArray(v)) { + transform[k] = v.map(Number) as PointTuple; + } else if ( + (k === "rotate" || + k === "translate" || + k === "origin" || + k === "scale") && + Array.isArray(v) + ) { + transform[k] = v.map(Number) as [number, number, number]; + } else if (k !== "origin" && typeof Number(v) === "number") { + transform[k] = Number(v); + } + } + + // if origin is not specified + // it's important that we have one + const { origin } = transform; + + if (Array.isArray(origin) && origin.length >= 2) { + const [originX, originY, originZ] = origin.map(Number); + transform.origin = [ + !Number.isNaN(originX) ? originX : cx, + !Number.isNaN(originY) ? originY : cy, + originZ || cz, + ]; + } else { + transform.origin = [cx, cy, cz]; + } + + this.segments = transformPath(segments, transform); + return this; + } + + /** + * Rotate path 180deg vertically + * + * @public + */ + flipX() { + const { cx, cy } = this.bbox; + this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] }); + return this; + } + + /** + * Rotate path 180deg horizontally + * + * @public + */ + flipY() { + const { cx, cy } = this.bbox; + this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] }); + return this; + } + + /** + * Export the current path to be used + * for the `d` (description) attribute. + * + * @public + * @return the path string + */ + toString() { + return pathToString(this.segments, this.round); + } + + /** + * Remove the instance. + * + * @public + * @return void + */ + dispose() { + Object.keys(this).forEach((key) => delete this[key as keyof typeof this]); + } + + static get CSSMatrix() { + return CSSMatrix; + } + static get arcTools() { + return arcTools; + } + static get bezierTools() { + return bezierTools; + } + + static get cubicTools() { + return cubicTools; + } + static get lineTools() { + return lineTools; + } + static get polygonTools() { + return polygonTools; + } + static get quadTools() { + return quadTools; + } + static get pathToAbsolute() { + return pathToAbsolute; + } + static get pathToRelative() { + return pathToRelative; + } + static get pathToCurve() { + return pathToCurve; + } + static get pathToString() { + return pathToString; + } + static get distanceSquareRoot() { + return distanceSquareRoot; + } + static get midPoint() { + return midPoint; + } + static get rotateVector() { + return rotateVector; + } + static get roundTo() { + return roundTo; + } + static get parsePathString() { + return parsePathString; + } + static get finalizeSegment() { + return finalizeSegment; + } + static get invalidPathValue() { + return invalidPathValue; + } + static get isArcCommand() { + return isArcCommand; + } + static get isDigit() { + return isDigit; + } + static get isDigitStart() { + return isDigitStart; + } + static get isMoveCommand() { + return isMoveCommand; + } + static get isPathCommand() { + return isPathCommand; + } + static get isSpace() { + return isSpace; + } + static get paramsCount() { + return paramsCount; + } + static get paramsParser() { + return paramsParser; + } + static get pathParser() { + return pathParser; + } + static get scanFlag() { + return scanFlag; + } + static get scanParam() { + return scanParam; + } + static get scanSegment() { + return scanSegment; + } + static get skipSpaces() { + return skipSpaces; + } + static get distanceEpsilon() { + return distanceEpsilon; + } + static get getClosestPoint() { + return getClosestPoint; + } + static get getDrawDirection() { + return getDrawDirection; + } + static get getPathArea() { + return getPathArea; + } + static get getPathBBox() { + return getPathBBox; + } + static get getPointAtLength() { + return getPointAtLength; + } + static get getPropertiesAtLength() { + return getPropertiesAtLength; + } + static get getPropertiesAtPoint() { + return getPropertiesAtPoint; + } + static get getSegmentAtLength() { + return getSegmentAtLength; + } + static get getSegmentOfPoint() { + return getSegmentOfPoint; + } + static get getTotalLength() { + return getTotalLength; + } + static get isAbsoluteArray() { + return isAbsoluteArray; + } + static get isCurveArray() { + return isCurveArray; + } + static get isNormalizedArray() { + return isNormalizedArray; + } + static get isPathArray() { + return isPathArray; + } + static get isPointInStroke() { + return isPointInStroke; + } + static get isRelativeArray() { + return isRelativeArray; + } + static get isValidPath() { + return isValidPath; + } + static get shapeParams() { + return shapeParams; + } + static get shapeToPath() { + return shapeToPath; + } + static get shapeToPathArray() { + return shapeToPathArray; + } + static get absolutizeSegment() { + return absolutizeSegment; + } + static get arcToCubic() { + return arcToCubic; + } + static get getSVGMatrix() { + return getSVGMatrix; + } + static get iterate() { + return iterate; + } + static get lineToCubic() { + return lineToCubic; + } + static get normalizePath() { + return normalizePath; + } + static get normalizeSegment() { + return normalizeSegment; + } + static get optimizePath() { + return optimizePath; + } + static get projection2d() { + return projection2d; + } + static get quadToCubic() { + return quadToCubic; + } + static get relativizeSegment() { + return relativizeSegment; + } + static get reverseCurve() { + return reverseCurve; + } + static get reversePath() { + return reversePath; + } + static get roundPath() { + return roundPath; + } + static get roundSegment() { + return roundSegment; + } + static get segmentToCubic() { + return segmentToCubic; + } + static get shortenSegment() { + return shortenSegment; + } + static get splitCubic() { + return splitCubic; + } + static get splitPath() { + return splitPath; + } + static get transformPath() { + return transformPath; + } +} + +export default SVGPathCommander; \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index cd68ab2..0c09f2e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,15 +26,15 @@ export default defineConfig({ emptyOutDir: false, outDir: 'dist', lib: { - entry: resolve(__dirname, 'src/index.ts'), + entry: resolve(__dirname, 'src/main.ts'), name: NAME, formats: ['iife'], fileName: (format: string) => fileName[format], - + }, sourcemap: true, reportCompressedSize: true, - + }, esbuild: { legalComments: 'none', From 6de16a1fa71f424aa1ad87a6902e8aec066cbbc7 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 16:44:02 +0200 Subject: [PATCH 2/4] build --- dist/svg-path-commander.cjs | 2 +- dist/svg-path-commander.cjs.map | 2 +- dist/svg-path-commander.d.cts | 1396 +++++++++++++++---------------- dist/svg-path-commander.d.ts | 1396 +++++++++++++++---------------- dist/svg-path-commander.js | 2 +- dist/svg-path-commander.js.map | 2 +- dist/svg-path-commander.mjs | 2 +- dist/svg-path-commander.mjs.map | 2 +- docs/svg-path-commander.js | 2 +- docs/svg-path-commander.js.map | 2 +- 10 files changed, 1404 insertions(+), 1404 deletions(-) diff --git a/dist/svg-path-commander.cjs b/dist/svg-path-commander.cjs index 2986fe9..e3ce8c9 100644 --- a/dist/svg-path-commander.cjs +++ b/dist/svg-path-commander.cjs @@ -1,2 +1,2 @@ -"use strict";var Gt=Object.create;var Ge=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Ft=Object.getPrototypeOf,Kt=Object.prototype.hasOwnProperty;var Jt=(t,e)=>{for(var n in e)Ge(t,n,{get:e[n],enumerable:!0})},kt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ut(e))!Kt.call(t,r)&&r!==n&&Ge(t,r,{get:()=>e[r],enumerable:!(o=_t(e,r))||o.enumerable});return t};var at=(t,e,n)=>(n=t!=null?Gt(Ft(t)):{},kt(e||!t||!t.__esModule?Ge(n,"default",{value:t,enumerable:!0}):n,t)),Wt=t=>kt(Ge({},"__esModule",{value:!0}),t);var xn={};Jt(xn,{CSSMatrix:()=>Rt.default,absolutizeSegment:()=>_,arcToCubic:()=>be,arcTools:()=>lt,bezierTools:()=>ft,cubicTools:()=>ht,default:()=>dn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>Se,getClosestPoint:()=>dt,getDrawDirection:()=>xt,getPathArea:()=>Oe,getPathBBox:()=>Xe,getPointAtLength:()=>me,getPropertiesAtLength:()=>ye,getPropertiesAtPoint:()=>Y,getSVGMatrix:()=>Ze,getSegmentAtLength:()=>St,getSegmentOfPoint:()=>At,getTotalLength:()=>K,invalidPathValue:()=>j,isAbsoluteArray:()=>Ie,isArcCommand:()=>qe,isCurveArray:()=>Ct,isDigit:()=>$,isDigitStart:()=>ke,isMoveCommand:()=>Qe,isNormalizedArray:()=>$e,isPathArray:()=>ee,isPathCommand:()=>Ve,isPointInStroke:()=>Tt,isRelativeArray:()=>Mt,isSpace:()=>Re,isValidPath:()=>je,iterate:()=>T,lineToCubic:()=>Ae,lineTools:()=>st,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>X,optimizePath:()=>et,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>We,pathToString:()=>Ce,polygonTools:()=>Pt,projection2d:()=>Me,quadToCubic:()=>De,quadTools:()=>yt,relativizeSegment:()=>he,reverseCurve:()=>vt,reversePath:()=>Te,rotateVector:()=>ne,roundPath:()=>Nt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>we,scanParam:()=>ze,scanSegment:()=>ge,segmentToCubic:()=>Ee,shapeParams:()=>te,shapeToPath:()=>Lt,shapeToPathArray:()=>Be,shortenSegment:()=>He,skipSpaces:()=>G,splitCubic:()=>wt,splitPath:()=>tt,transformPath:()=>rt});module.exports=Wt(xn);var Rt=at(require("@thednp/dommatrix"),1);var Xt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Xt;var Yt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=Yt;var le=(t,e,n,o)=>re([t,e],[n,o]),Le=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},_e=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},st={getLineBBox:_e,getLineLength:le,getPointAtLineLength:Le};var it=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},pe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},mt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Ue=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},B={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=mt({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=mt(ue,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let H=q+Q;return{center:B,startAngle:q,endAngle:H,rx:p,ry:h}},ve=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Ue(t,e,n,o,r,s,a,i,m);return it(u,c,f-l)},ut=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Ue(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=it(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Le(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},ct=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Ue(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,B=A(l,c*R),ue=B+y,q=[i],x=[m],Q=h(t,i),H=P(t,i),O=h(e,m),W=P(e,m),Pe=g-p*1e-5,ce=pe(b,d,c,l,C,Pe),N=g-p*.99999,D=pe(b,d,c,l,C,N);if(ce[0]>H||D[0]>H){let z=pe(b,d,c,l,C,w);q.push(z[0]),x.push(z[1])}if(ce[0]W||D[1]>W){let z=pe(b,d,c,l,C,B);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),H=P.apply([],q),W=P.apply([],x),[Q,O,H,W]},lt={angleBetween:mt,arcLength:it,arcPoint:pe,getArcBBox:ct,getArcLength:ve,getArcProps:Ue,getPointAtArcLength:ut};var pt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],qt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Qt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Et=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Ot=t=>{let n=pt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oDt(n[0],o))},It=1e-8,Ne=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]},ft={bezierLength:Ot,calculateBezier:Et,CBEZIER_MINMAX_EPSILON:It,computeBezier:Dt,Cvalues:qt,deriveBezier:Qt,getBezierLength:fe,minmaxC:Fe,minmaxQ:Ne,Tvalues:pt};var $t=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},de=(t,e,n,o,r,s,a,i)=>fe([t,e,n,o,r,s,a,i]),gt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=fe([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=$t([t,e,n,o,r,s,a,i],m/l))}return c},Ke=(t,e,n,o,r,s,a,i)=>{let m=Fe([t,n,r,a]),u=Fe([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},ht={getCubicBBox:Ke,getCubicLength:de,getPointAtCubicLength:gt,getPointAtCubicSegmentLength:$t};var jt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},xe=(t,e,n,o,r,s)=>fe([t,e,n,o,r,s]),bt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=fe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=jt([t,e,n,o,r,s],a/u))}return m},Je=(t,e,n,o,r,s)=>{let a=Ne([t,n,r]),i=Ne([e,o,s]);return[a[0],i[0],a[1],i[1]]},yt={getPointAtQuadLength:bt,getPointAtQuadSegmentLength:jt,getQuadBBox:Je,getQuadLength:xe};var er=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),Pt={polygonArea:er,polygonLength:tr};var rr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=rr;var nr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=nr;var or={origin:[0,0,0],round:4},I=or;var ar={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=ar;var sr=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Se=sr;var mr="SVGPathCommander Error",V=mr;var ir=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},we=ir;var ur=t=>t>=48&&t<=57,$=ur;var cr="Invalid path value",j=cr;var lr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${j} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!$(u)&&u!==46){t.err=`${V}: ${j} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Re=pr;var fr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ve=gr;var hr=t=>$(t)||t===43||t===45||t===46,ke=hr;var br=t=>(t|32)===97,qe=br;var yr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Qe=yr;var Pr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Ve(s)){t.err=`${V}: ${j} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Qe(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${j} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Se(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?we(t):ze(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!ke(n.charCodeAt(t.index)))break}Se(t)},ge=Pr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var dr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=Ar;var Cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,he)},We=Tr;var Bt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ne(c,l,-S),c=y.x,l=y.y,y=ne(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let nt=f*f,ot=g*g,Vt=(s===a?-1:1)*Math.sqrt(Math.abs((nt*ot-nt*D*D-ot*N*N)/(nt*D*D+ot*N*N)));C=Vt*f*D/g+(c+p)/2,R=Vt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Bt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),B=Math.cos(d),ue=Math.sin(d),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,H=[c,l],O=[c+x*v,l-Q*w],W=[p+x*ue,h-Q*B],Pe=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],Pe[0],Pe[1]].concat(A);A=[O[0],O[1],W[0],W[1],Pe[0],Pe[1]].concat(A);let ce=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},De=Mr;var Lr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ae=Lr;var vr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(be(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(De(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ae(a,i,r,s)):n==="Z"?["C"].concat(Ae(a,i,m,u)):t},Ee=vr;var Nr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=Nr;var wr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=wr;var zr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Ee(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ae=zr;var Rr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let B=n.toUpperCase(),q=B!==n?_(R,k,w,v):R.slice(0),x=B==="V"?["L",w,q[1]]:B==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(B)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=_e(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=ct(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,H=P*2-A;[l,f,g,p]=Ke(w,v,Q,H,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ke(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=Je(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=Je(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=_e(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},Xe=Vr;var kr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=le(p,h,y[1],y[2]);else if(m==="A")l+=ve(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=de(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=de(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=xe(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=xe(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=le(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},K=kr;var se=1e-5;var qr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=qr;var Qr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Le(r[0],r[1],r[2],r[3],e-p),f=le(r[0],r[1],r[2],r[3])):s==="A"?(l=ut(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=ve(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=gt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=de(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=bt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=le(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Qr;var Dr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},ye=Dr;var Er=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=c-a,f=me(o,p),P=s(f),h=c+a,g=me(o,h),S=s(g),p>=0&&PY(t,e).closest,dt=Or;var Ir=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,$r=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Ir(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Oe=$r;var jr=t=>Oe(ae(t))>=0,xt=jr;var Br=(t,e)=>ye(t,e).segment,St=Br;var Hr=(t,e)=>Y(t,e).segment,At=Hr;var Zr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Zr;var Gr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ie=Gr;var _r=t=>Ie(t)&&t.every(([e])=>"ACLMQZ".includes(e)),$e=_r;var Ur=t=>$e(t)&&t.every(([e])=>"MC".includes(e)),Ct=Ur;var Fr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Mt=Kr;var Jr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Ye=Xr;var Yr=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},en=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},rn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},nn=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},on=t=>{let e=Object.keys(te),n=Ye(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=tn(a):r==="ellipse"?i=rn(a):["polyline","polygon"].includes(r)?i=en(a):r==="rect"?i=nn(a):r==="line"?i=Yr(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Be=on;var an=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Ye(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Be(t),g=f&&f.length?Ce(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),je(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Lt=an;var sn=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},He=sn;var mn=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=mn;var un=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=He(m,f,r,i),P=ie(h,o),S=P.join(""),A=he(h,u,c,l),y=ie(A,o),b=y.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Te=cn;var ln=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},tt=ln;var Ht=at(require("@thednp/dommatrix"),1),pn=t=>{let e=new Ht.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ze=pn;var Zt=at(require("@thednp/dommatrix"),1),fn=(t,e)=>{let n=Zt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},gn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=fn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Me=gn;var hn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Ze(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(be(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Me(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},vt=bn;var yn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Nt=yn;var Pn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},wt=Pn;var zt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return Xe(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=We(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=tt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Te(i):i.slice(0):Te(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Te(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=et(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=rt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Ce(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Rt.default}static get arcTools(){return lt}static get bezierTools(){return ft}static get cubicTools(){return ht}static get lineTools(){return st}static get polygonTools(){return Pt}static get quadTools(){return yt}static get pathToAbsolute(){return oe}static get pathToRelative(){return We}static get pathToCurve(){return ae}static get pathToString(){return Ce}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Se}static get invalidPathValue(){return j}static get isArcCommand(){return qe}static get isDigit(){return $}static get isDigitStart(){return ke}static get isMoveCommand(){return Qe}static get isPathCommand(){return Ve}static get isSpace(){return Re}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return we}static get scanParam(){return ze}static get scanSegment(){return ge}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return dt}static get getDrawDirection(){return xt}static get getPathArea(){return Oe}static get getPathBBox(){return Xe}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return ye}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return St}static get getSegmentOfPoint(){return At}static get getTotalLength(){return K}static get isAbsoluteArray(){return Ie}static get isCurveArray(){return Ct}static get isNormalizedArray(){return $e}static get isPathArray(){return ee}static get isPointInStroke(){return Tt}static get isRelativeArray(){return Mt}static get isValidPath(){return je}static get shapeParams(){return te}static get shapeToPath(){return Lt}static get shapeToPathArray(){return Be}static get absolutizeSegment(){return _}static get arcToCubic(){return be}static get getSVGMatrix(){return Ze}static get iterate(){return T}static get lineToCubic(){return Ae}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return et}static get projection2d(){return Me}static get quadToCubic(){return De}static get relativizeSegment(){return he}static get reverseCurve(){return vt}static get reversePath(){return Te}static get roundPath(){return Nt}static get roundSegment(){return ie}static get segmentToCubic(){return Ee}static get shortenSegment(){return He}static get splitCubic(){return wt}static get splitPath(){return tt}static get transformPath(){return rt}},dn=zt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); +"use strict";var Ut=Object.create;var Je=Object.defineProperty;var Ft=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var Xt=(t,e)=>{for(var n in e)Je(t,n,{get:e[n],enumerable:!0})},Rt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Kt(e))!Wt.call(t,r)&&r!==n&&Je(t,r,{get:()=>e[r],enumerable:!(o=Ft(e,r))||o.enumerable});return t};var We=(t,e,n)=>(n=t!=null?Ut(Jt(t)):{},Rt(e||!t||!t.__esModule?Je(n,"default",{value:t,enumerable:!0}):n,t)),Yt=t=>Rt(Je({},"__esModule",{value:!0}),t);var An={};Xt(An,{CSSMatrix:()=>_t.default,absolutizeSegment:()=>Z,arcToCubic:()=>ce,arcTools:()=>tt,bezierTools:()=>nt,cubicTools:()=>at,default:()=>Sn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>ye,getClosestPoint:()=>ut,getDrawDirection:()=>lt,getPathArea:()=>Qe,getPathBBox:()=>_e,getPointAtLength:()=>me,getPropertiesAtLength:()=>pe,getPropertiesAtPoint:()=>X,getSVGMatrix:()=>$e,getSegmentAtLength:()=>ct,getSegmentOfPoint:()=>pt,getTotalLength:()=>K,invalidPathValue:()=>$,isAbsoluteArray:()=>De,isArcCommand:()=>Ve,isCurveArray:()=>ft,isDigit:()=>B,isDigitStart:()=>ze,isMoveCommand:()=>Re,isNormalizedArray:()=>Ee,isPathArray:()=>Y,isPathCommand:()=>we,isPointInStroke:()=>gt,isRelativeArray:()=>ht,isSpace:()=>Ne,isValidPath:()=>Oe,iterate:()=>T,lineToCubic:()=>Pe,lineTools:()=>Ye,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>W,optimizePath:()=>Ue,paramsCount:()=>j,paramsParser:()=>G,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>Ge,pathToString:()=>xe,polygonTools:()=>it,projection2d:()=>Ae,quadToCubic:()=>ke,quadTools:()=>mt,relativizeSegment:()=>le,reverseCurve:()=>yt,reversePath:()=>Se,rotateVector:()=>ne,roundPath:()=>Pt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>Le,scanParam:()=>ve,scanSegment:()=>ue,segmentToCubic:()=>qe,shapeParams:()=>ee,shapeToPath:()=>dt,shapeToPathArray:()=>Ie,shortenSegment:()=>Be,skipSpaces:()=>H,splitCubic:()=>xt,splitPath:()=>Fe,transformPath:()=>Ke});module.exports=Yt(An);var Zt=We(require("@thednp/dommatrix"),1);var er=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=er;var tr=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=tr;var he=(t,e,n,o)=>re([t,e],[n,o]),je=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Xe=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},Ye={getLineBBox:Xe,getLineLength:he,getPointAtLineLength:je};var Tt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},be=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},Ct=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},et=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,d=(e-m)/2,b={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},P=b.x**2/p**2+b.y**2/h**2;P>1&&(p*=f(P),h*=f(P));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,V=p**2*b.y**2+h**2*b.x**2,k=C/V;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},_={x:c(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+c(S)*v.y+(e+m)/2},fe={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=Ct({x:1,y:0},fe),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=Ct(fe,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let U=q+Q;return{center:_,startAngle:q,endAngle:U,rx:p,ry:h}},He=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=et(t,e,n,o,r,s,a,i,m);return Tt(u,l,f-c)},Mt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:g,startAngle:p,endAngle:h}=et(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let y=Tt(f,g,h-p);if(u<=0)l={x:t,y:e};else if(u>=y)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return je(t,e,i,m,u);let{PI:S,cos:A,sin:d}=Math,b=h-p,C=(r%360+360)%360*(S/180),V=p+b*(u/y),k=f*A(V),w=g*d(V);l={x:A(C)*k-d(C)*w+c.x,y:d(C)*k+A(C)*w+c.y}}}return l},Lt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:g}=et(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:b,y:P}=u,C=r*d/180,V=S(C),k=A(-c*V,l),w=k,v=k+d,_=A(c,l*V),fe=_+d,q=[i],x=[m],Q=h(t,i),U=y(t,i),O=h(e,m),te=y(e,m),Ce=g-p*1e-5,ge=be(b,P,l,c,C,Ce),N=g-p*.99999,D=be(b,P,l,c,C,N);if(ge[0]>U||D[0]>U){let z=be(b,P,l,c,C,w);q.push(z[0]),x.push(z[1])}if(ge[0]te||D[1]>te){let z=be(b,P,l,c,C,_);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),U=y.apply([],q),te=y.apply([],x),[Q,O,U,te]},tt={angleBetween:Ct,arcLength:Tt,arcPoint:be,getArcBBox:Lt,getArcLength:He,getArcProps:et,getPointAtArcLength:Mt};var vt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],kt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],qt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},Dt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Et=t=>{let n=vt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oQt(n[0],o))},Ot=1e-8,Ze=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]},nt={bezierLength:Et,calculateBezier:Dt,CBEZIER_MINMAX_EPSILON:Ot,computeBezier:Qt,Cvalues:kt,deriveBezier:qt,getBezierLength:de,minmaxC:rt,minmaxQ:Ze,Tvalues:vt};var It=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},Te=(t,e,n,o,r,s,a,i)=>de([t,e,n,o,r,s,a,i]),Nt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=de([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=It([t,e,n,o,r,s,a,i],m/c))}return l},ot=(t,e,n,o,r,s,a,i)=>{let m=rt([t,n,r,a]),u=rt([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},at={getCubicBBox:ot,getCubicLength:Te,getPointAtCubicLength:Nt,getPointAtCubicSegmentLength:It};var Bt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},Me=(t,e,n,o,r,s)=>de([t,e,n,o,r,s]),wt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=de([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Bt([t,e,n,o,r,s],a/u))}return m},st=(t,e,n,o,r,s)=>{let a=Ze([t,n,r]),i=Ze([e,o,s]);return[a[0],i[0],a[1],i[1]]},mt={getPointAtQuadLength:wt,getPointAtQuadSegmentLength:Bt,getQuadBBox:st,getQuadLength:Me};var rr=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),it={polygonArea:rr,polygonLength:nr};var or=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=or;var ar=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=ar;var sr={origin:[0,0,0],round:4},I=sr;var mr={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},j=mr;var ir=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=j[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,j[n]))),!!j[n]););},ye=ir;var ur="SVGPathCommander Error",R=ur;var lr=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},Le=lr;var cr=t=>t>=48&&t<=57,B=cr;var pr="Invalid path value",$=pr;var fr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${R}: ${$} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${R}: ${$} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ne=gr;var hr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},we=br;var dr=t=>B(t)||t===43||t===45||t===46,ze=dr;var yr=t=>(t|32)===97,Ve=yr;var Pr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Re=Pr;var xr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=j[n[o].toLowerCase()];if(t.segmentStart=o,!we(s)){t.err=`${R}: ${$} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Re(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${R}: ${$} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,H(t),t.data=[],!a){ye(t);return}for(;;){for(let m=a;m>0;m-=1){if(Ve(s)&&(m===3||m===4)?Le(t):ve(t),t.err.length)return;t.data.push(t.param),H(t),t.index=t.max||!ze(n.charCodeAt(t.index)))break}ye(t)},ue=xr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var Sr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(H(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=L(t);return T(e,Z)},oe=Tr;var Mr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,le)},Ge=Lr;var $t=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,g=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,b,P,C,V;if(u)[b,P,C,V]=u;else{d=ne(l,c,-S),l=d.x,c=d.y,d=ne(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,D=(c-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let St=f*f,At=g*g,Vt=(s===a?-1:1)*Math.sqrt(Math.abs((St*At-St*D*D-At*N*N)/(St*D*D+At*N*N)));C=Vt*f*D/g+(l+p)/2,V=Vt*-g*N/f+(c+h)/2,b=Math.asin(((c-V)/g*10**9>>0)/10**9),P=Math.asin(((h-V)/g*10**9>>0)/10**9),b=lP&&(b-=Math.PI*2),!a&&P>b&&(P-=Math.PI*2)}let k=P-b;if(Math.abs(k)>y){let N=P,D=p,z=h;P=b+y*(a&&P>b?1:-1),p=C+f*Math.cos(P),h=V+g*Math.sin(P),A=$t(p,h,f,g,r,0,a,D,z,[P,N,C,V])}k=P-b;let w=Math.cos(b),v=Math.sin(b),_=Math.cos(P),fe=Math.sin(P),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,U=[l,c],O=[l+x*v,c-Q*w],te=[p+x*fe,h-Q*_],Ce=[p,h];if(O[0]=2*U[0]-O[0],O[1]=2*U[1]-O[1],u)return[O[0],O[1],te[0],te[1],Ce[0],Ce[1]].concat(A);A=[O[0],O[1],te[0],te[1],Ce[0],Ce[1]].concat(A);let ge=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},ke=vr;var Nr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Pe=Nr;var wr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(ce(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(ke(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Pe(a,i,r,s)):n==="Z"?["C"].concat(Pe(a,i,m,u)):t},qe=wr;var zr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((g,p)=>g+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},W=zr;var Vr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},G=Vr;var Rr=t=>{let e={...G},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=W(o,e),m=qe(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ae=Rr;var kr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,g=0,p=0,h=0,y=0,S=0,A=0,d=0,b=0;T(e,(V,k,w,v)=>{[n]=V;let _=n.toUpperCase(),q=_!==n?Z(V,k,w,v):V.slice(0),x=_==="V"?["L",w,q[1]]:_==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(_)||(d=0,b=0);if(n==="M")[,o,r]=x,c=o,f=r,g=o,p=r;else if(n==="L")[c,f,g,p]=Xe(w,v,x[1],x[2]);else if(n==="A")[c,f,g,p]=Lt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,U=y*2-A;[c,f,g,p]=ot(w,v,Q,U,x[1],x[2],x[3],x[4])}else n==="C"?[c,f,g,p]=ot(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(d=h*2-d,b=y*2-b,[c,f,g,p]=st(w,v,d,b,x[1],x[2])):n==="Q"?(d=x[1],b=x[2],[c,f,g,p]=st(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([c,f,g,p]=Xe(w,v,o,r));i=a(c,i),m=a(f,m),u=s(g,u),l=s(p,l),[h,y]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,y]});let P=u-i,C=l-m;return{width:P,height:C,x:i,y:m,x2:u,y2:l,cx:i+P/2,cy:m+C/2,cz:Math.max(P,C)+Math.min(P,C)/2}},_e=qr;var Qr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return T(e,(f,g,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?Z(f,g,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(a=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=he(p,h,d[1],d[2]);else if(m==="A")c+=He(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let b=n*2-r,P=o*2-s;c+=Te(p,h,b,P,d[1],d[2],d[3],d[4])}else m==="C"?c+=Te(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=Me(p,h,a,i,d[1],d[2])):m==="Q"?(a=d[1],i=d[2],c+=Me(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=he(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,s]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o]}),c},K=Qr;var se=1e-5;var Dr=t=>{let e=L(t),n={...G};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=W(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Dr;var Er=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,g=c,p=0;return!l||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):s==="L"?(c=je(r[0],r[1],r[2],r[3],e-p),f=he(r[0],r[1],r[2],r[3])):s==="A"?(c=Mt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=He(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=Nt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=Te(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=wt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=Me(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=he(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Er;var Or=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},pe=Or;var Ir=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let P=b.x-e.x,C=b.y-e.y;return P*P+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=l-a,f=me(o,p),y=s(f),h=l+a,g=me(o,h),S=s(g),p>=0&&yX(t,e).closest,ut=Br;var $r=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,jr=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=$r(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Qe=jr;var Hr=t=>Qe(ae(t))>=0,lt=Hr;var Zr=(t,e)=>pe(t,e).segment,ct=Zr;var Gr=(t,e)=>X(t,e).segment,pt=Gr;var _r=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return j[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,Y=_r;var Ur=t=>Y(t)&&t.every(([e])=>e===e.toUpperCase()),De=Ur;var Fr=t=>De(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ee=Fr;var Kr=t=>Ee(t)&&t.every(([e])=>"MC".includes(e)),ft=Kr;var Jr=(t,e)=>{let{distance:n}=X(t,e);return Math.abs(n)Y(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),ht=Wr;var Xr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(H(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,bt=en;var tn=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},rn=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},on=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},an=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},sn=t=>{let e=Object.keys(ee),n=bt(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${R}: "${o}" is not SVGElement`);let r=n?o:t.type,s=ee[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=nn(a):r==="ellipse"?i=on(a):["polyline","polygon"].includes(r)?i=rn(a):r==="rect"?i=an(a):r==="line"?i=tn(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),Y(i)&&i.length?i:!1},Ie=sn;var mn=(t,e,n)=>{let o=n||document,r=Object.keys(ee),s=bt(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${R}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${R}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=ee[m],l={type:m},c=I.round,f=Ie(t),g=f&&f.length?xe(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p])})),Oe(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},dt=mn;var un=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:g}=n,[p,h]=i.slice(-2),y=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a)||M(m,a)===M(l*2-f,a)&&M(u,a)===M(c*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a))return["T",i[2],i[3]]}return y},Be=un;var ln=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=ln;var cn=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...G},s=[],a="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=W(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Be(m,f,r,i),y=ie(h,o),S=y.join(""),A=le(h,u,l,c),d=ie(A,o),b=d.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),y=a;switch(g){case"M":y=r?["Z"]:[g,p,h];break;case"A":y=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":c&&f==="S"?y=["S",a[1],a[2],p,h]:y=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[g,m[1],m[2],p,h];break;case"Q":c&&f==="T"?y=["T",p,h]:y=[g,a[1],a[2],p,h];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[g,p,h];break;case"Z":y=["M",p,h];break;case"H":y=[g,p];break;case"V":y=[g,h];break;default:y=[g].concat(a.slice(1,-2),p,h)}return y});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Se=pn;var fn=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...G};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),g=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=g?m.x:0):c==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},Fe=fn;var jt=We(require("@thednp/dommatrix"),1),gn=t=>{let e=new jt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},$e=gn;var Ht=We(require("@thednp/dommatrix"),1),hn=(t,e)=>{let n=Ht.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},bn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=hn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},Ae=bn;var dn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let c=e.origin,f=$e(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,y)=>{[m]=g;let S=m.toUpperCase(),d=S!==m?Z(g,p,h,y):g.slice(0),b=S==="A"?["C"].concat(ce(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=b[0];let P=m==="C"&&b.length>7,C=P?b.slice(0,7):b.slice(0);if(P&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Ae(f,[b[1],b[2]],c);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},yt=yn;var Pn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Pt=Pn;var xn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),l=E(i,m,n),c=E(m,u,n),f=E(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},xt=xn;var zt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${R}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return _e(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=Ge(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=Fe(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Se(i):i.slice(0):Se(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Se(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Ue(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=Ke(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return xe(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Zt.default}static get arcTools(){return tt}static get bezierTools(){return nt}static get cubicTools(){return at}static get lineTools(){return Ye}static get polygonTools(){return it}static get quadTools(){return mt}static get pathToAbsolute(){return oe}static get pathToRelative(){return Ge}static get pathToCurve(){return ae}static get pathToString(){return xe}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return ye}static get invalidPathValue(){return $}static get isArcCommand(){return Ve}static get isDigit(){return B}static get isDigitStart(){return ze}static get isMoveCommand(){return Re}static get isPathCommand(){return we}static get isSpace(){return Ne}static get paramsCount(){return j}static get paramsParser(){return G}static get pathParser(){return F}static get scanFlag(){return Le}static get scanParam(){return ve}static get scanSegment(){return ue}static get skipSpaces(){return H}static get distanceEpsilon(){return se}static get getClosestPoint(){return ut}static get getDrawDirection(){return lt}static get getPathArea(){return Qe}static get getPathBBox(){return _e}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return pe}static get getPropertiesAtPoint(){return X}static get getSegmentAtLength(){return ct}static get getSegmentOfPoint(){return pt}static get getTotalLength(){return K}static get isAbsoluteArray(){return De}static get isCurveArray(){return ft}static get isNormalizedArray(){return Ee}static get isPathArray(){return Y}static get isPointInStroke(){return gt}static get isRelativeArray(){return ht}static get isValidPath(){return Oe}static get shapeParams(){return ee}static get shapeToPath(){return dt}static get shapeToPathArray(){return Ie}static get absolutizeSegment(){return Z}static get arcToCubic(){return ce}static get getSVGMatrix(){return $e}static get iterate(){return T}static get lineToCubic(){return Pe}static get normalizePath(){return J}static get normalizeSegment(){return W}static get optimizePath(){return Ue}static get projection2d(){return Ae}static get quadToCubic(){return ke}static get relativizeSegment(){return le}static get reverseCurve(){return yt}static get reversePath(){return Se}static get roundPath(){return Pt}static get roundSegment(){return ie}static get segmentToCubic(){return qe}static get shortenSegment(){return Be}static get splitCubic(){return xt}static get splitPath(){return Fe}static get transformPath(){return Ke}},Gt=zt;var _t=We(require("@thednp/dommatrix"),1),Sn=Gt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); //# sourceMappingURL=svg-path-commander.cjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index a0101a3..b777359 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","CSSMatrix","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index d8c3d58..38c5a07 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -307,167 +307,6 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -declare const arcTools: { - angleBetween: (v0: Point, v1: Point) => number; - arcLength: (rx: number, ry: number, theta: number) => number; - arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; - getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; - getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { - x: number; - y: number; - }; - }; - getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; - }; -}; - -declare const bezierTools: { - bezierLength: (derivativeFn: DeriveCallback) => number; - calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; - CBEZIER_MINMAX_EPSILON: number; - computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; - Cvalues: number[]; - deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; - getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; - minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; - Tvalues: number[]; -}; - -declare const cubicTools: { - getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; - getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; - getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; - }; -}; - -declare const lineTools: { - getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; - getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; - getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; -}; - -declare const quadTools: { - getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; - getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; - }; - getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -}; - -declare const polygonTools: { - polygonArea: (polygon: PointTuple[]) => number; - polygonLength: (polygon: PointTuple[]) => number; -}; - -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to absolute values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with absolute values - */ -declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to relative values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with relative values - */ -declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; - -/** - * Parses a path string value or 'pathArray' and returns a new one - * in which all segments are converted to cubic-bezier. - * - * In addition, un-necessary `Z` segment is removed if previous segment - * extends to the `M` segment. - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the resulted `pathArray` converted to cubic-bezier - */ -declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; - -/** - * Returns a valid `d` attribute string value created - * by rounding values and concatenating the `pathArray` segments. - * - * @param path the `pathArray` object - * @param roundOption amount of decimals to round values to - * @returns the concatenated path string - */ -declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; - -/** - * Parses a path string value and returns an array - * of segments we like to call `pathArray`. - * - * @param pathInput the string to be parsed - * @returns the resulted `pathArray` or error string - */ -declare const parsePathString: (pathInput: string | T) => PathArray; - /** * The `PathParser` is used by the `parsePathString` static method * to generate a `pathArray`. @@ -487,544 +326,14 @@ declare class PathParser { } /** - * Breaks the parsing of a pathString once a segment is finalized. - * - * @param path the `PathParser` instance - */ -declare const finalizeSegment: (path: PathParser) => void; - -declare const invalidPathValue = "Invalid path value"; - -/** - * Checks if the character is an A (arc-to) path command. - * - * @param code the character to check - * @returns check result - */ -declare const isArcCommand: (code: number) => code is 97; - -/** - * Checks if a character is a digit. - * - * @param code the character to check - * @returns check result - */ -declare const isDigit: (code: number) => code is DigitNumber; - -/** - * Checks if the character is or belongs to a number. - * [0-9]|+|-|. - * - * @param code the character to check - * @returns check result - */ -declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; - -/** - * Checks if the character is a MoveTo command. - * - * @param code the character to check - * @returns check result - */ -declare const isMoveCommand: (code: number) => code is 109 | 77; - -/** - * Checks if the character is a path command. - * - * @param code the character to check - * @returns check result - */ -declare const isPathCommand: (code: number) => code is PathCommandNumber; - -/** - * Checks if the character is a space. - * - * @param ch the character to check - * @returns check result - */ -declare const isSpace: (ch: number) => ch is SpaceNumber; - -/** Segment params length */ -declare const paramsCount: { - a: number; - c: number; - h: number; - l: number; - m: number; - r: number; - q: number; - s: number; - t: number; - v: number; - z: number; -}; - -declare const paramsParser: ParserParams; - -/** - * Validates an A (arc-to) specific path command value. - * Usually a `large-arc-flag` or `sweep-flag`. - * - * @param path the `PathParser` instance - */ -declare const scanFlag: (path: PathParser) => void; - -/** - * Validates every character of the path string, - * every path command, negative numbers or floating point numbers. + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] * - * @param path the `PathParser` instance - */ -declare const scanParam: (path: PathParser) => void; - -/** - * Scans every character in the path string to determine - * where a segment starts and where it ends. - * - * @param path the `PathParser` instance - */ -declare const scanSegment: (path: PathParser) => void; - -/** - * Points the parser to the next character in the - * path string every time it encounters any kind of - * space character. - * - * @param path the `PathParser` instance - */ -declare const skipSpaces: (path: PathParser) => void; - -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - -declare const DISTANCE_EPSILON = 0.00001; - -/** - * Returns the point in path closest to a given point. - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the best match - */ -declare const getClosestPoint: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => { - x: number; - y: number; -}; - -/** - * Check if a path is drawn clockwise and returns true if so, - * false otherwise. - * - * @param path the path string or `pathArray` - * @returns true when clockwise or false if not - */ -declare const getDrawDirection: (path: string | PathArray) => boolean; - -/** - * Returns the area of a shape. - * - * @author Jürg Lehni & Jonathan Puckey - * - * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js - * - * @param path the shape `pathArray` - * @returns the length of the cubic-bezier segment - */ -declare const getPathArea: (path: PathArray) => number; - -/** - * Returns [x,y] coordinates of a point at a given length of a shape. - * - * @param pathInput the `pathArray` to look into - * @param distance the length of the shape to look at - * @returns the requested {x, y} point coordinates - */ -declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { - x: number; - y: number; -}; - -/** - * Returns the segment, its index and length as well as - * the length to that segment at a given length in a path. - * - * @param pathInput target `pathArray` - * @param distance the given length - * @returns the requested properties - */ -declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; - -/** - * Returns the point and segment in path closest to a given point as well as - * the distance to the path stroke. - * - * @see https://bl.ocks.org/mbostock/8027637 - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the requested properties - */ -declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; - -/** - * Returns the segment at a given length. - * - * @param pathInput the target `pathArray` - * @param distance the distance in path to look at - * @returns the requested segment - */ -declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; - -/** - * Returns the path segment which contains a given point. - * - * @param path the `pathArray` to look into - * @param point the point of the shape to look for - * @returns the requested segment - */ -declare const getSegmentOfPoint: (path: string | PathArray, point: { - x: number; - y: number; -}) => SegmentProperties | undefined; - -/** - * Iterates an array to check if it's a `pathArray` - * with all absolute values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all C (cubic bezier) segments. - * - * @param path the `Array` to be checked - * @returns iteration result - */ -declare const isCurveArray: (path: unknown) => path is CurveArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all segments are in non-shorthand notation - * with absolute values. - * - * @param {string | SVGPath.pathArray} path the `pathArray` to be checked - * @returns {boolean} iteration result - */ -declare const isNormalizedArray: (path: unknown) => path is NormalArray; - -/** - * Iterates an array to check if it's an actual `pathArray`. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isPathArray: (path: unknown) => path is PathArray; - -/** - * Checks if a given point is in the stroke of a path. - * - * @param pathInput target path - * @param point the given `{x,y}` point - * @returns the query result - */ -declare const isPointInStroke: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => boolean; - -/** - * Iterates an array to check if it's a `pathArray` - * with relative values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isRelativeArray: (path: unknown) => path is RelativeArray; - -/** - * Parses a path string value to determine its validity - * then returns true if it's valid or false otherwise. - * - * @param pathString the path string to be parsed - * @returns the path string validity - */ -declare const isValidPath: (pathString: string) => boolean; - -/** - * Supported shapes and their specific parameters. - */ -declare const shapeParams: ShapeParams; - -/** - * Returns a new `` element created from attributes of a ``, ``, - * ``, ``, ``, `` or ``. If `replace` parameter - * is `true`, it will replace the target. The default `ownerDocument` is your current - * `document` browser page, if you want to use in server-side using `jsdom`, you can - * pass the `jsdom` `document` to `ownDocument`. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * The newly created `` element keeps all non-specific - * attributes like `class`, `fill`, etc. - * - * @param element target shape - * @param replace option to replace target - * @param ownerDocument document for create element - * @return the newly created `` element - */ -declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; - -/** - * Returns a new `pathArray` created from attributes of a ``, ``, - * ``, ``, ``, ``, or ``. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * @param element target shape - * @return the newly created `` element - */ -declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; - -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -/** - * Returns an absolute segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the absolute segment - */ -declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; - -/** - * Converts A (arc-to) segments to C (cubic-bezier-to). - * - * For more information of where this math came from visit: - * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - * - * @param X1 the starting x position - * @param Y1 the starting y position - * @param RX x-radius of the arc - * @param RY y-radius of the arc - * @param angle x-axis-rotation of the arc - * @param LAF large-arc-flag of the arc - * @param SF sweep-flag of the arc - * @param X2 the ending x position - * @param Y2 the ending y position - * @param recursive the parameters needed to split arc into 2 segments - * @return the resulting cubic-bezier segment(s) - */ -declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; - -/** - * Returns a transformation matrix to apply to `` elements. - * - * @see TransformObjectValues - * - * @param transform the `transformObject` - * @returns a new transformation matrix - */ -declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; - -declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; - -/** - * Converts an L (line-to) segment to C (cubic-bezier). - * - * @param x1 line start x - * @param y1 line start y - * @param x2 line end x - * @param y2 line end y - * @returns the cubic-bezier segment - */ -declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; - -/** - * Normalizes a single segment of a `pathArray` object. - * - * @param segment the segment object - * @param params the normalization parameters - * @returns the normalized segment - */ -declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; - -/** - * Returns the [x,y] projected coordinates for a given an [x,y] point - * and an [x,y,z] perspective origin point. - * - * Equation found here => - * http://en.wikipedia.org/wiki/3D_projection#Diagram - * Details => - * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel - * - * @param m the transformation matrix - * @param point2D the initial [x,y] coordinates - * @param origin the [x,y,z] transform origin - * @returns the projected [x,y] coordinates - */ -declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; - -/** - * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). - * - * @param x1 curve start x - * @param y1 curve start y - * @param qx control point x - * @param qy control point y - * @param x2 curve end x - * @param y2 curve end y - * @returns the cubic-bezier segment - */ -declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; - -/** - * Returns a relative segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the relative segment - */ -declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; - -/** - * Reverses all segments of a `pathArray` - * which consists of only C (cubic-bezier) path commands. - * - * @param path the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reverseCurve: (path: CurveArray) => CurveArray; - -/** - * Rounds the values of a `pathArray` instance to - * a specified amount of decimals and returns it. - * - * @param path the source `pathArray` - * @param roundOption the amount of decimals to round numbers to - * @returns the resulted `pathArray` with rounded values - */ -declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; - -declare const roundSegment: (segment: T, roundOption: number) => T; - -/** - * Converts any segment to C (cubic-bezier). - * - * @param segment the source segment - * @param params the source segment parameters - * @returns the cubic-bezier segment - */ -declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; - -/** - * Shorten a single segment of a `pathArray` object. - * - * @param segment the `absoluteSegment` object - * @param normalSegment the `normalSegment` object - * @param params the coordinates of the previous segment - * @param prevCommand the path command of the previous segment - * @returns the shortened segment - */ -declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; - -/** - * Split a cubic-bezier segment into two. - * - * @param pts the cubic-bezier parameters - * @param ratio the cubic-bezier parameters - * @return two new cubic-bezier segments - */ -declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; - -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance + * @class + * @author thednp + * @returns a new SVGPathCommander instance */ declare class SVGPathCommander { segments: PathArray; @@ -1340,4 +649,695 @@ declare class SVGPathCommander { static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; } +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; +}; + +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; +}; + +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; + +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; + +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { + x: number; + y: number; +}; + +declare const roundTo: (n: number, round: number) => number; + +/** + * Parses a path string value or object and returns an array + * of segments, all converted to absolute values. + * + * @param pathInput the path string | object + * @returns the resulted `pathArray` with absolute values + */ +declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; + +/** + * Parses a path string value or object and returns an array + * of segments, all converted to relative values. + * + * @param pathInput the path string | object + * @returns the resulted `pathArray` with relative values + */ +declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; + +/** + * Parses a path string value or 'pathArray' and returns a new one + * in which all segments are converted to cubic-bezier. + * + * In addition, un-necessary `Z` segment is removed if previous segment + * extends to the `M` segment. + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the resulted `pathArray` converted to cubic-bezier + */ +declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; + +/** + * Returns a valid `d` attribute string value created + * by rounding values and concatenating the `pathArray` segments. + * + * @param path the `pathArray` object + * @param roundOption amount of decimals to round values to + * @returns the concatenated path string + */ +declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; + +/** + * Parses a path string value and returns an array + * of segments we like to call `pathArray`. + * + * @param pathInput the string to be parsed + * @returns the resulted `pathArray` or error string + */ +declare const parsePathString: (pathInput: string | T) => PathArray; + +/** + * Breaks the parsing of a pathString once a segment is finalized. + * + * @param path the `PathParser` instance + */ +declare const finalizeSegment: (path: PathParser) => void; + +declare const invalidPathValue = "Invalid path value"; + +/** + * Checks if the character is an A (arc-to) path command. + * + * @param code the character to check + * @returns check result + */ +declare const isArcCommand: (code: number) => code is 97; + +/** + * Checks if a character is a digit. + * + * @param code the character to check + * @returns check result + */ +declare const isDigit: (code: number) => code is DigitNumber; + +/** + * Checks if the character is or belongs to a number. + * [0-9]|+|-|. + * + * @param code the character to check + * @returns check result + */ +declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; + +/** + * Checks if the character is a MoveTo command. + * + * @param code the character to check + * @returns check result + */ +declare const isMoveCommand: (code: number) => code is 109 | 77; + +/** + * Checks if the character is a path command. + * + * @param code the character to check + * @returns check result + */ +declare const isPathCommand: (code: number) => code is PathCommandNumber; + +/** + * Checks if the character is a space. + * + * @param ch the character to check + * @returns check result + */ +declare const isSpace: (ch: number) => ch is SpaceNumber; + +/** Segment params length */ +declare const paramsCount: { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; +}; + +declare const paramsParser: ParserParams; + +/** + * Validates an A (arc-to) specific path command value. + * Usually a `large-arc-flag` or `sweep-flag`. + * + * @param path the `PathParser` instance + */ +declare const scanFlag: (path: PathParser) => void; + +/** + * Validates every character of the path string, + * every path command, negative numbers or floating point numbers. + * + * @param path the `PathParser` instance + */ +declare const scanParam: (path: PathParser) => void; + +/** + * Scans every character in the path string to determine + * where a segment starts and where it ends. + * + * @param path the `PathParser` instance + */ +declare const scanSegment: (path: PathParser) => void; + +/** + * Points the parser to the next character in the + * path string every time it encounters any kind of + * space character. + * + * @param path the `PathParser` instance + */ +declare const skipSpaces: (path: PathParser) => void; + +declare const getPathBBox: (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; + +/** + * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. + * + * @param pathInput the target `pathArray` + * @returns the shape total length + */ +declare const getTotalLength: (pathInput: string | PathArray) => number; + +declare const DISTANCE_EPSILON = 0.00001; + +/** + * Returns the point in path closest to a given point. + * + * @param pathInput target `pathArray` + * @param point the given point + * @returns the best match + */ +declare const getClosestPoint: (pathInput: string | PathArray, point: { + x: number; + y: number; +}) => { + x: number; + y: number; +}; + +/** + * Check if a path is drawn clockwise and returns true if so, + * false otherwise. + * + * @param path the path string or `pathArray` + * @returns true when clockwise or false if not + */ +declare const getDrawDirection: (path: string | PathArray) => boolean; + +/** + * Returns the area of a shape. + * + * @author Jürg Lehni & Jonathan Puckey + * + * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js + * + * @param path the shape `pathArray` + * @returns the length of the cubic-bezier segment + */ +declare const getPathArea: (path: PathArray) => number; + +/** + * Returns [x,y] coordinates of a point at a given length of a shape. + * + * @param pathInput the `pathArray` to look into + * @param distance the length of the shape to look at + * @returns the requested {x, y} point coordinates + */ +declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; +}; + +/** + * Returns the segment, its index and length as well as + * the length to that segment at a given length in a path. + * + * @param pathInput target `pathArray` + * @param distance the given length + * @returns the requested properties + */ +declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; + +/** + * Returns the point and segment in path closest to a given point as well as + * the distance to the path stroke. + * + * @see https://bl.ocks.org/mbostock/8027637 + * + * @param pathInput target `pathArray` + * @param point the given point + * @returns the requested properties + */ +declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; + +/** + * Returns the segment at a given length. + * + * @param pathInput the target `pathArray` + * @param distance the distance in path to look at + * @returns the requested segment + */ +declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + +/** + * Returns the path segment which contains a given point. + * + * @param path the `pathArray` to look into + * @param point the point of the shape to look for + * @returns the requested segment + */ +declare const getSegmentOfPoint: (path: string | PathArray, point: { + x: number; + y: number; +}) => SegmentProperties | undefined; + +/** + * Iterates an array to check if it's a `pathArray` + * with all absolute values. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; + +/** + * Iterates an array to check if it's a `pathArray` + * with all C (cubic bezier) segments. + * + * @param path the `Array` to be checked + * @returns iteration result + */ +declare const isCurveArray: (path: unknown) => path is CurveArray; + +/** + * Iterates an array to check if it's a `pathArray` + * with all segments are in non-shorthand notation + * with absolute values. + * + * @param {string | SVGPath.pathArray} path the `pathArray` to be checked + * @returns {boolean} iteration result + */ +declare const isNormalizedArray: (path: unknown) => path is NormalArray; + +/** + * Iterates an array to check if it's an actual `pathArray`. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isPathArray: (path: unknown) => path is PathArray; + +/** + * Checks if a given point is in the stroke of a path. + * + * @param pathInput target path + * @param point the given `{x,y}` point + * @returns the query result + */ +declare const isPointInStroke: (pathInput: string | PathArray, point: { + x: number; + y: number; +}) => boolean; + +/** + * Iterates an array to check if it's a `pathArray` + * with relative values. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isRelativeArray: (path: unknown) => path is RelativeArray; + +/** + * Parses a path string value to determine its validity + * then returns true if it's valid or false otherwise. + * + * @param pathString the path string to be parsed + * @returns the path string validity + */ +declare const isValidPath: (pathString: string) => boolean; + +/** + * Supported shapes and their specific parameters. + */ +declare const shapeParams: ShapeParams; + +/** + * Returns a new `` element created from attributes of a ``, ``, + * ``, ``, ``, `` or ``. If `replace` parameter + * is `true`, it will replace the target. The default `ownerDocument` is your current + * `document` browser page, if you want to use in server-side using `jsdom`, you can + * pass the `jsdom` `document` to `ownDocument`. + * + * It can also work with an options object, see the type below + * @see ShapeOps + * + * The newly created `` element keeps all non-specific + * attributes like `class`, `fill`, etc. + * + * @param element target shape + * @param replace option to replace target + * @param ownerDocument document for create element + * @return the newly created `` element + */ +declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + +/** + * Returns a new `pathArray` created from attributes of a ``, ``, + * ``, ``, ``, ``, or ``. + * + * It can also work with an options object, see the type below + * @see ShapeOps + * + * @param element target shape + * @return the newly created `` element + */ +declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; + +/** + * Normalizes a `pathArray` object for further processing: + * * convert segments to absolute values + * * convert shorthand path commands to their non-shorthand notation + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the normalized `pathArray` + */ +declare const normalizePath: (pathInput: string | PathArray) => NormalArray; + +/** + * Optimizes a `pathArray` object: + * * convert segments to shorthand if possible + * * select shortest segments from absolute and relative `pathArray`s + * + * @param pathInput a string or `pathArray` + * @param roundOption the amount of decimals to round values to + * @returns the optimized `pathArray` + */ +declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; + +/** + * Reverses all segments of a `pathArray` and returns a new `pathArray` instance + * with absolute values. + * + * @param pathInput the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reversePath: (pathInput: PathArray) => PathArray; + +/** + * Split a path into an `Array` of sub-path strings. + * + * In the process, values are converted to absolute + * for visual consistency. + * + * @param pathInput the source `pathArray` + * @return an array with all sub-path strings + */ +declare const splitPath: (pathInput: PathArray) => PathArray[]; + +/** + * Apply a 2D / 3D transformation to a `pathArray` instance. + * + * Since *SVGElement* doesn't support 3D transformation, this function + * creates a 2D projection of the element. + * + * @param path the `pathArray` to apply transformation + * @param transform the transform functions `Object` + * @returns the resulted `pathArray` + */ +declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; + +/** + * Returns an absolute segment of a `PathArray` object. + * + * @param segment the segment object + * @param index the segment index + * @param lastX the last known X value + * @param lastY the last known Y value + * @returns the absolute segment + */ +declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + +/** + * Converts A (arc-to) segments to C (cubic-bezier-to). + * + * For more information of where this math came from visit: + * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + * + * @param X1 the starting x position + * @param Y1 the starting y position + * @param RX x-radius of the arc + * @param RY y-radius of the arc + * @param angle x-axis-rotation of the arc + * @param LAF large-arc-flag of the arc + * @param SF sweep-flag of the arc + * @param X2 the ending x position + * @param Y2 the ending y position + * @param recursive the parameters needed to split arc into 2 segments + * @return the resulting cubic-bezier segment(s) + */ +declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + +/** + * Returns a transformation matrix to apply to `` elements. + * + * @see TransformObjectValues + * + * @param transform the `transformObject` + * @returns a new transformation matrix + */ +declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; + +declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; + +/** + * Converts an L (line-to) segment to C (cubic-bezier). + * + * @param x1 line start x + * @param y1 line start y + * @param x2 line end x + * @param y2 line end y + * @returns the cubic-bezier segment + */ +declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; + +/** + * Normalizes a single segment of a `pathArray` object. + * + * @param segment the segment object + * @param params the normalization parameters + * @returns the normalized segment + */ +declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; + +/** + * Returns the [x,y] projected coordinates for a given an [x,y] point + * and an [x,y,z] perspective origin point. + * + * Equation found here => + * http://en.wikipedia.org/wiki/3D_projection#Diagram + * Details => + * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel + * + * @param m the transformation matrix + * @param point2D the initial [x,y] coordinates + * @param origin the [x,y,z] transform origin + * @returns the projected [x,y] coordinates + */ +declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + +/** + * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). + * + * @param x1 curve start x + * @param y1 curve start y + * @param qx control point x + * @param qy control point y + * @param x2 curve end x + * @param y2 curve end y + * @returns the cubic-bezier segment + */ +declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + +/** + * Returns a relative segment of a `PathArray` object. + * + * @param segment the segment object + * @param index the segment index + * @param lastX the last known X value + * @param lastY the last known Y value + * @returns the relative segment + */ +declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + +/** + * Reverses all segments of a `pathArray` + * which consists of only C (cubic-bezier) path commands. + * + * @param path the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reverseCurve: (path: CurveArray) => CurveArray; + +/** + * Rounds the values of a `pathArray` instance to + * a specified amount of decimals and returns it. + * + * @param path the source `pathArray` + * @param roundOption the amount of decimals to round numbers to + * @returns the resulted `pathArray` with rounded values + */ +declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; + +declare const roundSegment: (segment: T, roundOption: number) => T; + +/** + * Converts any segment to C (cubic-bezier). + * + * @param segment the source segment + * @param params the source segment parameters + * @returns the cubic-bezier segment + */ +declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + +/** + * Shorten a single segment of a `pathArray` object. + * + * @param segment the `absoluteSegment` object + * @param normalSegment the `normalSegment` object + * @param params the coordinates of the previous segment + * @param prevCommand the path command of the previous segment + * @returns the shortened segment + */ +declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + +/** + * Split a cubic-bezier segment into two. + * + * @param pts the cubic-bezier parameters + * @param ratio the cubic-bezier parameters + * @return two new cubic-bezier segments + */ +declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index d8c3d58..38c5a07 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -307,167 +307,6 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -declare const arcTools: { - angleBetween: (v0: Point, v1: Point) => number; - arcLength: (rx: number, ry: number, theta: number) => number; - arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; - getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; - getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { - x: number; - y: number; - }; - }; - getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; - }; -}; - -declare const bezierTools: { - bezierLength: (derivativeFn: DeriveCallback) => number; - calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; - CBEZIER_MINMAX_EPSILON: number; - computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; - Cvalues: number[]; - deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; - getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; - minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; - Tvalues: number[]; -}; - -declare const cubicTools: { - getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; - getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; - getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; - }; -}; - -declare const lineTools: { - getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; - getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; - getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; -}; - -declare const quadTools: { - getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; - }; - getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; - }; - getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -}; - -declare const polygonTools: { - polygonArea: (polygon: PointTuple[]) => number; - polygonLength: (polygon: PointTuple[]) => number; -}; - -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to absolute values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with absolute values - */ -declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to relative values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with relative values - */ -declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; - -/** - * Parses a path string value or 'pathArray' and returns a new one - * in which all segments are converted to cubic-bezier. - * - * In addition, un-necessary `Z` segment is removed if previous segment - * extends to the `M` segment. - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the resulted `pathArray` converted to cubic-bezier - */ -declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; - -/** - * Returns a valid `d` attribute string value created - * by rounding values and concatenating the `pathArray` segments. - * - * @param path the `pathArray` object - * @param roundOption amount of decimals to round values to - * @returns the concatenated path string - */ -declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; - -/** - * Parses a path string value and returns an array - * of segments we like to call `pathArray`. - * - * @param pathInput the string to be parsed - * @returns the resulted `pathArray` or error string - */ -declare const parsePathString: (pathInput: string | T) => PathArray; - /** * The `PathParser` is used by the `parsePathString` static method * to generate a `pathArray`. @@ -487,544 +326,14 @@ declare class PathParser { } /** - * Breaks the parsing of a pathString once a segment is finalized. - * - * @param path the `PathParser` instance - */ -declare const finalizeSegment: (path: PathParser) => void; - -declare const invalidPathValue = "Invalid path value"; - -/** - * Checks if the character is an A (arc-to) path command. - * - * @param code the character to check - * @returns check result - */ -declare const isArcCommand: (code: number) => code is 97; - -/** - * Checks if a character is a digit. - * - * @param code the character to check - * @returns check result - */ -declare const isDigit: (code: number) => code is DigitNumber; - -/** - * Checks if the character is or belongs to a number. - * [0-9]|+|-|. - * - * @param code the character to check - * @returns check result - */ -declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; - -/** - * Checks if the character is a MoveTo command. - * - * @param code the character to check - * @returns check result - */ -declare const isMoveCommand: (code: number) => code is 109 | 77; - -/** - * Checks if the character is a path command. - * - * @param code the character to check - * @returns check result - */ -declare const isPathCommand: (code: number) => code is PathCommandNumber; - -/** - * Checks if the character is a space. - * - * @param ch the character to check - * @returns check result - */ -declare const isSpace: (ch: number) => ch is SpaceNumber; - -/** Segment params length */ -declare const paramsCount: { - a: number; - c: number; - h: number; - l: number; - m: number; - r: number; - q: number; - s: number; - t: number; - v: number; - z: number; -}; - -declare const paramsParser: ParserParams; - -/** - * Validates an A (arc-to) specific path command value. - * Usually a `large-arc-flag` or `sweep-flag`. - * - * @param path the `PathParser` instance - */ -declare const scanFlag: (path: PathParser) => void; - -/** - * Validates every character of the path string, - * every path command, negative numbers or floating point numbers. + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] * - * @param path the `PathParser` instance - */ -declare const scanParam: (path: PathParser) => void; - -/** - * Scans every character in the path string to determine - * where a segment starts and where it ends. - * - * @param path the `PathParser` instance - */ -declare const scanSegment: (path: PathParser) => void; - -/** - * Points the parser to the next character in the - * path string every time it encounters any kind of - * space character. - * - * @param path the `PathParser` instance - */ -declare const skipSpaces: (path: PathParser) => void; - -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - -declare const DISTANCE_EPSILON = 0.00001; - -/** - * Returns the point in path closest to a given point. - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the best match - */ -declare const getClosestPoint: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => { - x: number; - y: number; -}; - -/** - * Check if a path is drawn clockwise and returns true if so, - * false otherwise. - * - * @param path the path string or `pathArray` - * @returns true when clockwise or false if not - */ -declare const getDrawDirection: (path: string | PathArray) => boolean; - -/** - * Returns the area of a shape. - * - * @author Jürg Lehni & Jonathan Puckey - * - * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js - * - * @param path the shape `pathArray` - * @returns the length of the cubic-bezier segment - */ -declare const getPathArea: (path: PathArray) => number; - -/** - * Returns [x,y] coordinates of a point at a given length of a shape. - * - * @param pathInput the `pathArray` to look into - * @param distance the length of the shape to look at - * @returns the requested {x, y} point coordinates - */ -declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { - x: number; - y: number; -}; - -/** - * Returns the segment, its index and length as well as - * the length to that segment at a given length in a path. - * - * @param pathInput target `pathArray` - * @param distance the given length - * @returns the requested properties - */ -declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; - -/** - * Returns the point and segment in path closest to a given point as well as - * the distance to the path stroke. - * - * @see https://bl.ocks.org/mbostock/8027637 - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the requested properties - */ -declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; - -/** - * Returns the segment at a given length. - * - * @param pathInput the target `pathArray` - * @param distance the distance in path to look at - * @returns the requested segment - */ -declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; - -/** - * Returns the path segment which contains a given point. - * - * @param path the `pathArray` to look into - * @param point the point of the shape to look for - * @returns the requested segment - */ -declare const getSegmentOfPoint: (path: string | PathArray, point: { - x: number; - y: number; -}) => SegmentProperties | undefined; - -/** - * Iterates an array to check if it's a `pathArray` - * with all absolute values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all C (cubic bezier) segments. - * - * @param path the `Array` to be checked - * @returns iteration result - */ -declare const isCurveArray: (path: unknown) => path is CurveArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all segments are in non-shorthand notation - * with absolute values. - * - * @param {string | SVGPath.pathArray} path the `pathArray` to be checked - * @returns {boolean} iteration result - */ -declare const isNormalizedArray: (path: unknown) => path is NormalArray; - -/** - * Iterates an array to check if it's an actual `pathArray`. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isPathArray: (path: unknown) => path is PathArray; - -/** - * Checks if a given point is in the stroke of a path. - * - * @param pathInput target path - * @param point the given `{x,y}` point - * @returns the query result - */ -declare const isPointInStroke: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => boolean; - -/** - * Iterates an array to check if it's a `pathArray` - * with relative values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isRelativeArray: (path: unknown) => path is RelativeArray; - -/** - * Parses a path string value to determine its validity - * then returns true if it's valid or false otherwise. - * - * @param pathString the path string to be parsed - * @returns the path string validity - */ -declare const isValidPath: (pathString: string) => boolean; - -/** - * Supported shapes and their specific parameters. - */ -declare const shapeParams: ShapeParams; - -/** - * Returns a new `` element created from attributes of a ``, ``, - * ``, ``, ``, `` or ``. If `replace` parameter - * is `true`, it will replace the target. The default `ownerDocument` is your current - * `document` browser page, if you want to use in server-side using `jsdom`, you can - * pass the `jsdom` `document` to `ownDocument`. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * The newly created `` element keeps all non-specific - * attributes like `class`, `fill`, etc. - * - * @param element target shape - * @param replace option to replace target - * @param ownerDocument document for create element - * @return the newly created `` element - */ -declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; - -/** - * Returns a new `pathArray` created from attributes of a ``, ``, - * ``, ``, ``, ``, or ``. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * @param element target shape - * @return the newly created `` element - */ -declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; - -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -/** - * Returns an absolute segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the absolute segment - */ -declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; - -/** - * Converts A (arc-to) segments to C (cubic-bezier-to). - * - * For more information of where this math came from visit: - * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - * - * @param X1 the starting x position - * @param Y1 the starting y position - * @param RX x-radius of the arc - * @param RY y-radius of the arc - * @param angle x-axis-rotation of the arc - * @param LAF large-arc-flag of the arc - * @param SF sweep-flag of the arc - * @param X2 the ending x position - * @param Y2 the ending y position - * @param recursive the parameters needed to split arc into 2 segments - * @return the resulting cubic-bezier segment(s) - */ -declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; - -/** - * Returns a transformation matrix to apply to `` elements. - * - * @see TransformObjectValues - * - * @param transform the `transformObject` - * @returns a new transformation matrix - */ -declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; - -declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; - -/** - * Converts an L (line-to) segment to C (cubic-bezier). - * - * @param x1 line start x - * @param y1 line start y - * @param x2 line end x - * @param y2 line end y - * @returns the cubic-bezier segment - */ -declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; - -/** - * Normalizes a single segment of a `pathArray` object. - * - * @param segment the segment object - * @param params the normalization parameters - * @returns the normalized segment - */ -declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; - -/** - * Returns the [x,y] projected coordinates for a given an [x,y] point - * and an [x,y,z] perspective origin point. - * - * Equation found here => - * http://en.wikipedia.org/wiki/3D_projection#Diagram - * Details => - * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel - * - * @param m the transformation matrix - * @param point2D the initial [x,y] coordinates - * @param origin the [x,y,z] transform origin - * @returns the projected [x,y] coordinates - */ -declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; - -/** - * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). - * - * @param x1 curve start x - * @param y1 curve start y - * @param qx control point x - * @param qy control point y - * @param x2 curve end x - * @param y2 curve end y - * @returns the cubic-bezier segment - */ -declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; - -/** - * Returns a relative segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the relative segment - */ -declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; - -/** - * Reverses all segments of a `pathArray` - * which consists of only C (cubic-bezier) path commands. - * - * @param path the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reverseCurve: (path: CurveArray) => CurveArray; - -/** - * Rounds the values of a `pathArray` instance to - * a specified amount of decimals and returns it. - * - * @param path the source `pathArray` - * @param roundOption the amount of decimals to round numbers to - * @returns the resulted `pathArray` with rounded values - */ -declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; - -declare const roundSegment: (segment: T, roundOption: number) => T; - -/** - * Converts any segment to C (cubic-bezier). - * - * @param segment the source segment - * @param params the source segment parameters - * @returns the cubic-bezier segment - */ -declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; - -/** - * Shorten a single segment of a `pathArray` object. - * - * @param segment the `absoluteSegment` object - * @param normalSegment the `normalSegment` object - * @param params the coordinates of the previous segment - * @param prevCommand the path command of the previous segment - * @returns the shortened segment - */ -declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; - -/** - * Split a cubic-bezier segment into two. - * - * @param pts the cubic-bezier parameters - * @param ratio the cubic-bezier parameters - * @return two new cubic-bezier segments - */ -declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; - -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance + * @class + * @author thednp + * @returns a new SVGPathCommander instance */ declare class SVGPathCommander { segments: PathArray; @@ -1340,4 +649,695 @@ declare class SVGPathCommander { static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; } +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; +}; + +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; +}; + +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; + +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; + +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { + x: number; + y: number; +}; + +declare const roundTo: (n: number, round: number) => number; + +/** + * Parses a path string value or object and returns an array + * of segments, all converted to absolute values. + * + * @param pathInput the path string | object + * @returns the resulted `pathArray` with absolute values + */ +declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; + +/** + * Parses a path string value or object and returns an array + * of segments, all converted to relative values. + * + * @param pathInput the path string | object + * @returns the resulted `pathArray` with relative values + */ +declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; + +/** + * Parses a path string value or 'pathArray' and returns a new one + * in which all segments are converted to cubic-bezier. + * + * In addition, un-necessary `Z` segment is removed if previous segment + * extends to the `M` segment. + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the resulted `pathArray` converted to cubic-bezier + */ +declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; + +/** + * Returns a valid `d` attribute string value created + * by rounding values and concatenating the `pathArray` segments. + * + * @param path the `pathArray` object + * @param roundOption amount of decimals to round values to + * @returns the concatenated path string + */ +declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; + +/** + * Parses a path string value and returns an array + * of segments we like to call `pathArray`. + * + * @param pathInput the string to be parsed + * @returns the resulted `pathArray` or error string + */ +declare const parsePathString: (pathInput: string | T) => PathArray; + +/** + * Breaks the parsing of a pathString once a segment is finalized. + * + * @param path the `PathParser` instance + */ +declare const finalizeSegment: (path: PathParser) => void; + +declare const invalidPathValue = "Invalid path value"; + +/** + * Checks if the character is an A (arc-to) path command. + * + * @param code the character to check + * @returns check result + */ +declare const isArcCommand: (code: number) => code is 97; + +/** + * Checks if a character is a digit. + * + * @param code the character to check + * @returns check result + */ +declare const isDigit: (code: number) => code is DigitNumber; + +/** + * Checks if the character is or belongs to a number. + * [0-9]|+|-|. + * + * @param code the character to check + * @returns check result + */ +declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; + +/** + * Checks if the character is a MoveTo command. + * + * @param code the character to check + * @returns check result + */ +declare const isMoveCommand: (code: number) => code is 109 | 77; + +/** + * Checks if the character is a path command. + * + * @param code the character to check + * @returns check result + */ +declare const isPathCommand: (code: number) => code is PathCommandNumber; + +/** + * Checks if the character is a space. + * + * @param ch the character to check + * @returns check result + */ +declare const isSpace: (ch: number) => ch is SpaceNumber; + +/** Segment params length */ +declare const paramsCount: { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; +}; + +declare const paramsParser: ParserParams; + +/** + * Validates an A (arc-to) specific path command value. + * Usually a `large-arc-flag` or `sweep-flag`. + * + * @param path the `PathParser` instance + */ +declare const scanFlag: (path: PathParser) => void; + +/** + * Validates every character of the path string, + * every path command, negative numbers or floating point numbers. + * + * @param path the `PathParser` instance + */ +declare const scanParam: (path: PathParser) => void; + +/** + * Scans every character in the path string to determine + * where a segment starts and where it ends. + * + * @param path the `PathParser` instance + */ +declare const scanSegment: (path: PathParser) => void; + +/** + * Points the parser to the next character in the + * path string every time it encounters any kind of + * space character. + * + * @param path the `PathParser` instance + */ +declare const skipSpaces: (path: PathParser) => void; + +declare const getPathBBox: (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; + +/** + * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. + * + * @param pathInput the target `pathArray` + * @returns the shape total length + */ +declare const getTotalLength: (pathInput: string | PathArray) => number; + +declare const DISTANCE_EPSILON = 0.00001; + +/** + * Returns the point in path closest to a given point. + * + * @param pathInput target `pathArray` + * @param point the given point + * @returns the best match + */ +declare const getClosestPoint: (pathInput: string | PathArray, point: { + x: number; + y: number; +}) => { + x: number; + y: number; +}; + +/** + * Check if a path is drawn clockwise and returns true if so, + * false otherwise. + * + * @param path the path string or `pathArray` + * @returns true when clockwise or false if not + */ +declare const getDrawDirection: (path: string | PathArray) => boolean; + +/** + * Returns the area of a shape. + * + * @author Jürg Lehni & Jonathan Puckey + * + * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js + * + * @param path the shape `pathArray` + * @returns the length of the cubic-bezier segment + */ +declare const getPathArea: (path: PathArray) => number; + +/** + * Returns [x,y] coordinates of a point at a given length of a shape. + * + * @param pathInput the `pathArray` to look into + * @param distance the length of the shape to look at + * @returns the requested {x, y} point coordinates + */ +declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; +}; + +/** + * Returns the segment, its index and length as well as + * the length to that segment at a given length in a path. + * + * @param pathInput target `pathArray` + * @param distance the given length + * @returns the requested properties + */ +declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; + +/** + * Returns the point and segment in path closest to a given point as well as + * the distance to the path stroke. + * + * @see https://bl.ocks.org/mbostock/8027637 + * + * @param pathInput target `pathArray` + * @param point the given point + * @returns the requested properties + */ +declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; + +/** + * Returns the segment at a given length. + * + * @param pathInput the target `pathArray` + * @param distance the distance in path to look at + * @returns the requested segment + */ +declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + +/** + * Returns the path segment which contains a given point. + * + * @param path the `pathArray` to look into + * @param point the point of the shape to look for + * @returns the requested segment + */ +declare const getSegmentOfPoint: (path: string | PathArray, point: { + x: number; + y: number; +}) => SegmentProperties | undefined; + +/** + * Iterates an array to check if it's a `pathArray` + * with all absolute values. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; + +/** + * Iterates an array to check if it's a `pathArray` + * with all C (cubic bezier) segments. + * + * @param path the `Array` to be checked + * @returns iteration result + */ +declare const isCurveArray: (path: unknown) => path is CurveArray; + +/** + * Iterates an array to check if it's a `pathArray` + * with all segments are in non-shorthand notation + * with absolute values. + * + * @param {string | SVGPath.pathArray} path the `pathArray` to be checked + * @returns {boolean} iteration result + */ +declare const isNormalizedArray: (path: unknown) => path is NormalArray; + +/** + * Iterates an array to check if it's an actual `pathArray`. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isPathArray: (path: unknown) => path is PathArray; + +/** + * Checks if a given point is in the stroke of a path. + * + * @param pathInput target path + * @param point the given `{x,y}` point + * @returns the query result + */ +declare const isPointInStroke: (pathInput: string | PathArray, point: { + x: number; + y: number; +}) => boolean; + +/** + * Iterates an array to check if it's a `pathArray` + * with relative values. + * + * @param path the `pathArray` to be checked + * @returns iteration result + */ +declare const isRelativeArray: (path: unknown) => path is RelativeArray; + +/** + * Parses a path string value to determine its validity + * then returns true if it's valid or false otherwise. + * + * @param pathString the path string to be parsed + * @returns the path string validity + */ +declare const isValidPath: (pathString: string) => boolean; + +/** + * Supported shapes and their specific parameters. + */ +declare const shapeParams: ShapeParams; + +/** + * Returns a new `` element created from attributes of a ``, ``, + * ``, ``, ``, `` or ``. If `replace` parameter + * is `true`, it will replace the target. The default `ownerDocument` is your current + * `document` browser page, if you want to use in server-side using `jsdom`, you can + * pass the `jsdom` `document` to `ownDocument`. + * + * It can also work with an options object, see the type below + * @see ShapeOps + * + * The newly created `` element keeps all non-specific + * attributes like `class`, `fill`, etc. + * + * @param element target shape + * @param replace option to replace target + * @param ownerDocument document for create element + * @return the newly created `` element + */ +declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + +/** + * Returns a new `pathArray` created from attributes of a ``, ``, + * ``, ``, ``, ``, or ``. + * + * It can also work with an options object, see the type below + * @see ShapeOps + * + * @param element target shape + * @return the newly created `` element + */ +declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; + +/** + * Normalizes a `pathArray` object for further processing: + * * convert segments to absolute values + * * convert shorthand path commands to their non-shorthand notation + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the normalized `pathArray` + */ +declare const normalizePath: (pathInput: string | PathArray) => NormalArray; + +/** + * Optimizes a `pathArray` object: + * * convert segments to shorthand if possible + * * select shortest segments from absolute and relative `pathArray`s + * + * @param pathInput a string or `pathArray` + * @param roundOption the amount of decimals to round values to + * @returns the optimized `pathArray` + */ +declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; + +/** + * Reverses all segments of a `pathArray` and returns a new `pathArray` instance + * with absolute values. + * + * @param pathInput the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reversePath: (pathInput: PathArray) => PathArray; + +/** + * Split a path into an `Array` of sub-path strings. + * + * In the process, values are converted to absolute + * for visual consistency. + * + * @param pathInput the source `pathArray` + * @return an array with all sub-path strings + */ +declare const splitPath: (pathInput: PathArray) => PathArray[]; + +/** + * Apply a 2D / 3D transformation to a `pathArray` instance. + * + * Since *SVGElement* doesn't support 3D transformation, this function + * creates a 2D projection of the element. + * + * @param path the `pathArray` to apply transformation + * @param transform the transform functions `Object` + * @returns the resulted `pathArray` + */ +declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; + +/** + * Returns an absolute segment of a `PathArray` object. + * + * @param segment the segment object + * @param index the segment index + * @param lastX the last known X value + * @param lastY the last known Y value + * @returns the absolute segment + */ +declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + +/** + * Converts A (arc-to) segments to C (cubic-bezier-to). + * + * For more information of where this math came from visit: + * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + * + * @param X1 the starting x position + * @param Y1 the starting y position + * @param RX x-radius of the arc + * @param RY y-radius of the arc + * @param angle x-axis-rotation of the arc + * @param LAF large-arc-flag of the arc + * @param SF sweep-flag of the arc + * @param X2 the ending x position + * @param Y2 the ending y position + * @param recursive the parameters needed to split arc into 2 segments + * @return the resulting cubic-bezier segment(s) + */ +declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + +/** + * Returns a transformation matrix to apply to `` elements. + * + * @see TransformObjectValues + * + * @param transform the `transformObject` + * @returns a new transformation matrix + */ +declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; + +declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; + +/** + * Converts an L (line-to) segment to C (cubic-bezier). + * + * @param x1 line start x + * @param y1 line start y + * @param x2 line end x + * @param y2 line end y + * @returns the cubic-bezier segment + */ +declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; + +/** + * Normalizes a single segment of a `pathArray` object. + * + * @param segment the segment object + * @param params the normalization parameters + * @returns the normalized segment + */ +declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; + +/** + * Returns the [x,y] projected coordinates for a given an [x,y] point + * and an [x,y,z] perspective origin point. + * + * Equation found here => + * http://en.wikipedia.org/wiki/3D_projection#Diagram + * Details => + * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel + * + * @param m the transformation matrix + * @param point2D the initial [x,y] coordinates + * @param origin the [x,y,z] transform origin + * @returns the projected [x,y] coordinates + */ +declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + +/** + * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). + * + * @param x1 curve start x + * @param y1 curve start y + * @param qx control point x + * @param qy control point y + * @param x2 curve end x + * @param y2 curve end y + * @returns the cubic-bezier segment + */ +declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + +/** + * Returns a relative segment of a `PathArray` object. + * + * @param segment the segment object + * @param index the segment index + * @param lastX the last known X value + * @param lastY the last known Y value + * @returns the relative segment + */ +declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + +/** + * Reverses all segments of a `pathArray` + * which consists of only C (cubic-bezier) path commands. + * + * @param path the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reverseCurve: (path: CurveArray) => CurveArray; + +/** + * Rounds the values of a `pathArray` instance to + * a specified amount of decimals and returns it. + * + * @param path the source `pathArray` + * @param roundOption the amount of decimals to round numbers to + * @returns the resulted `pathArray` with rounded values + */ +declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; + +declare const roundSegment: (segment: T, roundOption: number) => T; + +/** + * Converts any segment to C (cubic-bezier). + * + * @param segment the source segment + * @param params the source segment parameters + * @returns the cubic-bezier segment + */ +declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + +/** + * Shorten a single segment of a `pathArray` object. + * + * @param segment the `absoluteSegment` object + * @param normalSegment the `normalSegment` object + * @param params the coordinates of the previous segment + * @param prevCommand the path command of the previous segment + * @returns the shortened segment + */ +declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + +/** + * Split a cubic-bezier segment into two. + * + * @param pts the cubic-bezier parameters + * @param ratio the cubic-bezier parameters + * @return two new cubic-bezier segments + */ +declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.js b/dist/svg-path-commander.js index 5e1fb58..ee4e86b 100644 --- a/dist/svg-path-commander.js +++ b/dist/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,c,a,l,m,h,f,g,u,y,p,x,C]=r;t.m11=s,t.a=s,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[s,n,i,o,c,a]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(i==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(i.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(i==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(i==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(i==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(i==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&a&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](a);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[p===0?a:x,p===1?a:x,p===2?a:x];r=r[u](...C)}else throw TypeError(s)}),r},Vt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const s=new T;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Ae=(e,t,r)=>{const s=new T,n=Math.PI/180,i=e*n,o=t*n,c=r*n,a=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+a*g;s.m21=p,s.c=p;const x=a*f-l*h*g;return s.m22=x,s.d=x,s.m23=-l*m,s.m31=l*g-a*h*f,s.m32=l*f+a*h*g,s.m33=a*m,s},pe=(e,t,r,s)=>{const n=new T,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,c=t/i,a=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,p=1-2*(u+y)*f;n.m11=p,n.a=p;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const s=new T;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},Ct=(e,t)=>{const r=new T;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),H=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,s,n,i,o,c,a,l,m,h,f,g,u,y,p,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(Vt(this,t))}toFloat64Array(t){return Float64Array.from(Vt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return H(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,be(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),H(this,xe(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,Ae(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,pe(t,r,s,n))}skewX(t){return H(this,Ce(t))}skewY(t){return H(this,Me(t))}skew(t,r){return H(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}R(T,"Translate",be),R(T,"Rotate",Ae),R(T,"RotateAxisAngle",pe),R(T,"Scale",xe),R(T,"SkewX",Ce),R(T,"SkewY",Me),R(T,"Skew",Ct),R(T,"Multiply",H),R(T,"fromArray",ct),R(T,"fromMatrix",ye),R(T,"fromString",de),R(T,"toArray",Vt),R(T,"isCompatibleArray",fe),R(T,"isCompatibleObject",ge);const Z=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,s)=>lt([e,t],[r,s]),It=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[c,a]=Z([e,t],[r,s],n/o);i={x:c,y:a}}}return i},Rt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Pe={getLineBBox:Rt,getLineLength:mt,getPointAtLineLength:It},Et=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,c=t**2*i**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},_=(e,t,r,s,n,i)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(i),h=s*o(i);return[e+a*m-l*h,t+l*m+a*h]},jt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,c=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,s,n,i,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,A={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=A.x**2/u**2+A.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*A.y**2-y**2*A.x**2,q=u**2*A.y**2+y**2*A.x**2;let $=S/q;$=$<0?0:$;const v=(i!==o?1:-1)*f($),N={x:v*(u*A.y/y),y:v*(-(y*A.x)/u)},O={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(A.x-N.x)/u,y:(A.y-N.y)/y},k=jt({x:1,y:0},Y),P={x:(-A.x-N.x)/u,y:(-A.y-N.y)/y};let V=jt(Y,P);!o&&V>0?V-=2*g:o&&V<0&&(V+=2*g),V%=2*g;const B=k+V;return{center:O,startAngle:k,endAngle:B,rx:u,ry:y}},Dt=(e,t,r,s,n,i,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,s,n,i,o,c,a);return Et(l,m,f-h)},Se=(e,t,r,s,n,i,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,s,n,i,o,c,a);if(typeof l=="number"){const p=Et(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return It(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,A=y-u,S=(n%360+360)%360*(x/180),q=u+A*(l/p),$=f*C(q),v=g*d(q);m={x:C(S)*$-d(S)*v+h.x,y:d(S)*$+C(S)*v+h.y}}}return m},Te=(e,t,r,s,n,i,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,s,n,i,o,c,a),u=g-f,{min:y,max:p,tan:x,atan2:C,PI:d}=Math,{x:A,y:M}=l,S=n*d/180,q=x(S),$=C(-h*q,m),v=$,N=$+d,O=C(h,m*q),Y=O+d,k=[c],P=[a];let V=y(e,c),B=p(e,c),D=y(t,a),U=p(t,a);const at=g-u*1e-5,tt=_(A,M,m,h,S,at),L=g-u*.99999,I=_(A,M,m,h,S,L);if(tt[0]>B||I[0]>B){const z=_(A,M,m,h,S,v);k.push(z[0]),P.push(z[1])}if(tt[0]U||I[1]>U){const z=_(A,M,m,h,S,O);k.push(z[0]),P.push(z[1])}return V=y.apply([],k),D=y.apply([],P),B=p.apply([],k),U=p.apply([],P),[V,D,B,U]},Ne={angleBetween:jt,arcLength:Et,arcPoint:_,getArcBBox:Te,getArcLength:Dt,getArcProps:Mt,getPointAtArcLength:Se},Qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=i,a=s*t*2,l=o):r===3&&(c=i*s,a=i*t*3,l=s*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},qe=e=>{const r=Qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sve(r[0],s))},$e=1e-8,Pt=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)<$e)return e===s&&e===t?[e,s]:Pt([e,-.5*e+1.5*t,e-3*t+3*r]);const i=-e*r+e*s-t*r-t*s+t*t+r*r;if(i<=0)return[Math.min(e,s),Math.max(e,s)];const o=Math.sqrt(i);let c=Math.min(e,s),a=Math.max(e,s);const l=e-2*t+r;for(let m=(l+o)/n,h=1;h<=2;m=(l-o)/n,h++)if(m>0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fa&&(a=f)}return[c,a]},ke={bezierLength:qe,calculateBezier:ze,CBEZIER_MINMAX_EPSILON:$e,computeBezier:ve,Cvalues:we,deriveBezier:Le,getBezierLength:ut,minmaxC:Zt,minmaxQ:Pt,Tvalues:Qt},Ve=([e,t,r,s,n,i,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*s+3*l*a**2*i+a**3*c}},St=(e,t,r,s,n,i,o,c)=>ut([e,t,r,s,n,i,o,c]),Ie=(e,t,r,s,n,i,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,s,n,i,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=Ve([e,t,r,s,n,i,o,c],a/h))}return m},Ot=(e,t,r,s,n,i,o,c)=>{const a=Zt([e,r,n,o]),l=Zt([t,s,i,c]);return[a[0],l[0],a[1],l[1]]},Re={getCubicBBox:Ot,getCubicLength:St,getPointAtCubicLength:Ie,getPointAtCubicSegmentLength:Ve},Ee=([e,t,r,s,n,i],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*s+o**2*i}},Tt=(e,t,r,s,n,i)=>ut([e,t,r,s,n,i]),je=(e,t,r,s,n,i,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,s,n,i]);o<=0||(o>=l?a={x:n,y:i}:a=Ee([e,t,r,s,n,i],o/l))}return a},Bt=(e,t,r,s,n,i)=>{const o=Pt([e,r,n]),c=Pt([t,s,i]);return[o[0],c[0],o[1],c[1]]},De={getPointAtQuadLength:je,getPointAtQuadSegmentLength:Ee,getQuadBBox:Bt,getQuadLength:Tt},Qe={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+lt(e[s-1],r):0,0)},et=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=K[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,K[r]))),!!K[r]););},Q="SVGPathCommander Error",Ht=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${Q}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",Ft=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${Q}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${Q}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},_t=e=>F(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=K[r[s].toLowerCase()];if(e.segmentStart=s,!Ut(i)){e.err=`${Q}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const c=n[n.length-1];if(!Kt(i)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${Q}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(i)&&(l===3||l===4)?Ht(e):Ft(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!_t(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const E=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const c=[],a=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=E(e);return j(t,nt)},vt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const c=[],a=e.length;for(let l=1;l{const t=E(e);return j(t,vt)},ft=(e,t,r,s,n,i,o,c,a,l)=>{let m=e,h=t,f=r,g=s,u=c,y=a;const p=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,A,M,S,q;if(l)[A,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,I=(h-y)/2;let z=L*L/(f*f)+I*I/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(i===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*I*I-he*L*L)/(ue*I*I+he*L*L)));S=Ye*f*I/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,A=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),A=mM&&(A-=Math.PI*2),!o&&M>A&&(M-=Math.PI*2)}let $=M-A;if(Math.abs($)>p){const L=M,I=u,z=y;M=A+p*(o&&M>A?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,I,z,[M,L,S,q])}$=M-A;const v=Math.cos(A),N=Math.sin(A),O=Math.cos(M),Y=Math.sin(M),k=Math.tan($/4),P=4/3*f*k,V=4/3*g*k,B=[m,h],D=[m+P*N,h-V*v],U=[u+P*Y,y-V*O],at=[u,y];if(D[0]=2*B[0]-D[0],D[1]=2*B[1]-D[1],l)return[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);C=[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,I=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*s,o*n+c*r,o*i+c*s,n,i]},zt=(e,t,r,s)=>{const n=Z([e,t],[r,s],.3333333333333333),i=Z([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Yt=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(ft(o,c,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Xt(o,c,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(zt(o,c,n,i)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=E(e);return j(r,(s,n,i,o)=>{t.x=i,t.y=o;const c=gt(s,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:s}=J,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=E(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,x=0,C=0,d=0,A=0;j(t,(q,$,v,N)=>{[r]=q;const O=r.toUpperCase(),k=O!==r?nt(q,$,v,N):q.slice(0),P=O==="V"?["L",v,k[1]]:O==="H"?["L",k[1],N]:k;if([r]=P,"TQ".includes(O)||(d=0,A=0),r==="M")[,s,n]=P,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Rt(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const V=y*2-x,B=p*2-C;[h,f,g,u]=Ot(v,N,V,B,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Ot(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,A=p*2-A,[h,f,g,u]=Bt(v,N,d,A,P[1],P[2])):r==="Q"?(d=P[1],A=P[2],[h,f,g,u]=Bt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=Rt(v,N,s,n));c=o(h,c),a=o(f,a),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,p]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=E(e);let r=0,s=0,n=0,i=0,o=0,c=0,a="M",l=0,m=0,h=0;return j(t,(f,g,u,y)=>{[a]=f;const p=a.toUpperCase(),C=p!==a?nt(f,g,u,y):f.slice(0),d=p==="V"?["L",u,C[1]]:p==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(p)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Dt(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const A=r*2-n,M=s*2-i;h+=St(u,y,A,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=s*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,s]=a==="Z"?[l,m]:d.slice(-2),[n,i]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,s]}),h},dt=1e-5,st=e=>{const t=E(e),r={...rt};return j(t,(s,n,i,o)=>{r.x=i,r.y=o;const c=gt(s,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},it=(e,t)=>{const r=st(e);let s=!1,n=[],i="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[x,C].concat(y.slice(1)),s?([,a,l]=y,h={x:a,y:l},f=0):i==="L"?(h=It(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):i==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Dt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=Ie(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=je(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},$t=(e,t)=>{const r=E(e);let s=r.slice(0),n=X(s),i=s.length-1,o=0,c=0,a=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=X(s),c=n-o,a=r[i],{segment:a,index:i,length:c,lengthAtSegment:o};const l=[];for(;i>0;)a=s[i],s=s.slice(0,-1),o=X(s),c=n-o,n=o,l.push({segment:a,index:i,length:c,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=E(e),s=st(r),n=X(s),i=A=>{const M=A.x-t.x,S=A.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let A=0;A<=n;A+=o)c=it(s,A),l=i(c),l1e-6&&(u=m-o,f=it(s,u),p=i(f),y=m+o,g=it(s,y),x=i(g),u>=0&&pbt(e,t).closest,rn=(e,t,r,s,n,i,o,c)=>3*((c-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+c*(n+e/3)-o*(i+t/3))/20,ee=e=>{let t=0,r=0,s=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Oe=e=>ee(yt(e))>=0,Be=(e,t)=>$t(e,t).segment,He=(e,t)=>bt(e,t).segment,At=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>At(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Fe=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Ge=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)At(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),se=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},cn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ie=e=>{const t=Object.keys(ot),r=_e(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(a=>s!==a))throw TypeError(`${Q}: "${s}" is not SVGElement`);const n=r?s:e.type,i=ot[n],o={type:n};r?i.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=E(r?e.getAttribute("d")||"":e.d||"")),At(c)&&c.length?c:!1},Je=(e,t,r)=>{const s=r||document,n=Object.keys(ot),i=_e(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${Q}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${Q}: "${o}" is not SVGElement`);const c=s.createElementNS("http://www.w3.org/2000/svg","path"),a=i?o:e.type,l=ot[a],m={type:a},h=J.round,f=ie(e),g=f&&f.length?qt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),se(g)?(c.setAttribute("d",g),t&&i&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,s)=>{const[n]=e,{round:i}=J,o=i,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(s)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(s)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return p},pt=(e,t)=>{const r=e.slice(1).map(s=>w(s,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),s=typeof t=="number"&&t>=0?t:2,n={...rt},i=[];let o="M",c="Z";return j(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,i[l]=o,l){c=i[l-1];const y=oe(a,f,n,c),p=pt(y,s),x=p.join(""),C=vt(y,l,m,h),d=pt(C,s),A=d.join("");g=x.length{const t=ht(e),r=st(t),s=t.length,n=t[s-1][0]==="Z",i=j(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",a[3],a[4],a[1],a[2],u,y]:p=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",a[1],a[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ce=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?a.x:0,i+=g?a.y:0,o=n,c=i,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,i=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,i]=l,i+=g?a.y:0):([n,i]=l.slice(-2),n+=g?a.x:0,i+=g?a.y:0),r.push(l)),a.x=n,a.y=i,t[s]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||c||a)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-s,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},kt=(e,t,r)=>{const[s,n,i]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-s,m=c-n,h=a-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,c=0,a="M";const l=E(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):j(l,(g,u,y,p)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,p):g.slice(0);let A=x==="A"?["C"].concat(ft(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],p]:d;a=A[0];const M=a==="C"&&A.length>7,S=M?A.slice(0,7):A.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(A.slice(7))),A=S),a==="L")[n,i]=kt(f,[A[1],A[2]],h),r!==n&&s!==i?A=["L",n,i]:s===i?A=["H",n]:r===n&&(A=["V",i]);else for(o=1,c=A.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):j(e,s=>pt(s,r))},Xe=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),c=Z(s,n,r),a=Z(n,i,r),l=Z(i,o,r),m=Z(c,a,r),h=Z(a,l,r),f=Z(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${Q}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=E(t);const{round:i,origin:o}=s;let c;Number.isInteger(i)||i==="off"?c=i:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return it(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,s=ce(r),n=s.length>1?s:!1,i=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=st(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?s:a,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return ke}static get cubicTools(){return Re}static get lineTools(){return Pe}static get polygonTools(){return Qe}static get quadTools(){return De}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return Z}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return E}static get finalizeSegment(){return Nt}static get invalidPathValue(){return G}static get isArcCommand(){return Jt}static get isDigit(){return F}static get isDigitStart(){return _t}static get isMoveCommand(){return Kt}static get isPathCommand(){return Ut}static get isSpace(){return Gt}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Ht}static get scanParam(){return Ft}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return Ze}static get getDrawDirection(){return Oe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return it}static get getPropertiesAtLength(){return $t}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Be}static get getSegmentOfPoint(){return He}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return Fe}static get isNormalizedArray(){return re}static get isPathArray(){return At}static get isPointInStroke(){return Ge}static get isRelativeArray(){return Ue}static get isValidPath(){return se}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return ie}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return j}static get lineToCubic(){return zt}static get normalizePath(){return st}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return kt}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return pt}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=ke,b.cubicTools=Re,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=Ze,b.getDrawDirection=Oe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=it,b.getPropertiesAtLength=$t,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Be,b.getSegmentOfPoint=He,b.getTotalLength=X,b.invalidPathValue=G,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=Fe,b.isDigit=F,b.isDigitStart=_t,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=At,b.isPathCommand=Ut,b.isPointInStroke=Ge,b.isRelativeArray=Ue,b.isSpace=Gt,b.isValidPath=se,b.iterate=j,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=Z,b.normalizePath=st,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=E,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=Qe,b.projection2d=kt,b.quadToCubic=Xt,b.quadTools=De,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=pt,b.roundTo=w,b.scanFlag=Ht,b.scanParam=Ft,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=ie,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); +var SVGPathCommander=function(){"use strict";var Ee=Object.defineProperty,Re=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t,r)=>Re(e,typeof t!="symbol"?t+"":t,r);const je={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},Ft=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),Gt=e=>e instanceof DOMMatrix||e instanceof S||typeof e=="object"&&Object.keys(je).every(t=>e&&t in e),et=e=>{const t=new S,r=Array.from(e);if(!Ft(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,g,u,y,p,b,A]=r;t.m11=s,t.a=s,t.m21=a,t.c=a,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=c,t.d=c,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=b,t.m14=o,t.m24=m,t.m34=u,t.m44=A}else if(r.length===6){const[s,n,i,o,a,c]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=a,t.e=a,t.m42=c,t.f=c}return t},Ut=e=>{if(Gt(e))return et([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},_t=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new S;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],g=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(et(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),b=u==="scale"?1:0,A=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...A)}else throw TypeError(s)}),r},Nt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],Jt=(e,t,r)=>{const s=new S;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Kt=(e,t,r)=>{const s=new S,n=Math.PI/180,i=e*n,o=t*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),g=-Math.sin(a),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+c*g;s.m21=p,s.c=p;const b=c*f-l*h*g;return s.m22=b,s.d=b,s.m23=-l*m,s.m31=l*g-c*h*f,s.m32=l*f+c*h*g,s.m33=c*m,s},Wt=(e,t,r,s)=>{const n=new S,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,a=t/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=a*a,y=c*c,p=1-2*(u+y)*f;n.m11=p,n.a=p;const b=2*(o*a*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(o*c*f-a*m*h);const A=2*(a*o*f-c*m*h);n.m21=A,n.c=A;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(g+u)*f,n},Xt=(e,t,r)=>{const s=new S;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},mt=(e,t)=>{const r=new S;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Yt=e=>mt(e,0),te=e=>mt(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,a=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,c=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,b=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return et([r,s,n,i,o,a,c,l,m,h,f,g,u,y,p,b])};class S{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?_t(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?et(t):typeof t=="object"?Ut(t):this}toFloat32Array(t){return Float32Array.from(Nt(this,t))}toFloat64Array(t){return Float64Array.from(Nt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),B(this,Jt(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),B(this,Xt(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),B(this,Kt(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Wt(t,r,s,n))}skewX(t){return B(this,Yt(t))}skewY(t){return B(this,te(t))}skew(t,r){return B(this,mt(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}V(S,"Translate",Jt),V(S,"Rotate",Kt),V(S,"RotateAxisAngle",Wt),V(S,"Scale",Xt),V(S,"SkewX",Yt),V(S,"SkewY",te),V(S,"Skew",mt),V(S,"Multiply",B),V(S,"fromArray",et),V(S,"fromMatrix",Ut),V(S,"fromString",_t),V(S,"toArray",Nt),V(S,"isCompatibleArray",Ft),V(S,"isCompatibleObject",Gt);const O=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},ut=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),nt=(e,t,r,s)=>ut([e,t],[r,s]),wt=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=ut([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[a,c]=O([e,t],[r,s],n/o);i={x:a,y:c}}}return i},Lt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Qe={getLineBBox:Lt,getLineLength:nt,getPointAtLineLength:wt},Tt=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,a=t**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},U=(e,t,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[e+c*m-l*h,t+l*m+c*h]},vt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},ht=(e,t,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const b=(n%360+360)%360*(g/180);if(e===a&&t===c)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(a+e)/2,y:(c+t)/2}};const A=(e-a)/2,d=(t-c)/2,x={x:h(b)*A+m(b)*d,y:-m(b)*A+h(b)*d},M=x.x**2/u**2+x.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const P=u**2*y**2-u**2*x.y**2-y**2*x.x**2,$=u**2*x.y**2+y**2*x.x**2;let q=P/$;q=q<0?0:q;const T=(i!==o?1:-1)*f(q),N={x:T*(u*x.y/y),y:T*(-(y*x.x)/u)},Z={x:h(b)*N.x-m(b)*N.y+(e+a)/2,y:m(b)*N.x+h(b)*N.y+(t+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/y},z=vt({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/y};let k=vt(J,C);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const D=z+k;return{center:Z,startAngle:z,endAngle:D,rx:u,ry:y}},$t=(e,t,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=ht(e,t,r,s,n,i,o,a,c);return Tt(l,m,f-h)},ee=(e,t,r,s,n,i,o,a,c,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=ht(e,t,r,s,n,i,o,a,c);if(typeof l=="number"){const p=Tt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:a,y:c};else{if(e===a&&t===c)return{x:a,y:c};if(f===0||g===0)return wt(e,t,a,c,l);const{PI:b,cos:A,sin:d}=Math,x=y-u,P=(n%360+360)%360*(b/180),$=u+x*(l/p),q=f*A($),T=g*d($);m={x:A(P)*q-d(P)*T+h.x,y:d(P)*q+A(P)*T+h.y}}}return m},ne=(e,t,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=ht(e,t,r,s,n,i,o,a,c),u=g-f,{min:y,max:p,tan:b,atan2:A,PI:d}=Math,{x,y:M}=l,P=n*d/180,$=b(P),q=A(-h*$,m),T=q,N=q+d,Z=A(h,m*$),J=Z+d,z=[a],C=[c];let k=y(e,a),D=p(e,a),E=y(t,c),H=p(t,c);const tt=g-u*1e-5,K=U(x,M,m,h,P,tt),w=g-u*.99999,I=U(x,M,m,h,P,w);if(K[0]>D||I[0]>D){const v=U(x,M,m,h,P,T);z.push(v[0]),C.push(v[1])}if(K[0]H||I[1]>H){const v=U(x,M,m,h,P,Z);z.push(v[0]),C.push(v[1])}return k=y.apply([],z),E=y.apply([],C),D=p.apply([],z),H=p.apply([],C),[k,E,D,H]},Ze={angleBetween:vt,arcLength:Tt,arcPoint:U,getArcBBox:ne,getArcLength:$t,getArcProps:ht,getPointAtArcLength:ee},qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],re=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],se=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*t*2,l=o):r===3&&(a=i*s,c=i*t*3,l=s*o*3,m=t*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t}},oe=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ce=e=>{const r=qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sie(r[0],s))},ae=1e-8,ft=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},De={bezierLength:ce,calculateBezier:oe,CBEZIER_MINMAX_EPSILON:ae,computeBezier:ie,Cvalues:re,deriveBezier:se,getBezierLength:rt,minmaxC:zt,minmaxQ:ft,Tvalues:qt},le=([e,t,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*e+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*t+3*l**2*c*s+3*l*c**2*i+c**3*a}},gt=(e,t,r,s,n,i,o,a)=>rt([e,t,r,s,n,i,o,a]),me=(e,t,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:e,y:t};if(l){const h=rt([e,t,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=le([e,t,r,s,n,i,o,a],c/h))}return m},kt=(e,t,r,s,n,i,o,a)=>{const c=zt([e,r,n,o]),l=zt([t,s,i,a]);return[c[0],l[0],c[1],l[1]]},Oe={getCubicBBox:kt,getCubicLength:gt,getPointAtCubicLength:me,getPointAtCubicSegmentLength:le},ue=([e,t,r,s,n,i],o)=>{const a=1-o;return{x:a**2*e+2*a*o*r+o**2*n,y:a**2*t+2*a*o*s+o**2*i}},yt=(e,t,r,s,n,i)=>rt([e,t,r,s,n,i]),he=(e,t,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:e,y:t};if(a){const l=rt([e,t,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=ue([e,t,r,s,n,i],o/l))}return c},It=(e,t,r,s,n,i)=>{const o=ft([e,r,n]),a=ft([t,s,i]);return[o[0],a[0],o[1],a[1]]},Be={getPointAtQuadLength:he,getPointAtQuadSegmentLength:ue,getQuadBBox:It,getQuadLength:yt},He={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+ut(e[s-1],r):0,0)},st=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},L=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},_={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Vt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",fe=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${R}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",ge=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=t){e.err=`${R}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${R}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),X=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xe=e=>F(e)||e===43||e===45||e===46,pe=e=>(e|32)===97,be=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},Et=e=>{var c;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(e.segmentStart=s,!de(i)){e.err=`${R}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!be(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){e.err=`${R}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,X(e),e.data=[],!o){Vt(e);return}for(;;){for(let l=o;l>0;l-=1){if(pe(i)&&(l===3||l===4)?fe(e):ge(e),e.err.length)return;e.data.push(e.param),X(e),e.index=e.max||!xe(r.charCodeAt(e.index)))break}Vt(e)};class Rt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const j=e=>{if(typeof e!="string")return e.slice(0);const t=new Rt(e);for(X(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const a=[],c=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const t=j(e);return Q(t,it)},jt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const a=[],c=e.length;for(let l=1;l{const t=j(e);return Q(t,jt)},xt=(e,t,r,s,n,i,o,a,c,l)=>{let m=e,h=t,f=r,g=s,u=a,y=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let A=[],d,x,M,P,$;if(l)[x,M,P,$]=l;else{d=st(m,h,-b),m=d.x,h=d.y,d=st(u,y,-b),u=d.x,y=d.y;const w=(m-u)/2,I=(h-y)/2;let v=w*w/(f*f)+I*I/(g*g);v>1&&(v=Math.sqrt(v),f*=v,g*=v);const Bt=f*f,Ht=g*g,Ve=(i===o?-1:1)*Math.sqrt(Math.abs((Bt*Ht-Bt*I*I-Ht*w*w)/(Bt*I*I+Ht*w*w)));P=Ve*f*I/g+(m+u)/2,$=Ve*-g*w/f+(h+y)/2,x=Math.asin(((h-$)/g*10**9>>0)/10**9),M=Math.asin(((y-$)/g*10**9>>0)/10**9),x=mM&&(x-=Math.PI*2),!o&&M>x&&(M-=Math.PI*2)}let q=M-x;if(Math.abs(q)>p){const w=M,I=u,v=y;M=x+p*(o&&M>x?1:-1),u=P+f*Math.cos(M),y=$+g*Math.sin(M),A=xt(u,y,f,g,n,0,o,I,v,[M,w,P,$])}q=M-x;const T=Math.cos(x),N=Math.sin(x),Z=Math.cos(M),J=Math.sin(M),z=Math.tan(q/4),C=4/3*f*z,k=4/3*g*z,D=[m,h],E=[m+C*N,h-k*T],H=[u+C*J,y-k*Z],tt=[u,y];if(E[0]=2*D[0]-E[0],E[1]=2*D[1]-E[1],l)return[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);A=[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);const K=[];for(let w=0,I=A.length;w{const o=.3333333333333333,a=2/3;return[o*e+a*r,o*t+a*s,o*n+a*r,o*i+a*s,n,i]},Qt=(e,t,r,s)=>{const n=O([e,t],[r,s],.3333333333333333),i=O([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Ce=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(xt(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Me(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Qt(o,a,n,i)):r==="Z"?["C"].concat(Qt(o,a,c,l)):e},pt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-a,u=o*2-c;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},ot={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},bt=e=>{const t={...ot},r=j(e);return Q(r,(s,n,i,o)=>{t.x=i,t.y=o;const a=pt(s,t);let c=Ce(a,t);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return t.x1=+c[m-2],t.y1=+c[m-1],t.x2=+c[m-4]||t.x1,t.y2=+c[m-3]||t.y1,c})},Zt=(e,t)=>{const r=e.length;let{round:s}=_,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=j(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,b=0,A=0,d=0,x=0;Q(t,($,q,T,N)=>{[r]=$;const Z=r.toUpperCase(),z=Z!==r?it($,q,T,N):$.slice(0),C=Z==="V"?["L",T,z[1]]:Z==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(Z)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Lt(T,N,C[1],C[2]);else if(r==="A")[h,f,g,u]=ne(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const k=y*2-b,D=p*2-A;[h,f,g,u]=kt(T,N,k,D,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,g,u]=kt(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=y*2-d,x=p*2-x,[h,f,g,u]=It(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,g,u]=It(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,g,u]=Lt(T,N,s,n));a=o(h,a),c=o(f,c),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:C.slice(-2),[b,A]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[y,p]});const M=l-a,P=m-c;return{width:M,height:P,x:a,y:c,x2:l,y2:m,cx:a+M/2,cy:c+P/2,cz:Math.max(M,P)+Math.min(M,P)/2}},Y=e=>{const t=j(e);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Q(t,(f,g,u,y)=>{[c]=f;const p=c.toUpperCase(),A=p!==c?it(f,g,u,y):f.slice(0),d=p==="V"?["L",u,A[1]]:p==="H"?["L",A[1],y]:A;if([c]=d,"TQ".includes(p)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=nt(u,y,d[1],d[2]);else if(c==="A")h+=$t(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,M=s*2-i;h+=gt(u,y,x,M,d[1],d[2],d[3],d[4])}else c==="C"?h+=gt(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=yt(u,y,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=yt(u,y,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=nt(u,y,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},At=1e-5,ct=e=>{const t=j(e),r={...ot};return Q(t,(s,n,i,o)=>{r.x=i,r.y=o;const a=pt(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},at=(e,t)=>{const r=ct(e);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof t=="number";let h={x:c,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[b,A].concat(y.slice(1)),s?([,c,l]=y,h={x:c,y:l},f=0):i==="L"?(h=wt(n[0],n[1],n[2],n[3],t-u),f=nt(n[0],n[1],n[2],n[3])):i==="A"?(h=ee(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=$t(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=me(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=gt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=he(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=yt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[b,A,c,l],h={x:c,y:l},f=nt(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-At?{x:o,y:a}:g)},Dt=(e,t)=>{const r=j(e);let s=r.slice(0),n=Y(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:c,index:0,length:a,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=Y(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=Y(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},Mt=(e,t)=>{const r=j(e),s=ct(r),n=Y(s),i=x=>{const M=x.x-t.x,P=x.y-t.y;return M*M+P*P};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let x=0;x<=n;x+=o)a=at(s,x),l=i(a),l1e-6&&(u=m-o,f=at(s,u),p=i(f),y=m+o,g=at(s,y),b=i(g),u>=0&&pMt(e,t).closest,Ge=(e,t,r,s,n,i,o,a)=>3*((a-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+a*(n+e/3)-o*(i+t/3))/20,Se=e=>{let t=0,r=0,s=0;return bt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=Ge(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Ue=e=>Se(bt(e))>=0,_e=(e,t)=>Dt(e,t).segment,Je=(e,t)=>Mt(e,t).segment,Ct=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return W[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,Ne=e=>Ct(e)&&e.every(([t])=>t===t.toUpperCase()),we=e=>Ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Ke=e=>we(e)&&e.every(([t])=>"MC".includes(t)),We=(e,t)=>{const{distance:r}=Mt(e,t);return Math.abs(r)Ct(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),Le=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Rt(e);for(X(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Ye=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},tn=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ve=e=>{const t=Object.keys(lt),r=Te(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:e.type,i=lt[n],o={type:n};r?i.forEach(c=>{o[c]=e.getAttribute(c)}):Object.assign(o,e);let a=[];return n==="circle"?a=en(o):n==="ellipse"?a=nn(o):["polyline","polygon"].includes(n)?a=tn(o):n==="rect"?a=rn(o):n==="line"?a=Ye(o):["glyph","path"].includes(n)&&(a=j(r?e.getAttribute("d")||"":e.d||"")),Ct(a)&&a.length?a:!1},sn=(e,t,r)=>{const s=r||document,n=Object.keys(lt),i=Te(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:e.type,l=lt[c],m={type:c},h=_.round,f=ve(e),g=f&&f.length?Zt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||a.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),Le(g)?(a.setAttribute("d",g),t&&i&&(e.before(a,e),e.remove()),a):!1},$e=(e,t,r,s)=>{const[n]=e,{round:i}=_,o=i,a=t.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=a.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,o)===L(u,o))return["V",y];if(L(g,o)===L(y,o))return["H",u]}else if(n==="C"){const[b,A]=a;if(r.x1=b,r.y1=A,"CS".includes(s)&&(L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o)||L(c,o)===L(m*2-f,o)&&L(l,o)===L(h*2-g,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[b,A]=a;if(r.qx=b,r.qy=A,"QT".includes(s)&&L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o))return["T",a[2],a[3]]}return p},Pt=(e,t)=>{const r=e.slice(1).map(s=>L(s,t));return[e[0]].concat(r)},qe=(e,t)=>{const r=dt(e),s=typeof t=="number"&&t>=0?t:2,n={...ot},i=[];let o="M",a="Z";return Q(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=pt(c,n);let g=c;if([o]=c,i[l]=o,l){a=i[l-1];const y=$e(c,f,n,a),p=Pt(y,s),b=p.join(""),A=jt(y,l,m,h),d=Pt(A,s),x=d.join("");g=b.length{const t=dt(e),r=ct(t),s=t.length,n=t[s-1][0]==="Z",i=Q(t,(o,a)=>{const c=r[a],l=a&&t[a-1],m=l&&l[0],h=t[a+1],f=h&&h[0],[g]=o,[u,y]=r[a?a-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,y]:p=[g,c[1],c[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ze=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...ot};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?c.x:0,i+=g?c.y:0,o=n,a=i,r=[g?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=g?c.x:0):h==="V"?([,i]=l,i+=g?c.y:0):([n,i]=l.slice(-2),n+=g?c.x:0,i+=g?c.y:0),r.push(l)),c.x=n,c.y=i,t[s]=r}),t},ke=e=>{let t=new S;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:a}=e,{scale:c}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||a||c)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(t=a[0]?t.skewX(a[0]):t,t=a[1]?t.skewY(a[1]):t):typeof a=="number"&&!Number.isNaN(a)&&(t=t.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?t=t.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(t=t.scale(c)),t=t.translate(-s,-n)),t},on=(e,t)=>{let r=S.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ot=(e,t,r)=>{const[s,n,i]=r,[o,a,c]=on(e,[t[0],t[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},Ie=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=j(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:_.origin});const h=t.origin,f=ke(t);return f.isIdentity?l.slice(0):Q(l,(g,u,y,p)=>{[c]=g;const b=c.toUpperCase(),d=b!==c?it(g,u,y,p):g.slice(0);let x=b==="A"?["C"].concat(xt(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",y,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const M=c==="C"&&x.length>7,P=M?x.slice(0,7):x.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(x.slice(7))),x=P),c==="L")[n,i]=Ot(f,[x[1],x[2]],h),r!==n&&s!==i?x=["L",n,i]:s===i?x=["H",n]:r===n&&(x=["V",i]);else for(o=1,a=x.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},an=(e,t)=>{let{round:r}=_;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):Q(e,s=>Pt(s,r))},ln=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),a=O(s,n,r),c=O(n,i,r),l=O(i,o,r),m=O(a,c,r),h=O(c,l,r),f=O(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class mn{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=j(t);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return Pe(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return at(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=dt(t),this}toRelative(){const{segments:t}=this;return this.segments=Ae(t),this}toCurve(){const{segments:t}=this;return this.segments=bt(t),this}reverse(t){const{segments:r}=this,s=ze(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>t?c?St(a):a.slice(0):St(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:St(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=ct(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=qe(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(c=>c in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(t))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=Ie(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return Zt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return S}static get arcTools(){return Ze}static get bezierTools(){return De}static get cubicTools(){return Oe}static get lineTools(){return Qe}static get polygonTools(){return He}static get quadTools(){return Be}static get pathToAbsolute(){return dt}static get pathToRelative(){return Ae}static get pathToCurve(){return bt}static get pathToString(){return Zt}static get distanceSquareRoot(){return ut}static get midPoint(){return O}static get rotateVector(){return st}static get roundTo(){return L}static get parsePathString(){return j}static get finalizeSegment(){return Vt}static get invalidPathValue(){return G}static get isArcCommand(){return pe}static get isDigit(){return F}static get isDigitStart(){return xe}static get isMoveCommand(){return be}static get isPathCommand(){return de}static get isSpace(){return ye}static get paramsCount(){return W}static get paramsParser(){return ot}static get pathParser(){return Rt}static get scanFlag(){return fe}static get scanParam(){return ge}static get scanSegment(){return Et}static get skipSpaces(){return X}static get distanceEpsilon(){return At}static get getClosestPoint(){return Fe}static get getDrawDirection(){return Ue}static get getPathArea(){return Se}static get getPathBBox(){return Pe}static get getPointAtLength(){return at}static get getPropertiesAtLength(){return Dt}static get getPropertiesAtPoint(){return Mt}static get getSegmentAtLength(){return _e}static get getSegmentOfPoint(){return Je}static get getTotalLength(){return Y}static get isAbsoluteArray(){return Ne}static get isCurveArray(){return Ke}static get isNormalizedArray(){return we}static get isPathArray(){return Ct}static get isPointInStroke(){return We}static get isRelativeArray(){return Xe}static get isValidPath(){return Le}static get shapeParams(){return lt}static get shapeToPath(){return sn}static get shapeToPathArray(){return ve}static get absolutizeSegment(){return it}static get arcToCubic(){return xt}static get getSVGMatrix(){return ke}static get iterate(){return Q}static get lineToCubic(){return Qt}static get normalizePath(){return ct}static get normalizeSegment(){return pt}static get optimizePath(){return qe}static get projection2d(){return Ot}static get quadToCubic(){return Me}static get relativizeSegment(){return jt}static get reverseCurve(){return cn}static get reversePath(){return St}static get roundPath(){return an}static get roundSegment(){return Pt}static get segmentToCubic(){return Ce}static get shortenSegment(){return $e}static get splitCubic(){return ln}static get splitPath(){return ze}static get transformPath(){return Ie}}return mn}(); //# sourceMappingURL=svg-path-commander.js.map diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index 6739cf9..8852bd5 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs b/dist/svg-path-commander.mjs index a3bd40a..005b9be 100644 --- a/dist/svg-path-commander.mjs +++ b/dist/svg-path-commander.mjs @@ -1,2 +1,2 @@ -import mn from"@thednp/dommatrix";var It=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=It;var $t=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),oe=$t;var ae=(t,e,n,o)=>oe([t,e],[n,o]),Se=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=oe([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},we=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},ft={getLineBBox:we,getLineLength:ae,getPointAtLineLength:Se};var et=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},se=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},Ye=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},ze=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},$={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},re={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=Ye({x:1,y:0},re),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=Ye(re,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let j=q+Q;return{center:$,startAngle:q,endAngle:j,rx:p,ry:h}},Ae=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=ze(t,e,n,o,r,s,a,i,m);return et(u,c,f-l)},tt=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=ze(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=et(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Se(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},rt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=ze(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,$=A(l,c*R),re=$+y,q=[i],x=[m],Q=h(t,i),j=P(t,i),O=h(e,m),F=P(e,m),ge=g-p*1e-5,ne=se(b,d,c,l,C,ge),N=g-p*.99999,D=se(b,d,c,l,C,N);if(ne[0]>j||D[0]>j){let z=se(b,d,c,l,C,w);q.push(z[0]),x.push(z[1])}if(ne[0]F||D[1]>F){let z=se(b,d,c,l,C,$);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),j=P.apply([],q),F=P.apply([],x),[Q,O,j,F]},gt={angleBetween:Ye,arcLength:et,arcPoint:se,getArcBBox:rt,getArcLength:Ae,getArcProps:ze,getPointAtArcLength:tt};var nt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],ht=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],bt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Pt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},dt=t=>{let n=nt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oyt(n[0],o))},xt=1e-8,Ce=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]},St={bezierLength:dt,calculateBezier:Pt,CBEZIER_MINMAX_EPSILON:xt,computeBezier:yt,Cvalues:ht,deriveBezier:bt,getBezierLength:me,minmaxC:Re,minmaxQ:Ce,Tvalues:nt};var At=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},he=(t,e,n,o,r,s,a,i)=>me([t,e,n,o,r,s,a,i]),ot=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=me([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=At([t,e,n,o,r,s,a,i],m/l))}return c},Ve=(t,e,n,o,r,s,a,i)=>{let m=Re([t,n,r,a]),u=Re([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},Ct={getCubicBBox:Ve,getCubicLength:he,getPointAtCubicLength:ot,getPointAtCubicSegmentLength:At};var Tt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},be=(t,e,n,o,r,s)=>me([t,e,n,o,r,s]),at=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=me([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Tt([t,e,n,o,r,s],a/u))}return m},ke=(t,e,n,o,r,s)=>{let a=Ce([t,n,r]),i=Ce([e,o,s]);return[a[0],i[0],a[1],i[1]]},Mt={getPointAtQuadLength:at,getPointAtQuadSegmentLength:Tt,getQuadBBox:ke,getQuadLength:be};var jt=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+oe(t[o-1],n):0,0),Lt={polygonArea:jt,polygonLength:Bt};var Ht=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ie=Ht;var Zt=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=Zt;var Gt={origin:[0,0,0],round:4},I=Gt;var _t={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=_t;var Ut=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Te=Ut;var Ft="SVGPathCommander Error",V=Ft;var Kt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},qe=Kt;var Jt=t=>t>=48&&t<=57,B=Jt;var Wt="Invalid path value",H=Wt;var Xt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${V}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),De=Yt;var er=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ee=tr;var rr=t=>B(t)||t===43||t===45||t===46,Oe=rr;var nr=t=>(t|32)===97,Ie=nr;var or=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},$e=or;var ar=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Ee(s)){t.err=`${V}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!$e(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Te(t);return}for(;;){for(let m=a;m>0;m-=1){if(Ie(s)&&(m===3||m===4)?qe(t):Qe(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Oe(n.charCodeAt(t.index)))break}Te(t)},ye=ar;var K=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var sr=t=>{if(typeof t!="string")return t.slice(0);let e=new K(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},ue=ur;var cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,Pe)},st=lr;var vt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ie(c,l,-S),c=y.x,l=y.y,y=ie(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let We=f*f,Xe=g*g,pt=(s===a?-1:1)*Math.sqrt(Math.abs((We*Xe-We*D*D-Xe*N*N)/(We*D*D+Xe*N*N)));C=pt*f*D/g+(c+p)/2,R=pt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=vt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),$=Math.cos(d),re=Math.sin(d),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,j=[c,l],O=[c+x*v,l-Q*w],F=[p+x*re,h-Q*$],ge=[p,h];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);A=[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);let ne=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},je=pr;var fr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Me=fr;var gr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(de(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(je(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Me(a,i,r,s)):n==="Z"?["C"].concat(Me(a,i,m,u)):t},Be=gr;var hr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=hr;var br={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=br;var yr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Be(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ce=yr;var Pr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let $=n.toUpperCase(),q=$!==n?_(R,k,w,v):R.slice(0),x=$==="V"?["L",w,q[1]]:$==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes($)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=we(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=rt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,j=P*2-A;[l,f,g,p]=Ve(w,v,Q,j,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ve(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=ke(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=ke(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=we(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},mt=dr;var xr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=ae(p,h,y[1],y[2]);else if(m==="A")l+=Ae(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=he(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=he(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=be(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=be(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=ae(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},J=xr;var le=1e-5;var Sr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},W=Sr;var Ar=(t,e)=>{let n=W(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Se(r[0],r[1],r[2],r[3],e-p),f=ae(r[0],r[1],r[2],r[3])):s==="A"?(l=tt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ae(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=ot(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=he(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=at(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=be(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=ae(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-le?{x:a,y:i}:g)},pe=Ar;var Cr=(t,e)=>{let n=L(t),o=n.slice(0),r=J(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=J(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=J(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},xe=Cr;var Tr=(t,e)=>{let n=L(t),o=W(n),r=J(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=pe(o,b),u=s(i),u1e-6&&(p=c-a,f=pe(o,p),P=s(f),h=c+a,g=pe(o,h),S=s(g),p>=0&&PY(t,e).closest,Nt=Mr;var Lr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,vr=t=>{let e=0,n=0,o=0;return ce(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Lr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},He=vr;var Nr=t=>He(ce(t))>=0,wt=Nr;var wr=(t,e)=>xe(t,e).segment,zt=wr;var zr=(t,e)=>Y(t,e).segment,Rt=zr;var Rr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Rr;var Vr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ze=Vr;var kr=t=>Ze(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ge=kr;var qr=t=>Ge(t)&&t.every(([e])=>"MC".includes(e)),Vt=qr;var Qr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),qt=Dr;var Er=t=>{if(typeof t!="string"||!t.length)return!1;let e=new K(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Ue=Ir;var $r=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},jr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Hr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Zr=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Gr=t=>{let e=Object.keys(te),n=Ue(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Br(a):r==="ellipse"?i=Hr(a):["polyline","polygon"].includes(r)?i=jr(a):r==="rect"?i=Zr(a):r==="line"?i=$r(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Fe=Gr;var _r=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Ue(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Fe(t),g=f&&f.length?Le(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),_e(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Qt=_r;var Ur=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Ke=Ur;var Fr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},fe=Fr;var Kr=(t,e)=>{let n=ue(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Ke(m,f,r,i),P=fe(h,o),S=P.join(""),A=Pe(h,u,c,l),y=fe(A,o),b=y.join("");g=S.length{let e=ue(t),n=W(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},ve=Jr;var Wr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},ut=Wr;import Xr from"@thednp/dommatrix";var Yr=t=>{let e=new Xr,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Je=Yr;import en from"@thednp/dommatrix";var tn=(t,e)=>{let n=en.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},rn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=tn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Ne=rn;var nn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Je(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(de(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Ne(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Dt=on;var an=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>fe(o,n))},Et=an;var sn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},Ot=sn;var lt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return mt(this.segments)}get length(){return J(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return pe(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=ue(e),this}toRelative(){let{segments:e}=this;return this.segments=st(e),this}toCurve(){let{segments:e}=this;return this.segments=ce(e),this}reverse(e){let{segments:n}=this,o=ut(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?ve(i):i.slice(0):ve(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:ve(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=W(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=it(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=ct(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Le(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return mn}static get arcTools(){return gt}static get bezierTools(){return St}static get cubicTools(){return Ct}static get lineTools(){return ft}static get polygonTools(){return Lt}static get quadTools(){return Mt}static get pathToAbsolute(){return ue}static get pathToRelative(){return st}static get pathToCurve(){return ce}static get pathToString(){return Le}static get distanceSquareRoot(){return oe}static get midPoint(){return E}static get rotateVector(){return ie}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Te}static get invalidPathValue(){return H}static get isArcCommand(){return Ie}static get isDigit(){return B}static get isDigitStart(){return Oe}static get isMoveCommand(){return $e}static get isPathCommand(){return Ee}static get isSpace(){return De}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return K}static get scanFlag(){return qe}static get scanParam(){return Qe}static get scanSegment(){return ye}static get skipSpaces(){return G}static get distanceEpsilon(){return le}static get getClosestPoint(){return Nt}static get getDrawDirection(){return wt}static get getPathArea(){return He}static get getPathBBox(){return mt}static get getPointAtLength(){return pe}static get getPropertiesAtLength(){return xe}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return zt}static get getSegmentOfPoint(){return Rt}static get getTotalLength(){return J}static get isAbsoluteArray(){return Ze}static get isCurveArray(){return Vt}static get isNormalizedArray(){return Ge}static get isPathArray(){return ee}static get isPointInStroke(){return kt}static get isRelativeArray(){return qt}static get isValidPath(){return _e}static get shapeParams(){return te}static get shapeToPath(){return Qt}static get shapeToPathArray(){return Fe}static get absolutizeSegment(){return _}static get arcToCubic(){return de}static get getSVGMatrix(){return Je}static get iterate(){return T}static get lineToCubic(){return Me}static get normalizePath(){return W}static get normalizeSegment(){return X}static get optimizePath(){return it}static get projection2d(){return Ne}static get quadToCubic(){return je}static get relativizeSegment(){return Pe}static get reverseCurve(){return Dt}static get reversePath(){return ve}static get roundPath(){return Et}static get roundSegment(){return fe}static get segmentToCubic(){return Be}static get shortenSegment(){return Ke}static get splitCubic(){return Ot}static get splitPath(){return ut}static get transformPath(){return ct}},xi=lt;export{mn as CSSMatrix,_ as absolutizeSegment,de as arcToCubic,gt as arcTools,St as bezierTools,Ct as cubicTools,xi as default,le as distanceEpsilon,oe as distanceSquareRoot,Te as finalizeSegment,Nt as getClosestPoint,wt as getDrawDirection,He as getPathArea,mt as getPathBBox,pe as getPointAtLength,xe as getPropertiesAtLength,Y as getPropertiesAtPoint,Je as getSVGMatrix,zt as getSegmentAtLength,Rt as getSegmentOfPoint,J as getTotalLength,H as invalidPathValue,Ze as isAbsoluteArray,Ie as isArcCommand,Vt as isCurveArray,B as isDigit,Oe as isDigitStart,$e as isMoveCommand,Ge as isNormalizedArray,ee as isPathArray,Ee as isPathCommand,kt as isPointInStroke,qt as isRelativeArray,De as isSpace,_e as isValidPath,T as iterate,Me as lineToCubic,ft as lineTools,E as midPoint,W as normalizePath,X as normalizeSegment,it as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,K as pathParser,ue as pathToAbsolute,ce as pathToCurve,st as pathToRelative,Le as pathToString,Lt as polygonTools,Ne as projection2d,je as quadToCubic,Mt as quadTools,Pe as relativizeSegment,Dt as reverseCurve,ve as reversePath,ie as rotateVector,Et as roundPath,fe as roundSegment,M as roundTo,qe as scanFlag,Qe as scanParam,ye as scanSegment,Be as segmentToCubic,te as shapeParams,Qt as shapeToPath,Fe as shapeToPathArray,Ke as shortenSegment,G as skipSpaces,Ot as splitCubic,ut as splitPath,ct as transformPath}; +import un from"@thednp/dommatrix";var Bt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Bt;var $t=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=$t;var ce=(t,e,n,o)=>re([t,e],[n,o]),Le=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Ge=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},ot={getLineBBox:Ge,getLineLength:ce,getPointAtLineLength:Le};var st=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},pe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},at=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},_e=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,d=(e-m)/2,b={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},P=b.x**2/p**2+b.y**2/h**2;P>1&&(p*=f(P),h*=f(P));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,V=p**2*b.y**2+h**2*b.x**2,k=C/V;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},j={x:c(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+c(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=at({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=at(ue,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let H=q+Q;return{center:j,startAngle:q,endAngle:H,rx:p,ry:h}},ve=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=_e(t,e,n,o,r,s,a,i,m);return st(u,l,f-c)},mt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:g,startAngle:p,endAngle:h}=_e(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let y=st(f,g,h-p);if(u<=0)l={x:t,y:e};else if(u>=y)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Le(t,e,i,m,u);let{PI:S,cos:A,sin:d}=Math,b=h-p,C=(r%360+360)%360*(S/180),V=p+b*(u/y),k=f*A(V),w=g*d(V);l={x:A(C)*k-d(C)*w+c.x,y:d(C)*k+A(C)*w+c.y}}}return l},it=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:g}=_e(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:b,y:P}=u,C=r*d/180,V=S(C),k=A(-c*V,l),w=k,v=k+d,j=A(c,l*V),ue=j+d,q=[i],x=[m],Q=h(t,i),H=y(t,i),O=h(e,m),W=y(e,m),ye=g-p*1e-5,le=pe(b,P,l,c,C,ye),N=g-p*.99999,D=pe(b,P,l,c,C,N);if(le[0]>H||D[0]>H){let z=pe(b,P,l,c,C,w);q.push(z[0]),x.push(z[1])}if(le[0]W||D[1]>W){let z=pe(b,P,l,c,C,j);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),H=y.apply([],q),W=y.apply([],x),[Q,O,H,W]},ut={angleBetween:at,arcLength:st,arcPoint:pe,getArcBBox:it,getArcLength:ve,getArcProps:_e,getPointAtArcLength:mt};var lt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],zt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Vt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},kt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},qt=t=>{let n=lt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oRt(n[0],o))},Qt=1e-8,Ne=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]},ct={bezierLength:qt,calculateBezier:kt,CBEZIER_MINMAX_EPSILON:Qt,computeBezier:Rt,Cvalues:zt,deriveBezier:Vt,getBezierLength:fe,minmaxC:Ue,minmaxQ:Ne,Tvalues:lt};var Dt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},Pe=(t,e,n,o,r,s,a,i)=>fe([t,e,n,o,r,s,a,i]),pt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=fe([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=Dt([t,e,n,o,r,s,a,i],m/c))}return l},Fe=(t,e,n,o,r,s,a,i)=>{let m=Ue([t,n,r,a]),u=Ue([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},ft={getCubicBBox:Fe,getCubicLength:Pe,getPointAtCubicLength:pt,getPointAtCubicSegmentLength:Dt};var Et=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},xe=(t,e,n,o,r,s)=>fe([t,e,n,o,r,s]),gt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=fe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Et([t,e,n,o,r,s],a/u))}return m},Ke=(t,e,n,o,r,s)=>{let a=Ne([t,n,r]),i=Ne([e,o,s]);return[a[0],i[0],a[1],i[1]]},ht={getPointAtQuadLength:gt,getPointAtQuadSegmentLength:Et,getQuadBBox:Ke,getQuadLength:xe};var jt=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),bt={polygonArea:jt,polygonLength:Ht};var Zt=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=Zt;var Gt=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=Gt;var _t={origin:[0,0,0],round:4},I=_t;var Ut={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=Ut;var Ft=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Se=Ft;var Kt="SVGPathCommander Error",R=Kt;var Jt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},we=Jt;var Wt=t=>t>=48&&t<=57,B=Wt;var Xt="Invalid path value",$=Xt;var Yt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${R}: ${$} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${R}: ${$} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ve=er;var tr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Re=rr;var nr=t=>B(t)||t===43||t===45||t===46,ke=nr;var or=t=>(t|32)===97,qe=or;var ar=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Qe=ar;var sr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Re(s)){t.err=`${R}: ${$} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Qe(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${R}: ${$} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Se(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?we(t):ze(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!ke(n.charCodeAt(t.index)))break}Se(t)},ge=sr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var mr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=lr;var cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,he)},Je=pr;var Ot=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,g=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,b,P,C,V;if(u)[b,P,C,V]=u;else{d=ne(l,c,-S),l=d.x,c=d.y,d=ne(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,D=(c-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let rt=f*f,nt=g*g,wt=(s===a?-1:1)*Math.sqrt(Math.abs((rt*nt-rt*D*D-nt*N*N)/(rt*D*D+nt*N*N)));C=wt*f*D/g+(l+p)/2,V=wt*-g*N/f+(c+h)/2,b=Math.asin(((c-V)/g*10**9>>0)/10**9),P=Math.asin(((h-V)/g*10**9>>0)/10**9),b=lP&&(b-=Math.PI*2),!a&&P>b&&(P-=Math.PI*2)}let k=P-b;if(Math.abs(k)>y){let N=P,D=p,z=h;P=b+y*(a&&P>b?1:-1),p=C+f*Math.cos(P),h=V+g*Math.sin(P),A=Ot(p,h,f,g,r,0,a,D,z,[P,N,C,V])}k=P-b;let w=Math.cos(b),v=Math.sin(b),j=Math.cos(P),ue=Math.sin(P),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,H=[l,c],O=[l+x*v,c-Q*w],W=[p+x*ue,h-Q*j],ye=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],ye[0],ye[1]].concat(A);A=[O[0],O[1],W[0],W[1],ye[0],ye[1]].concat(A);let le=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},De=fr;var gr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ae=gr;var hr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(be(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(De(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ae(a,i,r,s)):n==="Z"?["C"].concat(Ae(a,i,m,u)):t},Ee=hr;var br=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((g,p)=>g+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=br;var dr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=dr;var yr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Ee(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ae=yr;var Pr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,g=0,p=0,h=0,y=0,S=0,A=0,d=0,b=0;T(e,(V,k,w,v)=>{[n]=V;let j=n.toUpperCase(),q=j!==n?_(V,k,w,v):V.slice(0),x=j==="V"?["L",w,q[1]]:j==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(j)||(d=0,b=0);if(n==="M")[,o,r]=x,c=o,f=r,g=o,p=r;else if(n==="L")[c,f,g,p]=Ge(w,v,x[1],x[2]);else if(n==="A")[c,f,g,p]=it(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,H=y*2-A;[c,f,g,p]=Fe(w,v,Q,H,x[1],x[2],x[3],x[4])}else n==="C"?[c,f,g,p]=Fe(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(d=h*2-d,b=y*2-b,[c,f,g,p]=Ke(w,v,d,b,x[1],x[2])):n==="Q"?(d=x[1],b=x[2],[c,f,g,p]=Ke(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([c,f,g,p]=Ge(w,v,o,r));i=a(c,i),m=a(f,m),u=s(g,u),l=s(p,l),[h,y]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,y]});let P=u-i,C=l-m;return{width:P,height:C,x:i,y:m,x2:u,y2:l,cx:i+P/2,cy:m+C/2,cz:Math.max(P,C)+Math.min(P,C)/2}},We=xr;var Sr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return T(e,(f,g,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?_(f,g,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(a=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=ce(p,h,d[1],d[2]);else if(m==="A")c+=ve(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let b=n*2-r,P=o*2-s;c+=Pe(p,h,b,P,d[1],d[2],d[3],d[4])}else m==="C"?c+=Pe(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=xe(p,h,a,i,d[1],d[2])):m==="Q"?(a=d[1],i=d[2],c+=xe(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=ce(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,s]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o]}),c},K=Sr;var se=1e-5;var Ar=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Ar;var Cr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,g=c,p=0;return!l||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):s==="L"?(c=Le(r[0],r[1],r[2],r[3],e-p),f=ce(r[0],r[1],r[2],r[3])):s==="A"?(c=mt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=ve(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=Pe(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=gt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=ce(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Cr;var Tr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},de=Tr;var Mr=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let P=b.x-e.x,C=b.y-e.y;return P*P+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=l-a,f=me(o,p),y=s(f),h=l+a,g=me(o,h),S=s(g),p>=0&&yY(t,e).closest,dt=Lr;var vr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,Nr=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=vr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Oe=Nr;var wr=t=>Oe(ae(t))>=0,yt=wr;var zr=(t,e)=>de(t,e).segment,Pt=zr;var Vr=(t,e)=>Y(t,e).segment,xt=Vr;var Rr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Rr;var kr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ie=kr;var qr=t=>Ie(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Be=qr;var Qr=t=>Be(t)&&t.every(([e])=>"MC".includes(e)),St=Qr;var Dr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Ct=Er;var Or=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Xe=Br;var $r=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},jr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Zr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Gr=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},_r=t=>{let e=Object.keys(te),n=Xe(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${R}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Hr(a):r==="ellipse"?i=Zr(a):["polyline","polygon"].includes(r)?i=jr(a):r==="rect"?i=Gr(a):r==="line"?i=$r(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},je=_r;var Ur=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Xe(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${R}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${R}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],l={type:m},c=I.round,f=je(t),g=f&&f.length?Ce(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p])})),$e(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Tt=Ur;var Fr=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:g}=n,[p,h]=i.slice(-2),y=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a)||M(m,a)===M(l*2-f,a)&&M(u,a)===M(c*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a))return["T",i[2],i[3]]}return y},He=Fr;var Kr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=Kr;var Jr=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=He(m,f,r,i),y=ie(h,o),S=y.join(""),A=he(h,u,l,c),d=ie(A,o),b=d.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),y=a;switch(g){case"M":y=r?["Z"]:[g,p,h];break;case"A":y=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":c&&f==="S"?y=["S",a[1],a[2],p,h]:y=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[g,m[1],m[2],p,h];break;case"Q":c&&f==="T"?y=["T",p,h]:y=[g,a[1],a[2],p,h];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[g,p,h];break;case"Z":y=["M",p,h];break;case"H":y=[g,p];break;case"V":y=[g,h];break;default:y=[g].concat(a.slice(1,-2),p,h)}return y});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Te=Wr;var Xr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),g=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=g?m.x:0):c==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},et=Xr;import Yr from"@thednp/dommatrix";var en=t=>{let e=new Yr,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ze=en;import tn from"@thednp/dommatrix";var rn=(t,e)=>{let n=tn.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},nn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=rn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},Me=nn;var on=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let c=e.origin,f=Ze(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,y)=>{[m]=g;let S=m.toUpperCase(),d=S!==m?_(g,p,h,y):g.slice(0),b=S==="A"?["C"].concat(be(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=b[0];let P=m==="C"&&b.length>7,C=P?b.slice(0,7):b.slice(0);if(P&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Me(f,[b[1],b[2]],c);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Mt=an;var sn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Lt=sn;var mn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),l=E(i,m,n),c=E(m,u,n),f=E(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},vt=mn;var Nt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${R}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return We(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=Je(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=et(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Te(i):i.slice(0):Te(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Te(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Ye(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=tt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Ce(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return un}static get arcTools(){return ut}static get bezierTools(){return ct}static get cubicTools(){return ft}static get lineTools(){return ot}static get polygonTools(){return bt}static get quadTools(){return ht}static get pathToAbsolute(){return oe}static get pathToRelative(){return Je}static get pathToCurve(){return ae}static get pathToString(){return Ce}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Se}static get invalidPathValue(){return $}static get isArcCommand(){return qe}static get isDigit(){return B}static get isDigitStart(){return ke}static get isMoveCommand(){return Qe}static get isPathCommand(){return Re}static get isSpace(){return Ve}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return we}static get scanParam(){return ze}static get scanSegment(){return ge}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return dt}static get getDrawDirection(){return yt}static get getPathArea(){return Oe}static get getPathBBox(){return We}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return de}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return Pt}static get getSegmentOfPoint(){return xt}static get getTotalLength(){return K}static get isAbsoluteArray(){return Ie}static get isCurveArray(){return St}static get isNormalizedArray(){return Be}static get isPathArray(){return ee}static get isPointInStroke(){return At}static get isRelativeArray(){return Ct}static get isValidPath(){return $e}static get shapeParams(){return te}static get shapeToPath(){return Tt}static get shapeToPathArray(){return je}static get absolutizeSegment(){return _}static get arcToCubic(){return be}static get getSVGMatrix(){return Ze}static get iterate(){return T}static get lineToCubic(){return Ae}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return Ye}static get projection2d(){return Me}static get quadToCubic(){return De}static get relativizeSegment(){return he}static get reverseCurve(){return Mt}static get reversePath(){return Te}static get roundPath(){return Lt}static get roundSegment(){return ie}static get segmentToCubic(){return Ee}static get shortenSegment(){return He}static get splitCubic(){return vt}static get splitPath(){return et}static get transformPath(){return tt}},It=Nt;import{default as Li}from"@thednp/dommatrix";var Ci=It;export{Li as CSSMatrix,_ as absolutizeSegment,be as arcToCubic,ut as arcTools,ct as bezierTools,ft as cubicTools,Ci as default,se as distanceEpsilon,re as distanceSquareRoot,Se as finalizeSegment,dt as getClosestPoint,yt as getDrawDirection,Oe as getPathArea,We as getPathBBox,me as getPointAtLength,de as getPropertiesAtLength,Y as getPropertiesAtPoint,Ze as getSVGMatrix,Pt as getSegmentAtLength,xt as getSegmentOfPoint,K as getTotalLength,$ as invalidPathValue,Ie as isAbsoluteArray,qe as isArcCommand,St as isCurveArray,B as isDigit,ke as isDigitStart,Qe as isMoveCommand,Be as isNormalizedArray,ee as isPathArray,Re as isPathCommand,At as isPointInStroke,Ct as isRelativeArray,Ve as isSpace,$e as isValidPath,T as iterate,Ae as lineToCubic,ot as lineTools,E as midPoint,J as normalizePath,X as normalizeSegment,Ye as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,F as pathParser,oe as pathToAbsolute,ae as pathToCurve,Je as pathToRelative,Ce as pathToString,bt as polygonTools,Me as projection2d,De as quadToCubic,ht as quadTools,he as relativizeSegment,Mt as reverseCurve,Te as reversePath,ne as rotateVector,Lt as roundPath,ie as roundSegment,M as roundTo,we as scanFlag,ze as scanParam,ge as scanSegment,Ee as segmentToCubic,te as shapeParams,Tt as shapeToPath,je as shapeToPathArray,He as shortenSegment,G as skipSpaces,vt as splitCubic,et as splitPath,tt as transformPath}; //# sourceMappingURL=svg-path-commander.mjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index 19c82ce..912f0b4 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"AACA,OAAOA,OAAe,oBCUtB,IAAMC,GAAW,CAACC,EAAeC,EAAeC,IAA0B,CACxE,GAAM,CAACC,EAAIC,CAAE,EAAIJ,EACX,CAACK,EAAIC,CAAE,EAAIL,EACjB,MAAO,CAACE,GAAME,EAAKF,GAAMD,EAAGE,GAAME,EAAKF,GAAMF,CAAC,CAChD,EAEOK,EAAQR,GCPf,IAAMS,GAAqB,CAACC,EAAeC,IAClC,KAAK,MACTD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAC7D,EAGKC,GAAQH,GCJf,IAAMI,GAAgB,CAACC,EAAYC,EAAYC,EAAYC,IAClDC,GAAmB,CAACJ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EAaxCE,GAAuB,CAC3BL,EACAC,EACAC,EACAC,EACAG,IACG,CACH,IAAIC,EAAQ,CAAE,EAAGP,EAAI,EAAGC,CAAG,EAG3B,GAAI,OAAOK,GAAa,SAAU,CAChC,IAAME,EAASJ,GAAmB,CAACJ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EACpD,GAAIG,GAAY,EACdC,EAAQ,CAAE,EAAGP,EAAI,EAAGC,CAAG,UACdK,GAAYE,EACrBD,EAAQ,CAAE,EAAGL,EAAI,EAAGC,CAAG,MAClB,CACL,GAAM,CAACM,EAAGC,CAAC,EAAIC,EAAS,CAACX,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAGG,EAAWE,CAAM,EAC7DD,EAAQ,CAAE,EAAAE,EAAG,EAAAC,CAAE,CACjB,CACF,CACA,OAAOH,CACT,EAYMK,GAAc,CAACZ,EAAYC,EAAYC,EAAYC,IAAe,CACtE,GAAM,CAAE,IAAAU,EAAK,IAAAC,CAAI,EAAI,KAErB,MAAO,CAACD,EAAIb,EAAIE,CAAE,EAAGW,EAAIZ,EAAIE,CAAE,EAAGW,EAAId,EAAIE,CAAE,EAAGY,EAAIb,EAAIE,CAAE,CAAC,CAM5D,EAEMY,GAAY,CAChB,YAAAH,GACA,cAAAb,GACA,qBAAAM,EACF,ECjEA,IAAMW,GAAY,CAACC,EAAYC,EAAYC,IAAkB,CAC3D,IAAMC,EAAYD,EAAQ,EACpBE,EAAe,KAAK,IAAID,CAAS,EACjCE,EAAe,KAAK,IAAIF,CAAS,EACjCG,EAAQN,GAAM,EAAII,GAAgB,EAClCG,EAAQN,GAAM,EAAII,GAAgB,EAClCG,EAAS,KAAK,KAAKF,EAAQC,CAAK,EAAIL,EAC1C,OAAO,KAAK,IAAIM,CAAM,CACxB,EAYMC,GAAW,CACfC,EACAC,EACAX,EACAC,EACAW,EACAV,IACG,CACH,GAAM,CAAE,IAAAW,EAAK,IAAAC,CAAI,EAAI,KAGfC,EAAOD,EAAIF,CAAK,EAChBI,EAAOH,EAAID,CAAK,EAChBK,EAAIjB,EAAKc,EAAIZ,CAAK,EAClBgB,EAAIjB,EAAKY,EAAIX,CAAK,EAExB,MAAO,CAACQ,EAAKK,EAAOE,EAAID,EAAOE,EAAGP,EAAKK,EAAOC,EAAIF,EAAOG,CAAC,CAC5D,EAQMC,GAAe,CAACC,EAAWC,IAAc,CAC7C,GAAM,CAAE,EAAGC,EAAK,EAAGC,CAAI,EAAIH,EACrB,CAAE,EAAGI,EAAK,EAAGC,CAAI,EAAIJ,EACrBK,EAAIJ,EAAME,EAAMD,EAAME,EACtBE,EAAI,KAAK,MAAML,GAAO,EAAIC,GAAO,IAAMC,GAAO,EAAIC,GAAO,EAAE,EAEjE,OADaH,EAAMG,EAAMF,EAAMC,EAAM,EAAI,GAAK,GAChC,KAAK,KAAKE,EAAIC,CAAC,CAC/B,EAiBMC,GAAc,CAClBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,IACG,CACH,GAAM,CAAE,IAAAkB,EAAK,IAAAvB,EAAK,IAAAC,EAAK,KAAAuB,EAAM,GAAAC,CAAG,EAAI,KAChCtC,EAAKoC,EAAIL,CAAE,EACX9B,EAAKmC,EAAIJ,CAAE,EAETO,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KAG7B,GAAIT,IAAOZ,GAAKa,IAAOZ,EACrB,MAAO,CACL,GAAAlB,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,EAAAgB,EAAG,EAAAC,CAAE,CACjB,EAGF,GAAIlB,IAAO,GAAKC,IAAO,EACrB,MAAO,CACL,GAAAD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,GAAIgB,EAAIY,GAAM,EAAG,GAAIX,EAAIY,GAAM,CAAE,CAC7C,EAGF,IAAMU,GAAMX,EAAKZ,GAAK,EAChBwB,GAAMX,EAAKZ,GAAK,EAEhBwB,EAAmB,CACvB,EAAG5B,EAAIyB,CAAO,EAAIC,EAAK3B,EAAI0B,CAAO,EAAIE,EACtC,EAAG,CAAC5B,EAAI0B,CAAO,EAAIC,EAAK1B,EAAIyB,CAAO,EAAIE,CACzC,EAEME,EAAaD,EAAiB,GAAK,EAAI1C,GAAM,EACjD0C,EAAiB,GAAK,EAAIzC,GAAM,EAE9B0C,EAAa,IACf3C,GAAMqC,EAAKM,CAAU,EACrB1C,GAAMoC,EAAKM,CAAU,GAGvB,IAAMC,EAAmB5C,GAAM,EAAIC,GAAM,EACvCD,GAAM,EAAI0C,EAAiB,GAAK,EAAIzC,GAAM,EAAIyC,EAAiB,GAAK,EAChEG,EAAmB7C,GAAM,EAAI0C,EAAiB,GAAK,EACvDzC,GAAM,EAAIyC,EAAiB,GAAK,EAE9BI,EAAYF,EAAmBC,EAEnCC,EAAYA,EAAY,EAAI,EAAIA,EAChC,IAAMC,GAASb,IAAQC,EAAK,EAAI,IAAME,EAAKS,CAAS,EAC9CE,EAAoB,CACxB,EAAGD,GAAU/C,EAAK0C,EAAiB,EAAKzC,GACxC,EAAG8C,GAAS,EAAE9C,EAAKyC,EAAiB,GAAK1C,EAC3C,EAEMiD,EAAS,CACb,EAAGnC,EAAIyB,CAAO,EAAIS,EAAkB,EAAInC,EAAI0B,CAAO,EAAIS,EAAkB,GACtEnB,EAAKZ,GAAK,EACb,EAAGJ,EAAI0B,CAAO,EAAIS,EAAkB,EAAIlC,EAAIyB,CAAO,EAAIS,EAAkB,GACtElB,EAAKZ,GAAK,CACf,EAEMgC,GAAc,CAClB,GAAIR,EAAiB,EAAIM,EAAkB,GAAKhD,EAChD,GAAI0C,EAAiB,EAAIM,EAAkB,GAAK/C,CAClD,EAEMkD,EAAahC,GAAa,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG+B,EAAW,EAErDE,EAAY,CAChB,GAAI,CAACV,EAAiB,EAAIM,EAAkB,GAAKhD,EACjD,GAAI,CAAC0C,EAAiB,EAAIM,EAAkB,GAAK/C,CACnD,EAEIoD,EAAalC,GAAa+B,GAAaE,CAAS,EAChD,CAACjB,GAAMkB,EAAa,EACtBA,GAAc,EAAIf,EACTH,GAAMkB,EAAa,IAC5BA,GAAc,EAAIf,GAEpBe,GAAc,EAAIf,EAElB,IAAMgB,EAAWH,EAAaE,EAU9B,MAAO,CACL,OAAAJ,EACA,WAAAE,EACA,SAAAG,EACA,GAAAtD,EACA,GAAAC,CACF,CACF,EAeMsD,GAAe,CACnB1B,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,IACG,CACH,GAAM,CAAE,GAAAlB,EAAI,GAAAC,EAAI,WAAAkD,EAAY,SAAAG,CAAS,EAAI1B,GACvCC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,CACF,EACA,OAAOnB,GAAUC,EAAIC,EAAIqD,EAAWH,CAAU,CAChD,EAiBMK,GAAsB,CAC1B3B,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,EACAuC,IACG,CACH,IAAIC,EAAQ,CAAE,EAAG7B,EAAI,EAAGC,CAAG,EACrB,CAAE,OAAAmB,EAAQ,GAAAjD,EAAI,GAAAC,EAAI,WAAAkD,EAAY,SAAAG,CAAS,EAAI1B,GAC/CC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,CACF,EAGA,GAAI,OAAOuC,GAAa,SAAU,CAChC,IAAMjD,EAAST,GAAUC,EAAIC,EAAIqD,EAAWH,CAAU,EACtD,GAAIM,GAAY,EACdC,EAAQ,CAAE,EAAG7B,EAAI,EAAGC,CAAG,UACd2B,GAAYjD,EACrBkD,EAAQ,CAAE,EAAAzC,EAAG,EAAAC,CAAE,MACV,CAEL,GAAIW,IAAOZ,GAAKa,IAAOZ,EACrB,MAAO,CAAE,EAAAD,EAAG,EAAAC,CAAE,EAGhB,GAAIlB,IAAO,GAAKC,IAAO,EACrB,OAAO0D,GAAqB9B,EAAIC,EAAIb,EAAGC,EAAGuC,CAAQ,EAEpD,GAAM,CAAE,GAAAnB,EAAI,IAAAxB,EAAK,IAAAD,CAAI,EAAI,KACnBwC,EAAaC,EAAWH,EAExBZ,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KACvB1B,EAAQuC,EAAaE,GAAcI,EAAWjD,GAC9CoD,EAAoB5D,EAAKc,EAAIF,CAAK,EAClCiD,EAAoB5D,EAAKY,EAAID,CAAK,EAExC8C,EAAQ,CACN,EAAG5C,EAAIyB,CAAO,EAAIqB,EAAoB/C,EAAI0B,CAAO,EAAIsB,EACnDZ,EAAO,EACT,EAAGpC,EAAI0B,CAAO,EAAIqB,EAAoB9C,EAAIyB,CAAO,EAAIsB,EACnDZ,EAAO,CACX,CACF,CACF,CAEA,OAAOS,CACT,EAmBMI,GAAa,CACjBjC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,IACG,CACH,GAAM,CAAE,OAAA+B,EAAQ,GAAAjD,EAAI,GAAAC,EAAI,WAAAkD,EAAY,SAAAG,CAAS,EAAI1B,GAC/CC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAlB,EACAC,CACF,EACM6C,EAAaT,EAAWH,EACxB,CAAE,IAAAa,EAAK,IAAAC,EAAK,IAAAC,EAAK,MAAAC,EAAO,GAAA7B,CAAG,EAAI,KAG/B,CAAE,EAAG5B,EAAI,EAAGC,CAAG,EAAIsC,EAGnBrC,EAASqB,EAAQK,EAAM,IACvB8B,EAAUF,EAAItD,CAAK,EAMnBV,EAAQiE,EAAM,CAAClE,EAAKmE,EAASpE,CAAE,EAC/BqE,EAASnE,EACToE,EAASpE,EAAQoC,EACjBiC,EAASJ,EAAMlE,EAAID,EAAKoE,CAAO,EAC/BI,GAASD,EAASjC,EAClBmC,EAAS,CAACxD,CAAC,EACXyD,EAAS,CAACxD,CAAC,EAGbyD,EAAOX,EAAInC,EAAIZ,CAAC,EAChB2D,EAAOX,EAAIpC,EAAIZ,CAAC,EAChB4D,EAAOb,EAAIlC,EAAIZ,CAAC,EAChB4D,EAAOb,EAAInC,EAAIZ,CAAC,EAGd6D,GAAkBzB,EAAWS,EAAa,KAC1CiB,GAAMvE,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAOmE,EAAe,EAGrDE,EAAiB3B,EAAWS,EAAa,OACzCmB,EAAMzE,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAOqE,CAAc,EAU1D,GAAID,GAAI,CAAC,EAAIJ,GAAQM,EAAI,CAAC,EAAIN,EAAM,CAElC,IAAMO,EAAK1E,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAOyD,CAAM,EACjDI,EAAO,KAAKU,EAAG,CAAC,CAAC,EACjBT,EAAO,KAAKS,EAAG,CAAC,CAAC,CACnB,CAGA,GAAIH,GAAI,CAAC,EAAIL,GAAQO,EAAI,CAAC,EAAIP,EAAM,CAElC,IAAMS,EAAK3E,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAO0D,CAAM,EACjDG,EAAO,KAAKW,EAAG,CAAC,CAAC,EACjBV,EAAO,KAAKU,EAAG,CAAC,CAAC,CACnB,CAGA,GAAIJ,GAAI,CAAC,EAAIH,GAAQK,EAAI,CAAC,EAAIL,EAAM,CAElC,IAAMQ,EAAK5E,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAO4D,EAAM,EACjDC,EAAO,KAAKY,EAAG,CAAC,CAAC,EACjBX,EAAO,KAAKW,EAAG,CAAC,CAAC,CACnB,CAGA,GAAIL,GAAI,CAAC,EAAIF,GAAQI,EAAI,CAAC,EAAIJ,EAAM,CAElC,IAAMQ,EAAK7E,GAASC,EAAIC,EAAIX,EAAIC,EAAIW,EAAO2D,CAAM,EACjDE,EAAO,KAAKa,EAAG,CAAC,CAAC,EACjBZ,EAAO,KAAKY,EAAG,CAAC,CAAC,CACnB,CAEA,OAAAX,EAAOX,EAAI,MAAM,CAAC,EAAGS,CAAM,EAC3BI,EAAOb,EAAI,MAAM,CAAC,EAAGU,CAAM,EAC3BE,EAAOX,EAAI,MAAM,CAAC,EAAGQ,CAAM,EAC3BK,EAAOb,EAAI,MAAM,CAAC,EAAGS,CAAM,EAEpB,CAACC,EAAME,EAAMD,EAAME,CAAI,CAChC,EAEMS,GAAW,CACf,aAAApE,GACA,UAAApB,GACA,SAAAU,GACA,WAAAqD,GACA,aAAAP,GACA,YAAA3B,GACA,oBAAA4B,EACF,ECpaA,IAAMgC,GAAU,CACd,oBACA,mBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,kBACA,iBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,iBACF,EAEMC,GAAU,CACd,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,oBACA,oBACA,kBACA,iBACF,EAMMC,GAAgBC,GAAqC,CACzD,IAAMC,EAAU,CAAC,EACjB,QAASC,EAAIF,EAAQG,EAAID,EAAE,OAAQE,EAAID,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAGC,GAAK,EAAG,CACnE,IAAMC,EAAO,CAAC,EACd,QAASC,EAAI,EAAGA,EAAIF,EAAGE,GAAK,EAC1BD,EAAK,KAAK,CACR,EAAGD,GAAKF,EAAEI,EAAI,CAAC,EAAE,EAAIJ,EAAEI,CAAC,EAAE,GAC1B,EAAGF,GAAKF,EAAEI,EAAI,CAAC,EAAE,EAAIJ,EAAEI,CAAC,EAAE,GAC1B,EAAG,CACL,CAAC,EAEHL,EAAQ,KAAKI,CAAI,EACjBH,EAAIG,CACN,CACA,OAAOJ,CACT,EAMMM,GAAgB,CACpBP,EACAQ,IACG,CAGH,GAAIA,IAAM,EACR,OAAAR,EAAO,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAGjB,IAAMS,EAAQT,EAAO,OAAS,EAG9B,GAAIQ,IAAM,EACR,OAAAR,EAAOS,CAAK,EAAE,EAAI,EACXT,EAAOS,CAAK,EAGrB,IAAMC,EAAK,EAAIF,EACXN,EAAIF,EASR,GAAIS,IAAU,EACZ,OAAAT,EAAO,CAAC,EAAE,EAAIQ,EACPR,EAAO,CAAC,EAKjB,GAAIS,IAAU,EACZ,MAAO,CACL,EAAGC,EAAKR,EAAE,CAAC,EAAE,EAAIM,EAAIN,EAAE,CAAC,EAAE,EAC1B,EAAGQ,EAAKR,EAAE,CAAC,EAAE,EAAIM,EAAIN,EAAE,CAAC,EAAE,EAC1B,EAAAM,CACF,EAIF,IAAMG,EAAMD,EAAKA,EACXE,EAAKJ,EAAIA,EACXK,EAAI,EACJC,EAAI,EACJV,EAAI,EACJD,EAAI,EAER,OAAIM,IAAU,GACZP,EAAI,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,CAAiB,EACrDW,EAAIF,EACJG,EAAIJ,EAAKF,EAAI,EACbJ,EAAIQ,GACKH,IAAU,IACnBI,EAAIF,EAAMD,EACVI,EAAIH,EAAMH,EAAI,EACdJ,EAAIM,EAAKE,EAAK,EACdT,EAAIK,EAAII,GAEH,CACL,EAAGC,EAAIX,EAAE,CAAC,EAAE,EAAIY,EAAIZ,EAAE,CAAC,EAAE,EAAIE,EAAIF,EAAE,CAAC,EAAE,EAAIC,EAAID,EAAE,CAAC,EAAE,EACnD,EAAGW,EAAIX,EAAE,CAAC,EAAE,EAAIY,EAAIZ,EAAE,CAAC,EAAE,EAAIE,EAAIF,EAAE,CAAC,EAAE,EAAIC,EAAID,EAAE,CAAC,EAAE,EACnD,EAAAM,CACF,CACF,EAEMO,GAAkB,CAACC,EAA8BR,IAAc,CACnE,IAAML,EAAIa,EAAaR,CAAC,EAClBS,EAAId,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAE9B,OAAO,KAAK,KAAKc,CAAC,CACpB,EAEMC,GAAgBF,GAAiC,CAErD,IAAMG,EAAMtB,GAAQ,OAEhBuB,EAAM,EAEV,QAASC,EAAI,EAAGb,EAAGa,EAAIF,EAAKE,IAC1Bb,EAAI,GAAIX,GAAQwB,CAAC,EAAI,GACrBD,GAAOtB,GAAQuB,CAAC,EAAIN,GAAgBC,EAAcR,CAAC,EAErD,MAAO,IAAIY,CACb,EAMME,GAAmBC,GAA8C,CACrE,IAAMvB,EAAS,CAAC,EAChB,QAASwB,EAAM,EAAGL,EAAMI,EAAM,OAAQE,EAAO,EAAGD,EAAML,EAAKK,GAAOC,EAChEzB,EAAO,KAAK,CACV,EAAGuB,EAAMC,CAAG,EACZ,EAAGD,EAAMC,EAAM,CAAC,CAClB,CAAC,EAEH,IAAMvB,EAAUF,GAAaC,CAAM,EACnC,OAAOkB,GAAcV,GACZD,GAAcN,EAAQ,CAAC,EAAGO,CAAC,CACnC,CACH,EAGMkB,GAAyB,KAOzBC,GAAU,CAAC,CAACC,EAAIC,EAAIC,CAAE,IAAgC,CAC1D,IAAMC,EAAM,KAAK,IAAIH,EAAIE,CAAE,EACrBE,EAAM,KAAK,IAAIJ,EAAIE,CAAE,EAG3B,GAAID,GAAMD,EAAKE,GAAMD,EAAKC,GAAMD,EAE9B,MAAO,CAACE,EAAKC,CAAG,EAIlB,IAAMC,GAAKL,EAAKE,EAAKD,EAAKA,IAAOD,EAAK,EAAIC,EAAKC,GAC/C,OAAQG,EAAIF,EAAM,CAACE,EAAGD,CAAG,EAAI,CAACD,EAAKE,CAAC,CACtC,EAOMC,GAAU,CAAC,CAACN,EAAIO,EAAKC,EAAKN,CAAE,IAAwC,CACxE,IAAMO,EAAIT,EAAK,EAAIO,EAAM,EAAIC,EAAMN,EAInC,GAAI,KAAK,IAAIO,CAAC,EAAIX,GAChB,OAAIE,IAAOE,GAAMF,IAAOO,EAEf,CAACP,EAAIE,CAAE,EAGTH,GAAQ,CAACC,EAAI,IAAOA,EAAK,IAAMO,EAAKP,EAAK,EAAIO,EAAM,EAAIC,CAAG,CAAC,EAIpE,IAAME,EAAI,CAACV,EAAKQ,EAAMR,EAAKE,EAAKK,EAAMC,EAAMD,EAAML,EAAKK,EAAMA,EAAMC,EAAMA,EAGzE,GAAIE,GAAK,EACP,MAAO,CAAC,KAAK,IAAIV,EAAIE,CAAE,EAAG,KAAK,IAAIF,EAAIE,CAAE,CAAC,EAE5C,IAAMS,EAAI,KAAK,KAAKD,CAAC,EAGjBP,EAAM,KAAK,IAAIH,EAAIE,CAAE,EACrBE,EAAM,KAAK,IAAIJ,EAAIE,CAAE,EAEnBU,EAAIZ,EAAK,EAAIO,EAAMC,EAEzB,QAASK,GAAKD,EAAID,GAAKF,EAAGhB,EAAI,EAAGA,GAAK,EAAGoB,GAAKD,EAAID,GAAKF,EAAGhB,IAAK,CAE7D,GAAIoB,EAAI,GAAKA,EAAI,EAAG,CAElB,IAAMC,EAAId,GAAM,EAAIa,IAAM,EAAIA,IAAM,EAAIA,GACtCN,EAAM,GAAK,EAAIM,IAAM,EAAIA,GAAKA,EAAIL,EAAM,GAAK,EAAIK,GAAKA,EAAIA,EAC1DX,EAAKW,EAAIA,EAAIA,EACXC,EAAIX,IACNA,EAAMW,GAEJA,EAAIV,IACNA,EAAMU,EAEV,CACF,CAEA,MAAO,CAACX,EAAKC,CAAG,CAClB,EACMW,GAAc,CAClB,aAAAzB,GACA,gBAAAH,GACA,uBAAAW,GACA,cAAAnB,GACA,QAAAT,GACA,aAAAC,GACA,gBAAAuB,GACA,QAAAY,GACA,QAAAP,GACA,QAAA9B,EACF,ECjRA,IAAM+C,GAA+B,CACnC,CAACC,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,CAAE,EACnCC,IACG,CACH,IAAMC,EAAK,EAAID,EACf,MAAO,CACL,EAAGC,GAAM,EAAIT,EAAK,EAAIS,GAAM,EAAID,EAAIN,EAAM,EAAIO,EAAKD,GAAK,EAAIJ,EAC1DI,GAAK,EAAIF,EACX,EAAGG,GAAM,EAAIR,EAAK,EAAIQ,GAAM,EAAID,EAAIL,EAAM,EAAIM,EAAKD,GAAK,EAAIH,EAC1DG,GAAK,EAAID,CACb,CACF,EAeMG,GAAiB,CACrBV,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAEOI,GAAgB,CAACX,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,CAAE,CAAC,EAiBvDK,GAAwB,CAC5BZ,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAM,IACG,CACH,IAAMC,EAAmB,OAAOD,GAAa,SACzCE,EAAQ,CAAE,EAAGf,EAAI,EAAGC,CAAG,EAE3B,GAAIa,EAAkB,CACpB,IAAME,EAAgBL,GAAgB,CAACX,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,CAAE,CAAC,EACtEM,GAAY,IAELA,GAAYG,EACrBD,EAAQ,CAAE,EAAGT,EAAI,EAAGC,CAAG,EAEvBQ,EAAQhB,GACN,CAACC,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,CAAE,EACnCM,EAAWG,CACb,EAEJ,CACA,OAAOD,CACT,EAgBME,GAAe,CACnBjB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IACG,CACH,IAAMW,EAAWC,GAAQ,CAACnB,EAAIE,EAAKE,EAAKE,CAAE,CAAC,EACrCc,EAAWD,GAAQ,CAAClB,EAAIE,EAAKE,EAAKE,CAAE,CAAC,EAE3C,MAAO,CAACW,EAAS,CAAC,EAAGE,EAAS,CAAC,EAAGF,EAAS,CAAC,EAAGE,EAAS,CAAC,CAAC,CAM5D,EAEMC,GAAa,CACjB,aAAAJ,GACA,eAAAP,GACA,sBAAAE,GACA,6BAAAb,EACF,EC1HA,IAAMuB,GAA8B,CAClC,CAACC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,EACvBC,IACG,CACH,IAAMC,EAAK,EAAID,EACf,MAAO,CACL,EAAGC,GAAM,EAAIP,EAAK,EAAIO,EAAKD,EAAIJ,EAAKI,GAAK,EAAIF,EAC7C,EAAGG,GAAM,EAAIN,EAAK,EAAIM,EAAKD,EAAIH,EAAKG,GAAK,EAAID,CAC/C,CACF,EAaMG,GAAgB,CACpBR,EACAC,EACAC,EACAC,EACAC,EACAC,IAEOI,GAAgB,CAACT,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CAAC,EAe3CK,GAAuB,CAC3BV,EACAC,EACAC,EACAC,EACAC,EACAC,EACAM,IACG,CACH,IAAMC,EAAmB,OAAOD,GAAa,SACzCE,EAAQ,CAAE,EAAGb,EAAI,EAAGC,CAAG,EAG3B,GAAIW,EAAkB,CACpB,IAAME,EAAgBL,GAAgB,CAACT,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CAAC,EAC1DM,GAAY,IAELA,GAAYG,EACrBD,EAAQ,CAAE,EAAGT,EAAI,EAAGC,CAAG,EAEvBQ,EAAQd,GACN,CAACC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,EACvBM,EAAWG,CACb,EAEJ,CACA,OAAOD,CACT,EAcME,GAAc,CAClBf,EACAC,EACAC,EACAC,EACAC,EACAC,IACG,CACH,IAAMW,EAAWC,GAAQ,CAACjB,EAAIE,EAAIE,CAAE,CAAC,EAC/Bc,EAAWD,GAAQ,CAAChB,EAAIE,EAAIE,CAAE,CAAC,EACrC,MAAO,CAACW,EAAS,CAAC,EAAGE,EAAS,CAAC,EAAGF,EAAS,CAAC,EAAGE,EAAS,CAAC,CAAC,CAM5D,EACMC,GAAY,CAChB,qBAAAT,GACA,4BAAAX,GACA,YAAAgB,GACA,cAAAP,EACF,EClHA,IAAMY,GAAeC,GAA0B,CAC7C,IAAMC,EAAID,EAAQ,OACdE,EAAI,GACJC,EACAC,EAAIJ,EAAQC,EAAI,CAAC,EACjBI,EAAO,EAGX,KAAO,EAAEH,EAAID,GACXE,EAAIC,EACJA,EAAIJ,EAAQE,CAAC,EACbG,GAAQF,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAGlC,OAAOC,EAAO,CAChB,EAWMC,GAAiBN,GACdA,EAAQ,OAAO,CAACO,EAAQC,EAAON,IAChCA,EACKK,EAASE,GAAmBT,EAAQE,EAAI,CAAC,EAAGM,CAAK,EAEnD,EACN,CAAC,EAEAE,GAAe,CACnB,YAAAX,GACA,cAAAO,EACF,ECxCA,IAAMK,GAAe,CACnBC,EACAC,EACAC,IAC6B,CAC7B,GAAM,CAAE,IAAAC,EAAK,IAAAC,CAAI,EAAI,KACfC,EAAIL,EAAII,EAAIF,CAAG,EAAID,EAAIE,EAAID,CAAG,EAC9BI,EAAIN,EAAIG,EAAID,CAAG,EAAID,EAAIG,EAAIF,CAAG,EACpC,MAAO,CAAE,EAAGG,EAAG,EAAGC,CAAE,CACtB,EAEOC,GAAQR,GCpBf,IAAMS,GAAU,CAACC,EAAWC,IAAkB,CAC5C,IAAMC,EAAMD,GAAS,EAAI,IAAMA,EAAQ,EAEvC,OAAOA,EAAQ,EAAI,KAAK,MAAMD,EAAIE,CAAG,EAAIA,EAAM,KAAK,MAAMF,CAAC,CAC7D,EAEOG,EAAQJ,GCHf,IAAMK,GAA0B,CAC9B,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,MAAO,CACT,EAEOC,EAAQD,GCPf,IAAME,GAAc,CAClB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACL,EAEOC,EAAQD,GCNf,IAAME,GAAmBC,GAAqB,CAC5C,IAAIC,EAAcD,EAAK,UAAUA,EAAK,YAAY,EAC9CE,EAAkBD,EAAY,YAAY,EACxC,CAAE,KAAAE,CAAK,EAAIH,EAEjB,KAAOG,EAAK,QAAUC,EAAYF,CAAe,IAG3CA,IAAoB,KAAOC,EAAK,OAAS,GAC3CH,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAG,CAAC,CAClB,CACF,EACAD,EAAkB,IAClBD,EAAcA,IAAgB,IAAM,IAAM,KAE1CD,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAGC,EAAYF,CAAe,CAAC,CAC7C,CACF,EAGE,EAACE,EAAYF,CAAe,IAAhC,CAIJ,EACOG,GAAQN,GCtCf,IAAMO,GAAQ,yBACPC,EAAQD,GCQf,IAAME,GAAYC,GAAqB,CACrC,GAAM,CAAE,MAAAC,EAAO,UAAAC,CAAU,EAAIF,EACvBG,EAAOD,EAAU,WAAWD,CAAK,EAEvC,GAAIE,IAAS,GAAc,CACzBH,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MACF,CAEA,GAAIG,IAAS,GAAc,CACzBH,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MACF,CAEAA,EAAK,IAAM,GAAGI,CAAK,uBACjBF,EAAUD,CAAK,CACjB,gCAAgCA,CAAK,EACvC,EAEOI,GAAQN,GCtBf,IAAMO,GAAWC,GACRA,GAAQ,IAAMA,GAAQ,GAExBC,EAAQF,GCXf,IAAMG,GAAmB,qBAClBC,EAAQD,GCUf,IAAME,GAAaC,GAAqB,CACtC,GAAM,CAAE,IAAAC,EAAK,UAAAC,EAAW,MAAOC,CAAM,EAAIH,EACrCI,EAAQD,EACRE,EAAY,GACZC,EAAa,GACbC,EAAa,GACbC,EAAS,GACTC,EAEJ,GAAIL,GAASH,EAAK,CAChBD,EAAK,IACH,GAAGU,CAAK,KAAKC,CAAgB,aAAaP,CAAK,iCACjD,MACF,CAWA,GAVAK,EAAKP,EAAU,WAAWE,CAAK,GAE3BK,IAAO,IAAgBA,IAAO,MAChCL,GAAS,EAETK,EAAKP,EAAU,WAAWE,CAAK,GAK7B,CAACQ,EAAQH,CAAE,GAAKA,IAAO,GAAc,CAEvCT,EAAK,IAAM,GAAGU,CAAK,KAAKC,CAAgB,aAAaP,CAAK,MACxDF,EAAUE,CAAK,CACjB,oBACA,MACF,CAEA,GAAIK,IAAO,GAAc,CAMvB,GALAJ,EAAYI,IAAO,GACnBL,GAAS,EAETK,EAAKP,EAAU,WAAWE,CAAK,EAE3BC,GAAaD,EAAQH,GAEnBQ,GAAMG,EAAQH,CAAE,EAAG,CAGrBT,EAAK,IAAM,GAAGU,CAAK,KAAKC,CAAgB,aAAaR,CAAK,MACxDD,EAAUC,CAAK,CACjB,mBACA,MACF,CAGF,KAAOC,EAAQH,GAAOW,EAAQV,EAAU,WAAWE,CAAK,CAAC,GACvDA,GAAS,EACTE,EAAa,GAGfG,EAAKP,EAAU,WAAWE,CAAK,CACjC,CAEA,GAAIK,IAAO,GAAc,CAGvB,IAFAD,EAAS,GACTJ,GAAS,EACFQ,EAAQV,EAAU,WAAWE,CAAK,CAAC,GACxCA,GAAS,EACTG,EAAa,GAGfE,EAAKP,EAAU,WAAWE,CAAK,CACjC,CAEA,GAAIK,IAAO,KAAgBA,IAAO,GAAc,CAC9C,GAAID,GAAU,CAACF,GAAc,CAACC,EAAY,CACxCP,EAAK,IAAM,GAAGU,CAAK,KAAKC,CAAgB,aAAaP,CAAK,MACxDF,EAAUE,CAAK,CACjB,2BACA,MACF,CASA,GAPAA,GAAS,EAETK,EAAKP,EAAU,WAAWE,CAAK,GAE3BK,IAAO,IAAgBA,IAAO,MAChCL,GAAS,GAEPA,EAAQH,GAAOW,EAAQV,EAAU,WAAWE,CAAK,CAAC,EACpD,KAAOA,EAAQH,GAAOW,EAAQV,EAAU,WAAWE,CAAK,CAAC,GACvDA,GAAS,MAEN,CACLJ,EAAK,IAAM,GAAGU,CAAK,KAAKC,CAAgB,aAAaP,CAAK,MACxDF,EAAUE,CAAK,CACjB,6BACA,MACF,CACF,CAEAJ,EAAK,MAAQI,EACbJ,EAAK,MAAQ,CAACA,EAAK,UAAU,MAAMG,EAAOC,CAAK,CACjD,EACOS,GAAQd,GCrGf,IAAMe,GAAWC,GACG,CAEhB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MAEA,GACA,GACA,KACA,KAEA,GACA,EACA,GACA,GACA,GACF,EAEiB,SAASA,CAAE,EAEvBC,GAAQF,GClCf,IAAMG,GAAcC,GAAqB,CACvC,GAAM,CAAE,UAAAC,EAAW,IAAAC,CAAI,EAAIF,EAC3B,KAAOA,EAAK,MAAQE,GAAOC,GAAQF,EAAU,WAAWD,EAAK,KAAK,CAAC,GACjEA,EAAK,OAAS,CAElB,EACOI,EAAQL,GCRf,IAAMM,GAAiBC,GAA4C,CAEjE,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IAEH,MAAO,GACT,QACE,MAAO,EACX,CACF,EACOC,GAAQF,GCjBf,IAAMG,GACJC,GAEOC,EAAQD,CAAI,GAAgBA,IAAS,IAC1CA,IAAS,IAAgBA,IAAS,GAE/BE,GAAQH,GCVf,IAAMI,GAAgBC,IAEZA,EAAO,MAAU,GAEpBC,GAAQF,GCJf,IAAMG,GAAiBC,GAAsC,CAE3D,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,IACH,MAAO,GACT,QACE,MAAO,EACX,CACF,EACOC,GAAQF,GCKf,IAAMG,GAAeC,GAAqB,CACxC,GAAM,CAAE,IAAAC,EAAK,UAAAC,EAAW,MAAAC,EAAO,SAAAC,CAAS,EAAIJ,EACtCK,EAAUH,EAAU,WAAWC,CAAK,EACpCG,EACJC,EAAYL,EAAUC,CAAK,EAAE,YAAY,CAAoB,EAK/D,GAHAH,EAAK,aAAeG,EAGhB,CAACK,GAAcH,CAAO,EAAG,CAC3BL,EAAK,IAAM,GAAGS,CAAK,KAAKC,CAAgB,KACtCR,EAAUC,CAAK,CACjB,oCAAoCA,CAAK,GACzC,MACF,CAGA,IAAMQ,EAAcP,EAASA,EAAS,OAAS,CAAC,EAChD,GACE,CAACQ,GAAcP,CAAO,GAAKM,IAAc,CAAC,GAAG,kBAAkB,IAAM,IACrE,CACAX,EAAK,IAAM,GAAGS,CAAK,KAAKC,CAAgB,KACtCR,EAAUC,CAAK,CACjB,2CAA2CA,CAAK,GAChD,MACF,CAOA,GALAH,EAAK,OAAS,EACda,EAAWb,CAAI,EAEfA,EAAK,KAAO,CAAC,EAET,CAACM,EAAW,CAEdQ,GAAgBd,CAAI,EACpB,MACF,CAEA,OAAS,CACP,QAASe,EAAIT,EAAWS,EAAI,EAAGA,GAAK,EAAG,CAIrC,GAHIC,GAAaX,CAAO,IAAMU,IAAM,GAAKA,IAAM,GAAIE,GAASjB,CAAI,EAC3DkB,GAAUlB,CAAI,EAEfA,EAAK,IAAI,OACX,OAEFA,EAAK,KAAK,KAAKA,EAAK,KAAK,EAEzBa,EAAWb,CAAI,EAIbA,EAAK,MAAQC,GAAOC,EAAU,WAAWF,EAAK,KAAK,IAAM,KAEzDA,EAAK,OAAS,EACda,EAAWb,CAAI,EAEnB,CAOA,GALIA,EAAK,OAASA,EAAK,KAKnB,CAACmB,GAAajB,EAAU,WAAWF,EAAK,KAAK,CAAC,EAChD,KAEJ,CAEAc,GAAgBd,CAAI,CACtB,EACOoB,GAAQrB,GCpFf,IAAqBsB,EAArB,KAAgC,CAU9B,YAAYC,EAAoB,CAC9B,KAAK,SAAW,CAAC,EACjB,KAAK,UAAYA,EACjB,KAAK,IAAMA,EAAW,OACtB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,aAAe,EACpB,KAAK,KAAO,CAAC,EACb,KAAK,IAAM,EACb,CACF,EChBA,IAAMC,GAAwCC,GAA0B,CACtE,GAAI,OAAOA,GAAc,SACvB,OAAOA,EAAU,MAAM,CAAC,EAG1B,IAAMC,EAAO,IAAIC,EAAWF,CAAS,EAIrC,IAFAG,EAAWF,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCG,GAAYH,CAAI,EAKlB,GAAI,CAACA,EAAK,IAAI,OACRA,EAAK,SAAS,SAMhBA,EAAK,SAAS,CAAC,EAAE,CAAC,EAAI,SAGxB,OAAM,UAAUA,EAAK,GAAG,EAG1B,OAAOA,EAAK,QACd,EAEOI,EAAQN,GCnBf,IAAMO,GAAoB,CACxBC,EACAC,EACAC,EACAC,IACG,CACH,GAAM,CAACC,CAAW,EAAIJ,EAChBK,EAAaD,EAAY,YAAY,EACrCE,EAAaD,IAAeD,EAGlC,GAAIH,IAAU,GAAKK,EAAY,OAAON,EAEtC,GAAIK,IAAe,IACjB,MAAO,CACLA,EACAL,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIE,EAC1BF,EAAqB,CAAC,EAAIG,CAC7B,EACK,GAAIE,IAAe,IACxB,MAAO,CAACA,EAAaL,EAAqB,CAAC,EAAIG,CAAK,EAC/C,GAAIE,IAAe,IACxB,MAAO,CAACA,EAAaL,EAAqB,CAAC,EAAIE,CAAK,EAC/C,GAAIG,IAAe,IACxB,MAAO,CACLA,EACCL,EAAqB,CAAC,EAAIE,EAC1BF,EAAqB,CAAC,EAAIG,CAC7B,EACK,CAGL,IAAMI,EAAY,CAAC,EACbC,EAASR,EAAQ,OACvB,QAASS,EAAI,EAAGA,EAAID,EAAQC,GAAK,EAC/BF,EAAU,KAAMP,EAAQS,CAAC,GAAgBA,EAAI,EAAIP,EAAQC,EAAM,EAGjE,MAAO,CAACE,CAAwC,EAAE,OAAOE,CAAS,CAMpE,CACF,EACOG,EAAQX,GClEf,IAAMY,GAAU,CACdC,EACAC,IACG,CACH,IAAIC,EAAUF,EAAK,OACfG,EACAC,EAAc,IACdC,EAAa,IACbC,EAAa,GACbC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAS,EAEb,QAASC,EAAI,EAAGA,EAAIV,EAASU,GAAK,EAAG,CACnCT,EAAUH,EAAKY,CAAC,EAChB,CAACR,CAAW,EAAID,EAChBQ,EAASR,EAAQ,OACjBE,EAAaD,EAAY,YAAY,EACrCE,EAAaD,IAAeD,EAE5B,IAAMS,EAAiBZ,EAASE,EAASS,EAAGL,EAAGC,CAAC,EAGhD,GAAIK,IAAmB,GACrB,MAIER,IAAe,KACjBE,EAAIE,EACJD,EAAIE,GACKL,IAAe,IACxBE,EAAKJ,EAAQ,CAAC,GAAgBG,EAAaC,EAAI,GACtCF,IAAe,IACxBG,EAAKL,EAAQ,CAAC,GAAgBG,EAAaE,EAAI,IAE/CD,EAAKJ,EAAQQ,EAAS,CAAC,GAAgBL,EAAaC,EAAI,GACxDC,EAAKL,EAAQQ,EAAS,CAAC,GAAgBL,EAAaE,EAAI,GAEpDH,IAAe,MACjBI,EAAKF,EACLG,EAAKF,IAILK,IACFb,EAAKY,CAAC,EAAIC,EACNA,EAAe,CAAC,IAAM,MACxBX,EAAUF,EAAK,QAGrB,CACA,OAAOA,CACT,EAEOc,EAAQf,GCtDf,IAAMgB,GAAkBC,GAAkC,CACxD,IAAMC,EAAOC,EAAgBF,CAAS,EAEtC,OAAOG,EAAuBF,EAAMG,CAAiB,CACvD,EACOC,GAAQN,GCOf,IAAMO,GAAoB,CACxBC,EACAC,EACAC,EACAC,IACG,CACH,GAAM,CAACC,CAAW,EAAIJ,EAChBK,EAAaD,EAAY,YAAY,EACrCE,EAAaF,IAAgBC,EAGnC,GAAIJ,IAAU,GAAKK,EAAY,OAAON,EAEtC,GAAIK,IAAe,IACjB,MAAO,CACLA,EACAL,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIE,EAC1BF,EAAqB,CAAC,EAAIG,CAC7B,EACK,GAAIE,IAAe,IACxB,MAAO,CAACA,EAAaL,EAAqB,CAAC,EAAIG,CAAK,EAC/C,GAAIE,IAAe,IACxB,MAAO,CAACA,EAAaL,EAAqB,CAAC,EAAIE,CAAK,EAC/C,GAAIG,IAAe,IACxB,MAAO,CACLA,EACCL,EAAqB,CAAC,EAAIE,EAC1BF,EAAqB,CAAC,EAAIG,CAC7B,EACK,CAGL,IAAMI,EAAY,CAAC,EACbC,EAASR,EAAQ,OACvB,QAASS,EAAI,EAAGA,EAAID,EAAQC,GAAK,EAC/BF,EAAU,KAAMP,EAAQS,CAAC,GAAgBA,EAAI,EAAIP,EAAQC,EAAM,EAGjE,MAAO,CAACE,CAAsC,EAAE,OAAOE,CAAS,CAKlE,CACF,EAEOG,GAAQX,GC/Df,IAAMY,GAAkBC,GAAiD,CACvE,IAAMC,EAAOC,EAAgBF,CAAS,EAEtC,OAAOG,EAAuBF,EAAMG,EAAiB,CACvD,EACOC,GAAQN,GCGf,IAAMO,GAAa,CACjBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IACa,CACb,IAAIC,EAAKV,EACLW,EAAKV,EACLW,EAAKV,EACLW,EAAKV,EACLW,EAAKP,EACLQ,EAAKP,EAGHQ,EAAQ,KAAK,GAAK,IAAO,IAEzBC,EAAO,KAAK,GAAK,KAAQ,CAACb,GAAS,GACrCc,EAAM,CAAC,EACPC,EACAC,EACAC,EACAC,EACAC,EAEJ,GAAKd,EA4CH,CAACW,EAAIC,EAAIC,EAAIC,CAAE,EAAId,MA5CL,CACdU,EAAKK,GAAad,EAAIC,EAAI,CAACM,CAAG,EAC9BP,EAAKS,EAAG,EACRR,EAAKQ,EAAG,EACRA,EAAKK,GAAaV,EAAIC,EAAI,CAACE,CAAG,EAC9BH,EAAKK,EAAG,EACRJ,EAAKI,EAAG,EAER,IAAMM,GAAKf,EAAKI,GAAM,EAChBY,GAAKf,EAAKI,GAAM,EAClBY,EAAKF,EAAIA,GAAMb,EAAKA,GAAOc,EAAIA,GAAMb,EAAKA,GAC1Cc,EAAI,IACNA,EAAI,KAAK,KAAKA,CAAC,EACff,GAAMe,EACNd,GAAMc,GAER,IAAMC,GAAMhB,EAAKA,EACXiB,GAAMhB,EAAKA,EAEXiB,IAAKzB,IAAQC,EAAK,GAAK,GAC3B,KAAK,KACH,KAAK,KACFsB,GAAMC,GAAMD,GAAMF,EAAIA,EAAIG,GAAMJ,EAAIA,IAAMG,GAAMF,EAAIA,EAAIG,GAAMJ,EAAIA,EACrE,CACF,EAEFH,EAAMQ,GAAIlB,EAAKc,EAAKb,GAAMH,EAAKI,GAAM,EACrCS,EAAMO,GAAI,CAACjB,EAAKY,EAAKb,GAAMD,EAAKI,GAAM,EAEtCK,EAAK,KAAK,OAAST,EAAKY,GAAMV,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAE5DQ,EAAK,KAAK,OAASN,EAAKQ,GAAMV,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAE5DO,EAAKV,EAAKY,EAAK,KAAK,GAAKF,EAAKA,EAC9BC,EAAKP,EAAKQ,EAAK,KAAK,GAAKD,EAAKA,EAC1BD,EAAK,IAAGA,EAAK,KAAK,GAAK,EAAIA,GAC3BC,EAAK,IAAGA,EAAK,KAAK,GAAK,EAAIA,GAC3Bf,GAAMc,EAAKC,IACbD,GAAM,KAAK,GAAK,GAEd,CAACd,GAAMe,EAAKD,IACdC,GAAM,KAAK,GAAK,EAEpB,CAGA,IAAIU,EAAKV,EAAKD,EACd,GAAI,KAAK,IAAIW,CAAE,EAAIf,EAAM,CACvB,IAAMgB,EAAQX,EACRY,EAAQnB,EACRoB,EAAQnB,EACdM,EAAKD,EAAKJ,GAAQV,GAAMe,EAAKD,EAAK,EAAI,IACtCN,EAAKQ,EAAKV,EAAK,KAAK,IAAIS,CAAE,EAC1BN,EAAKQ,EAAKV,EAAK,KAAK,IAAIQ,CAAE,EAC1BH,EAAMnB,GAAWe,EAAIC,EAAIH,EAAIC,EAAIT,EAAO,EAAGE,EAAI2B,EAAOC,EAAO,CAC3Db,EACAW,EACAV,EACAC,CACF,CAAC,CACH,CACAQ,EAAKV,EAAKD,EACV,IAAMe,EAAK,KAAK,IAAIf,CAAE,EAChBgB,EAAK,KAAK,IAAIhB,CAAE,EAChBiB,EAAK,KAAK,IAAIhB,CAAE,EAChBiB,GAAK,KAAK,IAAIjB,CAAE,EAChBkB,EAAI,KAAK,IAAIR,EAAK,CAAC,EACnBS,EAAM,EAAI,EAAK5B,EAAK2B,EACpBE,EAAM,EAAI,EAAK5B,EAAK0B,EACpBG,EAAK,CAAChC,EAAIC,CAAE,EACZgC,EAAK,CAACjC,EAAK8B,EAAKJ,EAAIzB,EAAK8B,EAAKN,CAAE,EAChCS,EAAK,CAAC9B,EAAK0B,EAAKF,GAAIvB,EAAK0B,EAAKJ,CAAE,EAChCQ,GAAK,CAAC/B,EAAIC,CAAE,EAGlB,GAFA4B,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACxBA,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACpBlC,EACF,MAAO,CAACkC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAO3B,CAAG,EAE9DA,EAAM,CAACyB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAO3B,CAAG,EAC3D,IAAM4B,GAAS,CAAC,EAChB,QAASC,EAAI,EAAGC,EAAK9B,EAAI,OAAQ6B,EAAIC,EAAID,GAAK,EAC5CD,GAAOC,CAAC,EAAIA,EAAI,EACZvB,GAAaN,EAAI6B,EAAI,CAAC,EAAG7B,EAAI6B,CAAC,EAAG9B,CAAG,EAAE,EACtCO,GAAaN,EAAI6B,CAAC,EAAG7B,EAAI6B,EAAI,CAAC,EAAG9B,CAAG,EAAE,EAE5C,OAAO6B,EACT,EACOG,GAAQlD,GC9Hf,IAAMmD,GAAc,CAClBC,EACAC,EACAC,EACAC,EACAC,EACAC,IACqD,CACrD,IAAMC,EAAM,kBACNC,EAAM,EAAI,EAChB,MAAO,CACLD,EAAMN,EAAKO,EAAML,EACjBI,EAAML,EAAKM,EAAMJ,EACjBG,EAAMF,EAAKG,EAAML,EACjBI,EAAMD,EAAKE,EAAMJ,EACjBC,EACAC,CACF,CACF,EACOG,GAAQT,GCnBf,IAAMU,GAAc,CAACC,EAAYC,EAAYC,EAAYC,IAAe,CACtE,IAAMC,EAAKC,EAAS,CAACL,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,iBAAS,EAC3CG,EAAKD,EAAS,CAACL,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,EAAM,CAAG,EACjD,MAAO,CAACC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGJ,EAAIC,CAAE,CAC5C,EACOI,GAAQR,GCHf,IAAMS,GAAiB,CAACC,EAAsBC,IAAyB,CACrE,GAAM,CAACC,CAAW,EAAIF,EAChBG,EAASH,EAAQ,MAAM,CAAC,EAAE,IAAI,MAAM,EACpC,CAACI,EAAGC,CAAC,EAAIF,EAET,CAAE,GAAIG,EAAK,GAAIC,EAAK,EAAGC,EAAI,EAAGC,CAAG,EAAIR,EAO3C,MALK,KAAK,SAASC,CAAW,IAC5BD,EAAO,GAAK,KACZA,EAAO,GAAK,MAGVC,IAAgB,KAClBD,EAAO,EAAIG,EACXH,EAAO,EAAII,EACJL,GACEE,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BQ,GACEJ,EACAC,EACAJ,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,CACV,CACF,EACSD,IAAgB,KACzBD,EAAO,GAAKG,EACZH,EAAO,GAAKI,EACL,CAAC,GAAsB,EAAE,OAC9BM,GAAYL,EAAKC,EAAKJ,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAClE,GACSD,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BU,GAAYN,EAAKC,EAAKH,EAAGC,CAAC,CAC5B,EACSH,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BU,GAAYN,EAAKC,EAAKC,EAAIC,CAAE,CAC9B,EAGKT,CACT,EACOa,GAAQd,GCvCf,IAAMe,GAAmB,CAACC,EAAsBC,IAAyB,CACvE,GAAM,CAACC,CAAW,EAAIF,EAChBG,EAAaD,EAAY,YAAY,EACrCE,EAAaF,IAAgBC,EAC7B,CAAE,GAAIE,EAAK,GAAIC,EAAK,GAAIC,EAAK,GAAIC,EAAK,EAAAC,EAAG,EAAAC,CAAE,EAAIT,EAC/CU,EAASX,EAAQ,MAAM,CAAC,EAC1BY,EAAYD,EAAO,IAAI,CAACE,EAAGC,IAAMD,GAAKT,EAAcU,EAAI,EAAIJ,EAAID,EAAK,EAAE,EAEtE,KAAK,SAASN,CAAU,IAE3BF,EAAO,GAAK,KACZA,EAAO,GAAK,MAId,GAAIE,IAAe,IACjB,OAAAS,EAAYD,EAAO,MAAM,EAAG,EAAE,EAAE,OAC9BA,EAAO,CAAC,GAAKP,EAAaK,EAAI,GAC9BE,EAAO,CAAC,GAAKP,EAAaM,EAAI,EAChC,EAEO,CAAC,GAA2B,EAAE,OAAOE,CAAS,EAChD,GAAIT,IAAe,IACxB,MAAO,CACL,IACCH,EAAqB,CAAC,GAAKI,EAAaK,EAAI,GAC7CH,CACF,EACK,GAAIH,IAAe,IACxB,MAAO,CACL,IACAE,EACCL,EAAqB,CAAC,GAAKI,EAAaM,EAAI,EAC/C,EACK,GAAIP,IAAe,IACxB,MAAO,CACL,IACCH,EAAqB,CAAC,GAAKI,EAAaK,EAAI,GAC5CT,EAAqB,CAAC,GAAKI,EAAaM,EAAI,EAC/C,EACK,GAAIP,IAAe,IACxB,MAAO,CACL,IACCH,EAAqB,CAAC,GAAKI,EAAaK,EAAI,GAC5CT,EAAqB,CAAC,GAAKI,EAAaM,EAAI,EAC/C,EACK,GAAIP,IAAe,IACxB,MAAO,CAAC,GAA2B,EAAE,OAAOS,CAAS,EAChD,GAAIT,IAAe,IAAK,CAC7B,IAAMY,EAAKV,EAAM,EAAIE,EACfS,EAAKV,EAAM,EAAIE,EACrB,OAAAP,EAAO,GAAKc,EACZd,EAAO,GAAKe,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAOJ,CAAS,CACvC,SAAWT,IAAe,IAAK,CAC7B,IAAMc,EAAKZ,EAAM,GAAKJ,EAAO,GAAKA,EAAO,GAAgC,GACnEiB,EAAKZ,EAAM,GAAKL,EAAO,GAAKA,EAAO,GAAgC,GACzE,OAAAA,EAAO,GAAKgB,EACZhB,EAAO,GAAKiB,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAON,CAAS,CACvC,SAAWT,IAAe,IAAK,CAC7B,GAAM,CAACgB,EAAKC,CAAG,EAAIR,EACnB,OAAAX,EAAO,GAAKkB,EACZlB,EAAO,GAAKmB,EACL,CAAC,GAA2B,EAAE,OAAOR,CAAS,CACvD,SAAWT,IAAe,IACxB,MAAO,CAAC,GAAG,EAIb,OAAOH,CACT,EACOqB,EAAQtB,GC5Ff,IAAMuB,GAA6B,CACjC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,EAAG,EACH,GAAI,KACJ,GAAI,IACN,EAEOC,EAAQD,GCIf,IAAME,GAAeC,GAA8C,CACjE,IAAMC,EAAS,CAAE,GAAGC,CAAa,EAC3BC,EAAOC,EAAgBJ,CAAS,EAEtC,OAAOK,EAAoBF,EAAM,CAACG,EAAKC,EAAOC,EAAOC,IAAU,CAC7DR,EAAO,EAAIO,EACXP,EAAO,EAAIQ,EACX,IAAMC,EAAgBC,EAAiBL,EAAKL,CAAM,EAC9CW,EAASC,GAAeH,EAAeT,CAAM,EAC/BW,EAAO,CAAC,IAAM,KAAOA,EAAO,OAAS,IAGrDT,EAAK,OACHI,EAAQ,EACR,EACA,CAAC,GAA+B,EAAE,OAAOK,EAAO,MAAM,CAAC,CAAC,CAC1D,EACAA,EAASA,EAAO,MAAM,EAAG,CAAC,GAG5B,IAAME,EAASF,EAAO,OACtB,OAAAX,EAAO,GAAK,CAACW,EAAOE,EAAS,CAAC,EAC9Bb,EAAO,GAAK,CAACW,EAAOE,EAAS,CAAC,EAC9Bb,EAAO,GAAK,CAACW,EAAOE,EAAS,CAAC,GAAKb,EAAO,GAC1CA,EAAO,GAAK,CAACW,EAAOE,EAAS,CAAC,GAAKb,EAAO,GAEnCW,CACT,CAAC,CACH,EACOG,GAAQhB,GClCf,IAAMiB,GAAe,CACnBC,EACAC,IACW,CACX,IAAMC,EAAUF,EAAK,OACjB,CAAE,MAAAG,CAAM,EAAIC,EACZC,EAAUL,EAAK,CAAC,EAChBM,EAAS,GAGbH,EAAQF,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOE,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAEzC,QAASI,EAAI,EAAGA,EAAIL,EAASK,GAAK,EAAG,CACnCF,EAAUL,EAAKO,CAAC,EAChB,GAAM,CAACC,CAAW,EAAIH,EAChBI,EAASJ,EAAQ,MAAM,CAAC,EAE9B,GADAC,GAAUE,EACNL,IAAU,MACZG,GAAUG,EAAO,KAAK,GAAG,MACpB,CACL,IAAIC,EAAI,EACFC,EAASF,EAAO,OACtB,KAAOC,EAAIC,GACTL,GAAUM,EAAQH,EAAOC,CAAC,EAAGP,CAAK,EAC9BO,IAAMC,EAAS,IAAGL,GAAU,KAChCI,GAAK,CAET,CACF,CAEA,OAAOJ,CACT,EAEOO,GAAQd,GCzCf,IAAMe,GAAeC,GAAkC,CACrD,GAAI,CAACA,EACH,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACN,EAGF,IAAMC,EAAOC,EAAgBF,CAAS,EAClCG,EAAc,IACdC,EAAK,EACLC,EAAK,EACH,CAAE,IAAAC,EAAK,IAAAC,CAAI,EAAI,KACjBC,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EAEdC,EAAQrB,EAAM,CAACsB,EAAKC,EAAOC,EAAOC,IAAU,CAC1C,CAACvB,CAAW,EAAIoB,EAChB,IAAMI,EAAaxB,EAAY,YAAY,EAErCyB,EADaD,IAAexB,EAE9B0B,EAAkBN,EAAKC,EAAOC,EAAOC,CAAK,EACzCH,EAAI,MAAM,CAAC,EAEVO,EAAgBH,IAAe,IAChC,CAAC,IAAKF,EAAOG,EAAgB,CAAC,CAAC,EAChCD,IAAe,IACd,CAAC,IAAKC,EAAgB,CAAC,EAAGF,CAAK,EAChCE,EAEJ,CAACzB,CAAW,EAAI2B,EAEX,KAAK,SAASH,CAAU,IAE3BP,EAAU,EACVC,EAAU,GAKZ,GAAIlB,IAAgB,IAClB,CAAC,CAAEC,EAAIC,CAAE,EAAIyB,EACblB,EAAOR,EACPS,EAAOR,EACPS,EAAOV,EACPW,EAAOV,UACEF,IAAgB,IACzB,CAACS,EAAMC,EAAMC,EAAMC,CAAI,EAAIgB,GACzBN,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3B,IAAgB,IACzB,CAACS,EAAMC,EAAMC,EAAMC,CAAI,EAAIiB,GACzBP,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3B,IAAgB,IAAK,CAC9B,IAAM8B,EAAOjB,EAAU,EAAIE,EACrBgB,EAAOjB,EAAU,EAAIE,EAE3B,CAACP,EAAMC,EAAMC,EAAMC,CAAI,EAAIoB,GACzBV,EACAC,EACAO,EACAC,EACAJ,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CACF,MAAW3B,IAAgB,IACzB,CAACS,EAAMC,EAAMC,EAAMC,CAAI,EAAIoB,GACzBV,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACS3B,IAAgB,KACzBiB,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACxB,CAACT,EAAMC,EAAMC,EAAMC,CAAI,EAAIqB,GACzBX,EACAC,EACAN,EACAC,EACAS,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3B,IAAgB,KACzBiB,EAAUU,EAAc,CAAC,EACzBT,EAAUS,EAAc,CAAC,EACzB,CAAClB,EAAMC,EAAMC,EAAMC,CAAI,EAAIqB,GACzBX,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3B,IAAgB,MACzB,CAACS,EAAMC,EAAMC,EAAMC,CAAI,EAAIgB,GAAYN,EAAOC,EAAOtB,EAAIC,CAAE,GAE7DG,EAAOD,EAAIK,EAAMJ,CAAI,EACrBC,EAAOF,EAAIM,EAAMJ,CAAI,EACrBC,EAAOJ,EAAIQ,EAAMJ,CAAI,EACrBC,EAAOL,EAAIS,EAAMJ,CAAI,EAGrB,CAACK,EAASC,CAAO,EAAId,IAAgB,IACjC,CAACC,EAAIC,CAAE,EACNyB,EAAc,MAAM,EAAE,EAC3B,CAACZ,EAASC,CAAO,EAAIhB,IAAgB,IAChC,CAAC2B,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC3B,IAAgB,IACf,CAAC2B,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAACd,EAASC,CAAO,CACvB,CAAC,EAED,IAAMoB,EAAQ3B,EAAOF,EACf8B,EAAS3B,EAAOF,EAEtB,MAAO,CACL,MAAA4B,EACA,OAAAC,EACA,EAAG9B,EACH,EAAGC,EACH,GAAIC,EACJ,GAAIC,EACJ,GAAIH,EAAO6B,EAAQ,EACnB,GAAI5B,EAAO6B,EAAS,EAEpB,GAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,CAC1D,CACF,EAEOC,GAAQxC,GClKf,IAAMyC,GAAkBC,GAAkC,CACxD,IAAMC,EAAOC,EAAgBF,CAAS,EAClCG,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAc,IACdC,EAAK,EACLC,EAAK,EACLC,EAAc,EAElB,OAAAC,EAAQZ,EAAM,CAACa,EAAKC,EAAOC,EAAOC,IAAU,CAC1C,CAACR,CAAW,EAAIK,EAChB,IAAMI,EAAaT,EAAY,YAAY,EAErCU,EADaD,IAAeT,EAE9BW,EAAkBN,EAAKC,EAAOC,EAAOC,CAAK,EACzCH,EAAI,MAAM,CAAC,EAEVO,EAAgBH,IAAe,IAChC,CAAC,IAAKF,EAAOG,EAAgB,CAAC,CAAC,EAChCD,IAAe,IACd,CAAC,IAAKC,EAAgB,CAAC,EAAGF,CAAK,EAChCE,EACJ,CAACV,CAAW,EAAIY,EAEX,KAAK,SAASH,CAAU,IAE3BX,EAAU,EACVC,EAAU,GAKZ,GAAIC,IAAgB,IAElB,CAAC,CAAEC,EAAIC,CAAE,EAAIU,UACJZ,IAAgB,IACzBG,GAAeU,GACbN,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSZ,IAAgB,IACzBG,GAAeW,GACbP,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSZ,IAAgB,IAAK,CAC9B,IAAMe,EAAOrB,EAAU,EAAIE,EACrBoB,EAAOrB,EAAU,EAAIE,EAE3BM,GAAec,GACbV,EACAC,EACAO,EACAC,EACAJ,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CACF,MAAWZ,IAAgB,IACzBG,GAAec,GACbV,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACSZ,IAAgB,KACzBF,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACxBI,GAAee,GACbX,EACAC,EACAV,EACAC,EACAa,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSZ,IAAgB,KACzBF,EAAUc,EAAc,CAAC,EACzBb,EAAUa,EAAc,CAAC,EACzBT,GAAee,GACbX,EACAC,EACAI,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSZ,IAAgB,MACzBG,GAAeU,GAAcN,EAAOC,EAAOP,EAAIC,CAAE,GAInD,CAACR,EAASC,CAAO,EAAIK,IAAgB,IACjC,CAACC,EAAIC,CAAE,EACNU,EAAc,MAAM,EAAE,EAC3B,CAAChB,EAASC,CAAO,EAAIG,IAAgB,IAChC,CAACY,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpCZ,IAAgB,IACf,CAACY,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAAClB,EAASC,CAAO,CACvB,CAAC,EAEMQ,CACT,EAEOgB,EAAQ7B,GCxIf,IAAO8B,GAAQ,KCYf,IAAMC,GAAiBC,GAAkC,CACvD,IAAMC,EAAOC,EAAgBF,CAAS,EAChCG,EAAS,CAAE,GAAGC,CAAa,EAEjC,OAAOC,EAAqBJ,EAAM,CAACK,EAAKC,EAAGC,EAAOC,IAAU,CAC1DN,EAAO,EAAIK,EACXL,EAAO,EAAIM,EACX,IAAMC,EAASC,EAAiBL,EAAKH,CAAM,EAErCS,EAASF,EAAO,OACtB,OAAAP,EAAO,GAAK,CAACO,EAAOE,EAAS,CAAC,EAC9BT,EAAO,GAAK,CAACO,EAAOE,EAAS,CAAC,EAC9BT,EAAO,GAAK,CAACO,EAAOE,EAAS,CAAC,GAAKT,EAAO,GAC1CA,EAAO,GAAK,CAACO,EAAOE,EAAS,CAAC,GAAKT,EAAO,GAEnCO,CACT,CAAC,CACH,EACOG,EAAQd,GChBf,IAAMe,GAAmB,CAACC,EAA+BC,IAAsB,CAC7E,IAAMC,EAAOC,EAAcH,CAAS,EAChCI,EAAM,GACNC,EAAO,CAAC,EACRC,EAAc,IACdC,EAAI,EACJC,EAAI,EACJ,CAACC,EAAIC,CAAE,EAAIR,EAAK,CAAC,EAAE,MAAM,CAAC,EACxBS,EAAmB,OAAOV,GAAa,SACzCW,EAAQ,CAAE,EAAGH,EAAI,EAAGC,CAAG,EACvBG,EAAS,EACTC,EAAQF,EACRG,EAAc,EAElB,MAAI,CAACJ,GAAoBV,EAAWe,GAAyBJ,GAG7DK,EAAQf,EAAM,CAACgB,EAAKC,EAAGC,EAAOC,IAAU,CACtC,CAACf,CAAW,EAAIY,EAChBd,EAAME,IAAgB,IACtBD,EAAQD,EAAwDC,EAAlD,CAACe,EAAOC,CAAK,EAAE,OAAOH,EAAI,MAAM,CAAC,CAAa,EA2F5D,GAvFId,GAEF,CAAC,CAAEK,EAAIC,CAAE,EAAIQ,EACbN,EAAQ,CAAE,EAAGH,EAAI,EAAGC,CAAG,EACvBG,EAAS,GACAP,IAAgB,KACzBM,EAAQU,GACNjB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNJ,EAAWc,CACb,EACAF,EAASU,GAAclB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAChDC,IAAgB,KACzBM,EAAQY,GACNnB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNJ,EAAWc,CACb,EACAF,EAASY,GACPpB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSC,IAAgB,KACzBM,EAAQc,GACNrB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNJ,EAAWc,CACb,EACAF,EAASc,GACPtB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSC,IAAgB,KACzBM,EAAQgB,GACNvB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNJ,EAAWc,CACb,EACAF,EAASgB,GACPxB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSC,IAAgB,MACzBD,EAAO,CAACe,EAAOC,EAAOZ,EAAIC,CAAE,EAC5BE,EAAQ,CAAE,EAAGH,EAAI,EAAGC,CAAG,EAEvBG,EAASU,GAAclB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAG3D,CAACE,EAAGC,CAAC,EAAIH,EAAK,MAAM,EAAE,EAElBU,EAAcd,EAChBa,EAAQF,MAKR,OAAO,GAGTG,GAAeF,CAEjB,CAAC,EAIGZ,EAAWc,EAAcC,GACpB,CAAE,EAAAT,EAAG,EAAAC,CAAE,EAGTM,EACT,EAEOgB,GAAQ/B,GCxIf,IAAMgC,GAAwB,CAC5BC,EACAC,IACsB,CACtB,IAAMC,EAAYC,EAAgBH,CAAS,EAEvCI,EAAWF,EAAU,MAAM,CAAC,EAC5BG,EAAaC,EAAeF,CAAQ,EACpCG,EAAQH,EAAS,OAAS,EAC1BI,EAAkB,EAClBC,EAAS,EACTC,EAAUR,EAAU,CAAC,EAGzB,GAAIK,GAAS,GAAK,CAACN,GAAY,CAAC,OAAO,SAASA,CAAQ,EACtD,MAAO,CACL,QAAAS,EACA,MAAO,EACP,OAAAD,EACA,gBAAAD,CACF,EAGF,GAAIP,GAAYI,EACd,OAAAD,EAAWF,EAAU,MAAM,EAAG,EAAE,EAChCM,EAAkBF,EAAeF,CAAQ,EACzCK,EAASJ,EAAaG,EACtBE,EAAUR,EAAUK,CAAK,EAClB,CACL,QAAAG,EACA,MAAAH,EACA,OAAAE,EACA,gBAAAD,CACF,EAGF,IAAMG,EAAW,CAAC,EAClB,KAAOJ,EAAQ,GACbG,EAAUN,EAASG,CAAK,EACxBH,EAAWA,EAAS,MAAM,EAAG,EAAE,EAC/BI,EAAkBF,EAAeF,CAAQ,EACzCK,EAASJ,EAAaG,EACtBH,EAAaG,EAEbG,EAAS,KAAK,CACZ,QAAAD,EACA,MAAAH,EACA,OAAAE,EACA,gBAAAD,CACF,CAAC,EACDD,GAAS,EAGX,OAAOI,EAAS,KAAK,CAAC,CAAE,gBAAiBC,CAAE,IACzCA,GAAKX,CACP,CACF,EAEOY,GAAQd,GCrDf,IAAMe,GAAuB,CAC3BC,EACAC,IACoB,CACpB,IAAMC,EAAOC,EAAgBH,CAAS,EAChCI,EAAaC,EAAcH,CAAI,EAC/BI,EAAaC,EAAeH,CAAU,EACtCI,EAAcC,GAAa,CAC/B,IAAMC,EAAKD,EAAE,EAAIR,EAAM,EACjBU,EAAKF,EAAE,EAAIR,EAAM,EACvB,OAAOS,EAAKA,EAAKC,EAAKA,CACxB,EACIC,EAAY,EACZC,EACAC,EAAU,CAAE,EAAG,EAAG,EAAG,CAAE,EACvBC,EAAe,EACfC,EAAa,EACbC,EAAe,IAGnB,QAASC,EAAa,EAAGA,GAAcZ,EAAYY,GAAcN,EAC/DC,EAAOM,GAAiBf,EAAYc,CAAU,EAC9CH,EAAeP,EAAWK,CAAI,EAE1BE,EAAeE,IACjBH,EAAUD,EACVG,EAAaE,EACbD,EAAeF,GAKnBH,GAAa,EACb,IAAIQ,EACAC,EACAC,EAAe,EACfC,EAAc,EACdC,EAAiB,EACjBC,EAAgB,EAEpB,KAAOb,EAAY,OACjBU,EAAeN,EAAaJ,EAC5BQ,EAASD,GAAiBf,EAAYkB,CAAY,EAClDE,EAAiBhB,EAAWY,CAAM,EAClCG,EAAcP,EAAaJ,EAC3BS,EAAQF,GAAiBf,EAAYmB,CAAW,EAChDE,EAAgBjB,EAAWa,CAAK,EAE5BC,GAAgB,GAAKE,EAAiBP,GACxCH,EAAUM,EACVJ,EAAaM,EACbL,EAAeO,GACND,GAAejB,GAAcmB,EAAgBR,GACtDH,EAAUO,EACVL,EAAaO,EACbN,EAAeQ,GAEfb,GAAa,EAEX,EAAAA,EAAY,QAAhB,CAGF,IAAMc,EAAUC,GAAsBzB,EAAMc,CAAU,EAChDY,EAAW,KAAK,KAAKX,CAAY,EAEvC,MAAO,CAAE,QAAAH,EAAS,SAAAc,EAAU,QAAAF,CAAQ,CACtC,EAEOG,EAAQ9B,GC5Ef,IAAM+B,GAAkB,CACtBC,EACAC,IAEOC,EAAqBF,EAAWC,CAAK,EAAE,QAGzCE,GAAQJ,GCCf,IAAMK,GAAkB,CACtBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAGG,IACGA,EAAKN,IAAOC,EAAME,IACjBE,EAAKN,IAAOG,EAAME,GACnBF,GAAOH,EAAKI,GACZF,GAAOD,EAAKI,GACZE,GAAMH,EAAMJ,EAAK,GACjBM,GAAMD,EAAMJ,EAAK,IACrB,GAcEO,GAAeC,GAAoB,CACvC,IAAIC,EAAI,EACJC,EAAI,EACJC,EAAM,EAEV,OAAOC,GAAYJ,CAAI,EACpB,IAAKK,GAAQ,CACZ,OAAQA,EAAI,CAAC,EAAG,CACd,IAAK,IACH,OAAC,CAAEJ,EAAGC,CAAC,EAAIG,EACJ,EACT,QACE,OAAAF,EAAMb,GACJW,EACAC,EACAG,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,CACP,EACA,CAACJ,EAAGC,CAAC,EAAIG,EAAI,MAAM,EAAE,EACdF,CACX,CACF,CAAC,EACA,OAAO,CAACG,EAAGC,IAAMD,EAAIC,EAAG,CAAC,CAC9B,EACOC,GAAQT,GCnEf,IAAMU,GAAoBC,GACjBC,GAAYC,GAAYF,CAAI,CAAC,GAAK,EAGpCG,GAAQJ,GCLf,IAAMK,GAAqB,CACzBC,EACAC,IAEOC,GAAsBF,EAAWC,CAAQ,EAAE,QAG7CE,GAAQJ,GCNf,IAAMK,GAAoB,CACxBC,EACAC,IAEOC,EAAqBF,EAAMC,CAAK,EAAE,QAEpCE,GAAQJ,GCRf,IAAMK,GAAeC,GAEjB,MAAM,QAAQA,CAAI,GAClBA,EAAK,MAAOC,GAAqB,CAC/B,IAAMC,EAAKD,EAAI,CAAC,EAAE,YAAY,EAC9B,OACEE,EAAYD,CAAE,IAAMD,EAAI,OAAS,GACjC,aAAa,SAASC,CAAE,GACvBD,EAAI,MAAM,CAAC,EAAgB,MAAM,OAAO,QAAQ,CAErD,CAAC,GACDD,EAAK,OAAS,EAGXI,GAAQL,GCbf,IAAMM,GAAmBC,GAErBC,GAAYD,CAAI,GAEhBA,EAAK,MAAM,CAAC,CAACE,CAAC,IAAMA,IAAMA,EAAE,YAAY,CAAC,EAGtCC,GAAQJ,GCNf,IAAMK,GAAqBC,GAElBC,GAAgBD,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACE,CAAE,IAAM,SAAS,SAASA,CAAE,CAAC,EAErEC,GAAQJ,GCLf,IAAMK,GAAgBC,GAEbC,GAAkBD,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACE,CAAE,IAAM,KAAK,SAASA,CAAE,CAAC,EAEnEC,GAAQJ,GCHf,IAAMK,GAAkB,CACtBC,EACAC,IACG,CACH,GAAM,CAAE,SAAAC,CAAS,EAAIC,EAAqBH,EAAWC,CAAK,EAC1D,OAAO,KAAK,IAAIC,CAAQ,EAAIE,EAC9B,EACOC,GAAQN,GCRf,IAAMO,GAAmBC,GAErBC,GAAYD,CAAI,GAEhBA,EAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAACE,CAAE,IAAMA,IAAOA,EAAG,YAAY,CAAC,EAGlDC,GAAQJ,GCNf,IAAMK,GAAeC,GAAuB,CAC1C,GAAI,OAAOA,GAAe,UAAY,CAACA,EAAW,OAChD,MAAO,GAGT,IAAMC,EAAO,IAAIC,EAAWF,CAAU,EAItC,IAFAG,EAAWF,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCG,GAAYH,CAAI,EAGlB,MAAO,CAACA,EAAK,IAAI,QAAU,KAAK,SAASA,EAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAC9D,EACOI,GAAQN,GCrBf,IAAMO,GAA2B,CAC/B,KAAM,CAAC,KAAM,KAAM,KAAM,IAAI,EAC7B,OAAQ,CAAC,KAAM,KAAM,GAAG,EACxB,QAAS,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,KAAM,CAAC,QAAS,SAAU,IAAK,IAAK,KAAM,IAAI,EAC9C,QAAS,CAAC,QAAQ,EAClB,SAAU,CAAC,QAAQ,EACnB,MAAO,CAAC,GAAG,CACb,EAEOC,GAAQD,GCff,IAAME,GAAaC,GACKA,GAAS,MAC/B,OAAOA,GAAS,UACfA,EAAc,WAAa,EAEvBC,GAAQF,GCiBR,IAAMG,GAAeC,GAA8B,CACxD,GAAI,CAAE,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,EAAIJ,EACzB,OAACC,EAAIC,EAAIC,EAAIC,CAAE,EAAI,CAACH,EAAIC,EAAIC,EAAIC,CAAE,EAAE,IAAKC,GAAM,CAACA,CAAC,EAC1C,CACL,CAAC,IAAKJ,EAAIC,CAAE,EACZ,CAAC,IAAKC,EAAIC,CAAE,CACd,CACF,EAQaE,GAAeN,GAA8B,CACxD,IAAMO,EAAY,CAAC,EACbC,GAAUR,EAAK,QAAU,IAC5B,KAAK,EACL,MAAM,QAAQ,EACd,IAAKK,GAAM,CAACA,CAAC,EAEZI,EAAQ,EACZ,KAAOA,EAAQD,EAAO,QACpBD,EAAU,KAAK,CAACE,EAAQ,IAAM,IAAKD,EAAOC,CAAK,EAAGD,EAAOC,EAAQ,CAAC,CAAC,CAAC,EACpEA,GAAS,EAGX,OAAQT,EAAK,OAAS,UAClB,CAAC,GAAGO,EAAW,CAAC,GAAG,CAAC,EACpBA,CACN,EAQaG,GAAiBV,GAAgC,CAC5D,GAAI,CAAE,GAAAW,EAAI,GAAAC,EAAI,EAAAC,CAAE,EAAIb,EACpB,OAACW,EAAIC,EAAIC,CAAC,EAAI,CAACF,EAAIC,EAAIC,CAAC,EAAE,IAAKR,GAAM,CAACA,CAAC,EAEhC,CACL,CAAC,IAAKM,EAAKE,EAAGD,CAAE,EAChB,CAAC,IAAKC,EAAGA,EAAG,EAAG,EAAG,EAAG,EAAIA,EAAG,CAAC,EAC7B,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAG,GAAKA,EAAG,CAAC,CAChC,CACF,EAQaC,GAAkBd,GAAiC,CAC9D,GAAI,CAAE,GAAAW,EAAI,GAAAC,CAAG,EAAIZ,EACbe,EAAKf,EAAK,IAAM,EAChBgB,EAAKhB,EAAK,IAAMe,EACpB,OAACJ,EAAIC,EAAIG,EAAIC,CAAE,EAAI,CAACL,EAAIC,EAAIG,EAAIC,CAAE,EAAE,IAAKX,GAAM,CAACA,CAAC,EAE1C,CACL,CAAC,IAAKM,EAAKI,EAAIH,CAAE,EACjB,CAAC,IAAKG,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAID,EAAI,CAAC,EAChC,CAAC,IAAKA,EAAIC,EAAI,EAAG,EAAG,EAAG,GAAKD,EAAI,CAAC,CACnC,CACF,EAQaE,GAAoBjB,GAA8B,CAC7D,IAAMkB,EAAI,CAAClB,EAAK,GAAK,EACfmB,EAAI,CAACnB,EAAK,GAAK,EACfoB,EAAI,CAACpB,EAAK,MACVqB,EAAI,CAACrB,EAAK,OACZe,EAAK,EAAEf,EAAK,IAAM,GAClBgB,EAAK,EAAEhB,EAAK,IAAMe,GAGtB,GAAIA,GAAMC,EAAI,CAKRD,EAAK,EAAIK,IAAGL,IAAOA,EAAK,EAAIK,GAAK,GAErC,OAAIJ,EAAK,EAAIK,IAAGL,IAAOA,EAAK,EAAIK,GAAK,GAE9B,CACL,CAAC,IAAKH,EAAIH,EAAII,CAAC,EACf,CAAC,IAAKC,EAAIL,EAAK,CAAC,EAChB,CAAC,IAAKA,EAAI,EAAGA,EAAIC,CAAE,EACnB,CAAC,IAAKK,EAAIL,EAAK,CAAC,EAChB,CAAC,IAAK,EAAGA,EAAI,CAACD,EAAIC,CAAE,EACpB,CAAC,IAAK,CAACI,EAAIL,EAAK,CAAC,EACjB,CAAC,IAAK,CAACA,EAAI,EAAG,CAACA,EAAI,CAACC,CAAE,EACtB,CAAC,IAAK,CAACK,EAAIL,EAAK,CAAC,EACjB,CAAC,IAAK,EAAG,CAACA,EAAID,EAAI,CAACC,CAAE,CACvB,CACF,CAEA,MAAO,CAAC,CAAC,IAAKE,EAAGC,CAAC,EAAG,CAAC,IAAKC,CAAC,EAAG,CAAC,IAAKC,CAAC,EAAG,CAAC,IAAKH,CAAC,EAAG,CAAC,GAAG,CAAC,CAC1D,EAYMI,GACJC,GACG,CACH,IAAMC,EAAkB,OAAO,KAAKC,EAAW,EACzCC,EAAkBC,GAAUJ,CAAO,EACnCK,EAAUF,EAAkBH,EAAQ,QAAU,KAEpD,GAAIK,GAAW,CAAC,GAAGJ,EAAiB,MAAM,EAAE,MAAOK,GAAMD,IAAYC,CAAC,EACpE,MAAM,UAAU,GAAGC,CAAK,MAAMF,CAAO,qBAAqB,EAG5D,IAAMG,EACHL,EAAkBE,EAAWL,EAAqB,KAG/CS,EAAaP,GAAYM,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAElBL,EACFM,EAAW,QAASE,GAAM,CACxBD,EAAOC,CAAC,EAAIX,EAAQ,aAAaW,CAAC,CACpC,CAAC,EAED,OAAO,OAAOD,EAAQV,CAAO,EAI/B,IAAIhB,EAAY,CAAC,EAsBjB,OAnBIwB,IAAS,SACXxB,EAAYG,GAAcuB,CAA+B,EAChDF,IAAS,UAClBxB,EAAYO,GAAemB,CAAgC,EAClD,CAAC,WAAY,SAAS,EAAE,SAASF,CAAI,EAC9CxB,EAAYD,GAAY2B,CAA6B,EAC5CF,IAAS,OAClBxB,EAAYU,GAAiBgB,CAA6B,EACjDF,IAAS,OAClBxB,EAAYR,GAAYkC,CAA6B,EAC5C,CAAC,QAAS,MAAM,EAAE,SAASF,CAAI,IACxCxB,EAAY4B,EACVT,EACIH,EAAQ,aAAa,GAAG,GAA0C,GACjEA,EAAsB,GAAK,EAClC,GAIEa,GAAY7B,CAAS,GAAKA,EAAU,OAC/BA,EAEF,EACT,EACO8B,GAAQf,GCvKf,IAAMgB,GAAc,CAClBC,EACAC,EACAC,IAC2B,CAC3B,IAAMC,EAAMD,GAAiB,SACvBE,EAAkB,OAAO,KAAKC,EAAW,EACzCC,EAAkBC,GAAUP,CAAO,EACnCQ,EAAUF,EAAkBN,EAAQ,QAAU,KAEpD,GAAIQ,IAAY,OACd,MAAM,UAAU,GAAGC,CAAK,MAAMD,CAAO,6BAA6B,EAEpE,GAAIA,GAAWJ,EAAgB,MAAOM,GAAMF,IAAYE,CAAC,EACvD,MAAM,UAAU,GAAGD,CAAK,MAAMD,CAAO,qBAAqB,EAG5D,IAAMG,EAAOR,EAAI,gBAAgB,6BAA8B,MAAM,EAC/DS,EACHN,EAAkBE,EAAWR,EAAqB,KAG/Ca,EAAaR,GAAYO,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAGhBG,EAAQC,EAAe,MACvBC,EAAYC,GAAiBlB,CAAO,EACpCmB,EAAcF,GAAaA,EAAU,OACvCG,GAAaH,EAAWF,CAAK,EAC7B,GAwBJ,OAtBIT,GACFO,EAAW,QAAS,GAAM,CACxBC,EAAO,CAAC,EAAId,EAAQ,aAAa,CAAC,CACpC,CAAC,EAED,OAAO,OAAOA,EAAQ,UAAU,EAAE,QAAQ,CAAC,CAAE,KAAAqB,EAAM,MAAAC,CAAM,IAAM,CACxDT,EAAW,SAASQ,CAAI,GAAGV,EAAK,aAAaU,EAAMC,CAAK,CAC/D,CAAC,IAED,OAAO,OAAOR,EAAQd,CAAO,EAE7B,OAAO,KAAKc,CAAM,EAAE,QAASS,GAAM,CAC7B,CAACV,EAAW,SAASU,CAAC,GAAKA,IAAM,QACnCZ,EAAK,aACHY,EAAE,QAAQ,SAAWC,GAAM,IAAIA,EAAE,YAAY,CAAC,EAAE,EAChDV,EAAOS,CAAC,CACV,CAEJ,CAAC,GAICE,GAAYN,CAAW,GACzBR,EAAK,aAAa,IAAKQ,CAAW,EAC9BlB,GAAWK,IACbN,EAAQ,OAAOW,EAAMX,CAAO,EAC5BA,EAAQ,OAAO,GAEVW,GAEF,EACT,EAEOe,GAAQ3B,GCxEf,IAAM4B,GAAiB,CACrBC,EACAC,EACAC,EACAC,IACiB,CACjB,GAAM,CAACC,CAAW,EAAIJ,EAChB,CAAE,MAAOK,CAAa,EAAIC,EAC1BC,EAAQ,OAAOF,GAAiB,SAClCA,EAC2B,EACzBG,EAAeP,EAAc,MAAM,CAAC,EACpC,CAAE,GAAAQ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,EAAAC,EAAG,EAAAC,CAAE,EAAIZ,EAC3B,CAACa,EAAIC,CAAE,EAAIR,EAAa,MAAM,EAAE,EAChCS,EAASjB,EAQf,GANK,KAAK,SAASI,CAAW,IAE5BF,EAAO,GAAK,KACZA,EAAO,GAAK,MAGVE,IAAgB,IAAK,CACvB,GAAIc,EAAQL,EAAGN,CAAK,IAAMW,EAAQH,EAAIR,CAAK,EACzC,MAAO,CAAC,IAAKS,CAAE,EACV,GAAIE,EAAQJ,EAAGP,CAAK,IAAMW,EAAQF,EAAIT,CAAK,EAChD,MAAO,CAAC,IAAKQ,CAAE,CAEnB,SAAWX,IAAgB,IAAK,CAC9B,GAAM,CAACe,EAAKC,CAAG,EAAIZ,EAInB,GAHAN,EAAO,GAAKiB,EACZjB,EAAO,GAAKkB,EAGV,KAAK,SAASjB,CAAW,IACvBe,EAAQC,EAAKZ,CAAK,IAAMW,EAAQT,EAAK,EAAIE,EAAIJ,CAAK,GAClDW,EAAQE,EAAKb,CAAK,IAAMW,EAAQR,EAAK,EAAIE,EAAIL,CAAK,GACjDW,EAAQT,EAAIF,CAAK,IAAMW,EAAQP,EAAK,EAAIE,EAAGN,CAAK,GAC/CW,EAAQR,EAAIH,CAAK,IAAMW,EAAQN,EAAK,EAAIE,EAAGP,CAAK,GAEpD,MAAO,CACL,IACAC,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,CAChB,CAEJ,SAAWJ,IAAgB,IAAK,CAC9B,GAAM,CAACiB,EAAIC,CAAE,EAAId,EAIjB,GAHAN,EAAO,GAAKmB,EACZnB,EAAO,GAAKoB,EAGV,KAAK,SAASnB,CAAW,GACzBe,EAAQG,EAAId,CAAK,IAAMW,EAAQT,EAAK,EAAIE,EAAIJ,CAAK,GACjDW,EAAQI,EAAIf,CAAK,IAAMW,EAAQR,EAAK,EAAIE,EAAIL,CAAK,EAEjD,MAAO,CAAC,IAAKC,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,CAEjD,CAGA,OAAOS,CACT,EAEOM,GAAQxB,GCpFf,IAAMyB,GAAe,CACnBC,EACAC,IACG,CACH,IAAMC,EAAUF,EAAQ,MAAM,CAAC,EAAe,IAAKG,GACjDC,EAAQD,EAAGF,CAAW,CACxB,EACA,MAAO,CAACD,EAAQ,CAAC,CAAyB,EAAE,OAAOE,CAAM,CAC3D,EAEOG,GAAQN,GCKf,IAAMO,GAAe,CAACC,EAAsBC,IAAyB,CACnE,IAAMC,EAAOC,GAAeH,CAAS,EAE/BI,EAAQ,OAAOH,GAAgB,UAAYA,GAAe,EAC5DA,EACqC,EAEnCI,EAAc,CAAE,GAAGC,CAAa,EAEhCC,EAAkB,CAAC,EACrBC,EAAc,IACdC,EAAc,IAElB,OAAOC,EAAQR,EAAM,CAACS,EAAKC,EAAGC,EAAOC,IAAU,CAC7CT,EAAY,EAAIQ,EAChBR,EAAY,EAAIS,EAChB,IAAMC,EAAoBC,EAAiBL,EAAKN,CAAW,EACvDY,EAASN,EAKb,GAJA,CAACH,CAAW,EAAIG,EAGhBJ,EAAgBK,CAAC,EAAIJ,EACjBI,EAAG,CAELH,EAAcF,EAAgBK,EAAI,CAAC,EACnC,IAAMM,EAAeC,GACnBR,EACAI,EACAV,EACAI,CACF,EACMW,EAAaC,GAAaH,EAAcd,CAAK,EAC7CkB,EAAYF,EAAW,KAAK,EAAE,EAC9BG,EAAkBC,GAAkBN,EAAcN,EAAGC,EAAOC,CAAK,EACjEW,EAAaJ,GAAaE,EAAiBnB,CAAK,EAChDsB,EAAYD,EAAW,KAAK,EAAE,EACpCR,EAASK,EAAU,OAASI,EAAU,OAASN,EAAaK,CAC9D,CAEA,IAAME,EAASZ,EAAkB,OACjC,OAAAV,EAAY,GAAK,CAACU,EAAkBY,EAAS,CAAC,EAC9CtB,EAAY,GAAK,CAACU,EAAkBY,EAAS,CAAC,EAC9CtB,EAAY,GAAK,CAACU,EAAkBY,EAAS,CAAC,GAAKtB,EAAY,GAC/DA,EAAY,GAAK,CAACU,EAAkBY,EAAS,CAAC,GAAKtB,EAAY,GAExDY,CACT,CAAC,CACH,EAEOW,GAAQ7B,GC3Cf,IAAM8B,GAAeC,GAAyB,CAC5C,IAAMC,EAAeC,GAAeF,CAAS,EACvCG,EAAiBC,EAAcH,CAAY,EAC3CI,EAAOJ,EAAa,OACpBK,EAAWL,EAAaI,EAAO,CAAC,EAAE,CAAC,IAAM,IAEzCE,EAAeC,EAAQP,EAAc,CAACQ,EAAS,IAAM,CACzD,IAAMC,EAAoBP,EAAe,CAAC,EACpCQ,EAAU,GAAKV,EAAa,EAAI,CAAC,EACjCW,EAAcD,GAAWA,EAAQ,CAAC,EAClCE,EAAUZ,EAAa,EAAI,CAAC,EAC5Ba,EAAcD,GAAWA,EAAQ,CAAC,EAClC,CAACE,CAAW,EAAIN,EAChB,CAACO,EAAGC,CAAC,EAAId,EAAe,EAAI,EAAI,EAAIE,EAAO,CAAC,EAAE,MAAM,EAAE,EACxDa,EAAST,EAEb,OAAQM,EAAa,CACnB,IAAK,IACHG,EAAUZ,EAAW,CAAC,GAAG,EAAI,CAACS,EAAaC,EAAGC,CAAC,EAC/C,MACF,IAAK,IACHC,EAAS,CACPH,EACAN,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,IAAM,EAAI,EAAI,EACvBO,EACAC,CACF,EACA,MACF,IAAK,IACCJ,GAAWC,IAAgB,IAC7BI,EAAS,CAAC,IAAKT,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGO,EAAGC,CAAC,EAE3CC,EAAS,CACPH,EACAN,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTO,EACAC,CACF,EAEF,MACF,IAAK,IAEDL,GAAe,KAAK,SAASA,CAAW,IACvC,CAACC,GAAWC,IAAgB,KAE7BI,EAAS,CACP,IACAR,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBM,EACAC,CACF,EAEAC,EAAS,CACPH,EACAL,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBM,EACAC,CACF,EAEF,MACF,IAAK,IACCJ,GAAWC,IAAgB,IAC7BI,EAAS,CAAC,IAAKF,EAAGC,CAAC,EAEnBC,EAAS,CAACH,EAAaN,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGO,EAAGC,CAAC,EAErD,MACF,IAAK,IAEDL,GAAe,KAAK,SAASA,CAAW,IACvC,CAACC,GAAWC,IAAgB,KAE7BI,EAAS,CACP,IACAR,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBM,EACAC,CACF,EAEAC,EAAS,CAACH,EAAaC,EAAGC,CAAC,EAE7B,MACF,IAAK,IACHC,EAAS,CAAC,IAAKF,EAAGC,CAAC,EACnB,MACF,IAAK,IACHC,EAAS,CAACH,EAAaC,CAAC,EACxB,MACF,IAAK,IACHE,EAAS,CAACH,EAAaE,CAAC,EACxB,MACF,QACEC,EAAS,CAACH,CAA0C,EAAE,OACpDN,EAAQ,MAAM,EAAG,EAAE,EACnBO,EACAC,CACF,CACJ,CAEA,OAAOC,CACT,CAAC,EAED,OACEZ,EACIC,EAAa,QAAQ,EACrB,CAACA,EAAa,CAAC,CAAgB,EAAE,OAAOA,EAAa,MAAM,CAAC,EAAE,QAAQ,CAAC,CAE/E,EAEOY,GAAQpB,GC7Hf,IAAMqB,GAAaC,GAAsC,CACvD,IAAMC,EAAY,CAAC,EACfC,EACAC,EAAK,GACLC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACHC,EAAS,CAAE,GAAGC,CAAa,EAEjC,OAAAT,EAAU,QAASU,GAAQ,CACzB,GAAM,CAACC,CAAW,EAAID,EAChBE,EAAaD,EAAY,YAAY,EACrCE,EAAaF,EAAY,YAAY,EACrCG,EAAaH,IAAgBE,EAC7BE,EAASL,EAAI,MAAM,CAAC,EAEtBE,IAAe,KACjBT,GAAM,EACN,CAACC,EAAGC,CAAC,EAAIU,EACTX,GAAKU,EAAaN,EAAO,EAAI,EAC7BH,GAAKS,EAAaN,EAAO,EAAI,EAC7BF,EAAKF,EACLG,EAAKF,EACLH,EAAO,CAAEY,EAAa,CAACF,EAAYN,EAAIC,CAAE,EAAIG,CAAgB,IAEzDE,IAAe,KACjBR,EAAIE,EACJD,EAAIE,GACKK,IAAe,KACxB,CAAC,CAAER,CAAC,EAAIM,EACRN,GAAKU,EAAaN,EAAO,EAAyC,GACzDI,IAAe,KACxB,CAAC,CAAEP,CAAC,EAAIK,EACRL,GAAKS,EAAaN,EAAO,EAAyC,IAElE,CAACJ,EAAGC,CAAC,EAAIK,EAAI,MAAM,EAAE,EACrBN,GAAKU,EAAaN,EAAO,EAAI,EAC7BH,GAAKS,EAAaN,EAAO,EAAI,GAE/BN,EAAK,KAAKQ,CAAG,GAGfF,EAAO,EAAIJ,EACXI,EAAO,EAAIH,EACXJ,EAAUE,CAAE,EAAID,CAClB,CAAC,EAEMD,CACT,EACOe,GAAQjB,GCtEf,OAAOkB,OAAe,oBAYtB,IAAMC,GAAgBC,GAAgD,CACpE,IAAIC,EAAS,IAAIH,GACX,CAAE,OAAAI,CAAO,EAAIF,EACb,CAACG,EAASC,CAAO,EAAIF,EACrB,CAAE,UAAAG,CAAU,EAAIL,EAChB,CAAE,OAAAM,CAAO,EAAIN,EACb,CAAE,KAAAO,CAAK,EAAIP,EACX,CAAE,MAAAQ,CAAM,EAAIR,EAGlB,OACE,MAAM,QAAQK,CAAS,GACvBA,EAAU,QAAU,GACpBA,EAAU,MAAOI,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACxCJ,EAAU,KAAMI,GAAMA,IAAM,CAAC,EAE7BR,EAASA,EAAO,UAAU,GAAII,CAAuC,EAC5D,OAAOA,GAAc,UAAY,CAAC,OAAO,MAAMA,CAAS,IACjEJ,EAASA,EAAO,UAAUI,CAAS,IAGjCC,GAAUC,GAAQC,KAEpBP,EAASA,EAAO,UAAUE,EAASC,CAAO,EAIxC,MAAM,QAAQE,CAAM,GACpBA,EAAO,QAAU,GACjBA,EAAO,MAAOG,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACrCH,EAAO,KAAMG,GAAMA,IAAM,CAAC,EAE1BR,EAASA,EAAO,OAAO,GAAIK,CAAoC,EACtD,OAAOA,GAAW,UAAY,CAAC,OAAO,MAAMA,CAAM,IAC3DL,EAASA,EAAO,OAAOK,CAAM,GAK7B,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAW,GAAKA,EAAK,MAAOE,GACtD,CAAC,OAAO,MAAM,CAACA,CAAC,CAClB,GAAKF,EAAK,KAAME,GAAMA,IAAM,CAAC,GAE7BR,EAASM,EAAK,CAAC,EAAIN,EAAO,MAAMM,EAAK,CAAC,CAAC,EAAIN,EAC3CA,EAASM,EAAK,CAAC,EAAIN,EAAO,MAAMM,EAAK,CAAC,CAAC,EAAIN,GAClC,OAAOM,GAAS,UAAY,CAAC,OAAO,MAAMA,CAAI,IACvDN,EAASA,EAAO,MAAMM,CAAI,GAK1B,MAAM,QAAQC,CAAK,GAAKA,EAAM,QAAU,GAAKA,EAAM,MAAOC,GACxD,CAAC,OAAO,MAAM,CAACA,CAAC,CAClB,GAAKD,EAAM,KAAMC,GAAMA,IAAM,CAAC,EAE9BR,EAASA,EAAO,MAAM,GAAIO,CAAmC,EACpD,OAAOA,GAAU,UAAY,CAAC,OAAO,MAAMA,CAAK,IACzDP,EAASA,EAAO,MAAMO,CAAK,GAG7BP,EAASA,EAAO,UAAU,CAACE,EAAS,CAACC,CAAO,GAGvCH,CACT,EACOS,GAAQX,GC7Ef,OAAOY,OAAe,oBActB,IAAMC,GAAiB,CACrBC,EACAC,IACqC,CACrC,IAAIC,EAAIJ,GAAU,UAAUG,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE5C,OAAC,CAAE,CAAE,CAAEC,EAAE,GAAG,EAAID,EAChBC,EAAIF,EAAK,SAASE,CAAC,EAEZ,CAACA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,GAAG,CACpC,EAgBMC,GAAe,CACnBD,EACAE,EACAC,IACe,CACf,GAAM,CAACC,EAASC,EAASC,CAAO,EAAIH,EAC9B,CAACI,EAAGC,EAAGC,CAAC,EAAIZ,GAAeG,EAAG,CAACE,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG,EAAG,CAAC,CAAC,EAE5DQ,EAAoBH,EAAIH,EACxBO,EAAoBH,EAAIH,EACxBO,EAAoBH,EAAIH,EAE9B,MAAO,CAELI,GAAqB,KAAK,IAAIJ,CAAO,EAAI,KAAK,IAAIM,CAAiB,GAAK,GACxER,EACAO,GAAqB,KAAK,IAAIL,CAAO,EAAI,KAAK,IAAIM,CAAiB,GAAK,GACxEP,CACF,CACF,EACOQ,GAAQZ,GCjCf,IAAMa,GAAgB,CACpBC,EACAC,IACG,CAEH,IAAIC,EAAI,EACJC,EAAI,EAEJC,EAAK,EACLC,EAAK,EAELC,EAAI,EACJC,EAAK,EACLC,EAAc,IAEZC,EAAOC,EAAgBV,CAAS,EAChCW,EAAiBV,GAAa,OAAO,KAAKA,CAAS,EAGzD,GAAI,CAACA,GAAcU,GAAkB,CAACA,EAAe,OACnD,OAAOF,EAAK,MAAM,CAAC,EAIhBR,EAAU,QACb,OAAO,OAAOA,EAAW,CAAE,OAAQW,EAAe,MAAO,CAAC,EAE5D,IAAMC,EAASZ,EAAU,OACnBa,EAAiBC,GAAad,CAAkC,EAEtE,OAAIa,EAAe,WAAmBL,EAAK,MAAM,CAAC,EAE3CO,EAAuBP,EAAM,CAACQ,EAAKC,EAAOC,EAAOC,IAAU,CAChE,CAACZ,CAAW,EAAIS,EAChB,IAAMI,EAAab,EAAY,YAAY,EAErCc,EADaD,IAAeb,EAE9Be,EAAkBN,EAAKC,EAAOC,EAAOC,CAAK,EACzCH,EAAI,MAAM,CAAC,EAEZO,EAASH,IAAe,IAEvB,CAAC,GAAsB,EAAE,OAC1BI,GACEN,EACAC,EACAE,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,CACnB,CACF,EACED,IAAe,IACd,CAAC,IAAKF,EAAOG,EAAgB,CAAC,CAAC,EAChCD,IAAe,IACd,CAAC,IAAKC,EAAgB,CAAC,EAAGF,CAAK,EAChCE,EAGJd,EAAcgB,EAAO,CAAC,EACtB,IAAME,EAAYlB,IAAgB,KAAOgB,EAAO,OAAS,EACnDG,EACHD,EAAYF,EAAO,MAAM,EAAG,CAAC,EAAIA,EAAO,MAAM,CAAC,EAalD,GAXIE,IACFjB,EAAK,OACHS,EAAQ,EACR,EACA,CAAC,GAAkC,EAAE,OACnCM,EAAO,MAAM,CAAC,CAChB,CACF,EACAA,EAASG,GAGPnB,IAAgB,IAAK,CACvB,CAACJ,EAAIC,CAAE,EAAIuB,GAAad,EAAgB,CACrCU,EAAoB,CAAC,EACrBA,EAAoB,CAAC,CACxB,EAAGX,CAAM,EAGLX,IAAME,GAAMD,IAAME,EACpBmB,EAAS,CAAC,IAAKpB,EAAIC,CAAE,EACZF,IAAME,EACfmB,EAAS,CAAC,IAAKpB,CAAE,EACRF,IAAME,IACfoB,EAAS,CAAC,IAAKnB,CAAE,EAErB,KACE,KAAKC,EAAI,EAAGC,EAAKiB,EAAO,OAAQlB,EAAIC,EAAID,GAAK,EAC3C,CAACF,EAAIC,CAAE,EAAIuB,GACTd,EACA,CAAC,CAACU,EAAOlB,CAAC,EAAG,CAACkB,EAAOlB,EAAI,CAAC,CAAC,EAC3BO,CACF,EACAW,EAAOlB,CAAC,EAAIF,EACZoB,EAAOlB,EAAI,CAAC,EAAID,EAIpB,OAAAH,EAAIE,EACJD,EAAIE,EAEGmB,CACT,CAAC,CACH,EAEOK,GAAQ9B,GCjIf,IAAM+B,GAAgBC,GAAqB,CACzC,IAAMC,EAAeD,EAClB,MAAM,CAAC,EACP,IAAI,CAACE,EAAGC,EAAGC,IACTD,EAEGC,EAAUD,EAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,MAAM,CAAC,CAAC,EAD5CF,EAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAOE,EAAE,MAAM,CAAC,CAAa,CAEpD,EACC,IAAKA,GAAMA,EAAE,IAAI,CAACG,EAAGF,IAAMD,EAAEA,EAAE,OAASC,EAAI,GAAK,EAAKA,EAAI,EAAG,CAAC,CAAC,EAC/D,QAAQ,EAEX,MAAO,CAAC,CAAC,GAA2B,EAAE,OAAOF,EAAa,CAAC,EAAE,MAAM,EAAG,CAAC,CAAC,CAAC,EACtE,OACCA,EAAa,IAAKC,GAAM,CAAC,GAA2B,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,CAC1E,CACJ,EAEOI,GAAQP,GCbf,IAAMQ,GAAY,CAACC,EAAiBC,IAAiC,CACnE,GAAI,CAAE,MAAAC,CAAM,EAAIC,EAEhBD,EAAQD,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOC,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAGzC,OAAIA,IAAU,MAAcF,EAAK,MAAM,CAAC,EAEjCI,EAAqBJ,EAAOK,GAC1BC,GAAaD,EAASH,CAAK,CACnC,CACH,EACOK,GAAQR,GCrBf,IAAMS,GAAa,CACjBC,EACAC,EAAQ,KACyB,CACjC,IAAMC,EAAID,EACJE,EAAKH,EAAI,MAAM,EAAG,CAAC,EACnBI,EAAKJ,EAAI,MAAM,EAAG,CAAC,EACnBK,EAAKL,EAAI,MAAM,EAAG,CAAC,EACnBM,EAAKN,EAAI,MAAM,EAAG,CAAC,EACnBO,EAAKC,EAASL,EAAIC,EAAIF,CAAC,EACvBO,EAAKD,EAASJ,EAAIC,EAAIH,CAAC,EACvBQ,EAAKF,EAASH,EAAIC,EAAIJ,CAAC,EACvBS,EAAKH,EAASD,EAAIE,EAAIP,CAAC,EACvBU,EAAKJ,EAASC,EAAIC,EAAIR,CAAC,EACvBW,EAAKL,EAASG,EAAIC,EAAIV,CAAC,EAE7B,MAAO,CACL,CAAC,IAAKK,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGI,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,EAC9C,CAAC,IAAKD,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGF,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGJ,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAChD,CACF,EACOQ,GAAQf,G1E8Df,IAAMgB,GAAN,KAAuB,CAWrB,YAAYC,EAAmBC,EAA2B,CACxD,IAAMC,EAAkBD,GAAU,CAAC,EAC7BE,EAAY,OAAOH,EAAc,IAEvC,GAAIG,GAAa,CAACH,EAAU,OAC1B,MAAM,UACJ,GAAGI,CAAK,oBAAoBD,EAAY,YAAc,OAAO,EAC/D,EAGF,KAAK,SAAWE,EAAgBL,CAAS,EAGzC,GAAM,CAAE,MAAOM,EAAa,OAAQC,CAAa,EAAIL,EACjDM,EAEA,OAAO,UAAUF,CAAW,GAAKA,IAAgB,MACnDE,EAAQF,EAERE,EAAQC,EAAe,MAKzB,IAAIC,EAASD,EAAe,OAE5B,GAAI,MAAM,QAAQF,CAAY,GAAKA,EAAa,QAAU,EAAG,CAC3D,GAAM,CAACI,EAASC,EAASC,CAAO,EAAIN,EAAa,IAAI,MAAM,EAC3DG,EAAS,CACN,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMC,CAAO,EAAc,EAAVA,CAC3B,CACF,CAEA,YAAK,MAAQL,EACb,KAAK,OAASE,EAEP,IACT,CACA,IAAI,MAAO,CACT,OAAOI,GAAY,KAAK,QAAQ,CAClC,CACA,IAAI,QAAS,CACX,OAAOC,EAAe,KAAK,QAAQ,CACrC,CAQA,SAAU,CACR,OAAO,KAAK,IACd,CAQA,gBAAiB,CACf,OAAO,KAAK,MACd,CAUA,iBAAiBC,EAAgB,CAC/B,OAAOC,GAAiB,KAAK,SAAUD,CAAM,CAC/C,CAOA,YAAa,CACX,GAAM,CAAE,SAAAE,CAAS,EAAI,KACrB,YAAK,SAAWC,GAAeD,CAAQ,EAChC,IACT,CAOA,YAAa,CACX,GAAM,CAAE,SAAAA,CAAS,EAAI,KACrB,YAAK,SAAWE,GAAeF,CAAQ,EAChC,IACT,CAQA,SAAU,CACR,GAAM,CAAE,SAAAA,CAAS,EAAI,KACrB,YAAK,SAAWG,GAAYH,CAAQ,EAC7B,IACT,CAQA,QAAQI,EAAuB,CAC7B,GAAM,CAAE,SAAAJ,CAAS,EAAI,KACfK,EAAQC,GAAUN,CAAQ,EAC1BO,EAAUF,EAAM,OAAS,EAAIA,EAAQ,GAErCG,EAAoBD,EACtBA,EAAQ,IAAI,CAACE,EAAGC,IACVN,EACKM,EAAIC,GAAYF,CAAC,EAAIA,EAAE,MAAM,CAAC,EAEhCE,GAAYF,CAAC,CACrB,EACDT,EAAS,MAAM,CAAC,EAEhBY,EAAO,CAAC,EACZ,OAAIL,EACFK,EAAOJ,EAAkB,KAAK,CAAC,EAE/BI,EAAOR,EAAcJ,EAAWW,GAAYX,CAAQ,EAGtD,KAAK,SAAWY,EAAK,MAAM,CAAC,EACrB,IACT,CASA,WAAY,CACV,GAAM,CAAE,SAAAZ,CAAS,EAAI,KACrB,YAAK,SAAWa,EAAcb,CAAQ,EAC/B,IACT,CAUA,UAAW,CACT,GAAM,CAAE,SAAAA,CAAS,EAAI,KACfV,EAAQ,KAAK,QAAU,MAAQ,EAAI,KAAK,MAE9C,YAAK,SAAWwB,GAAad,EAAUV,CAAK,EACrC,IACT,CAUA,UAAUyB,EAAmC,CAC3C,GACE,CAACA,GACD,OAAOA,GAAW,UACjB,OAAOA,GAAW,UACjB,CAAC,CAAC,YAAa,SAAU,OAAQ,OAAO,EAAE,KAAMN,GAAMA,KAAKM,CAAM,EAEnE,OAAO,KAGT,GAAM,CACJ,SAAAf,EACA,OAAQ,CAACgB,EAAIC,EAAIC,CAAE,CACrB,EAAI,KACEC,EAAY,CAAC,EACnB,OAAW,CAACC,EAAGC,CAAC,IAAK,OAAO,QAAQN,CAAM,EAAuB,CAE3DK,IAAM,QAAU,MAAM,QAAQC,CAAC,IAGhCD,IAAM,UACLA,IAAM,aACNA,IAAM,UACNA,IAAM,UACR,MAAM,QAAQC,CAAC,EANfF,EAAUC,CAAC,EAAIC,EAAE,IAAI,MAAM,EASlBD,IAAM,UAAY,OAAO,OAAOC,CAAC,GAAM,WAChDF,EAAUC,CAAC,EAAI,OAAOC,CAAC,EAE3B,CAIA,GAAM,CAAE,OAAA7B,CAAO,EAAI2B,EAEnB,GAAI,MAAM,QAAQ3B,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,GAAM,CAACC,EAASC,EAASC,CAAO,EAAIH,EAAO,IAAI,MAAM,EACrD2B,EAAU,OAAS,CAChB,OAAO,MAAM1B,CAAO,EAAcuB,EAAVvB,EACxB,OAAO,MAAMC,CAAO,EAAcuB,EAAVvB,EACzBC,GAAWuB,CACb,CACF,MACEC,EAAU,OAAS,CAACH,EAAIC,EAAIC,CAAE,EAGhC,YAAK,SAAWI,GAActB,EAAUmB,CAAS,EAC1C,IACT,CAOA,OAAQ,CACN,GAAM,CAAE,GAAAH,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,EAAG,IAAK,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,CAAE,CAAC,EACpD,IACT,CAOA,OAAQ,CACN,GAAM,CAAE,GAAAD,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,IAAK,EAAG,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,CAAE,CAAC,EACpD,IACT,CASA,UAAW,CACT,OAAOM,GAAa,KAAK,SAAU,KAAK,KAAK,CAC/C,CAQA,SAAU,CACR,OAAO,KAAK,IAAI,EAAE,QAASC,GAAQ,OAAO,KAAKA,CAAwB,CAAC,CAC1E,CAEA,WAAW,WAAY,CACrB,OAAOC,EACT,CACA,WAAW,UAAW,CACpB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CAEA,WAAW,YAAa,CACtB,OAAOC,EACT,CACA,WAAW,WAAY,CACrB,OAAOC,EACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,WAAY,CACrB,OAAOC,EACT,CACA,WAAW,gBAAiB,CAC1B,OAAO9B,EACT,CACA,WAAW,gBAAiB,CAC1B,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,cAAe,CACxB,OAAOoB,EACT,CACA,WAAW,oBAAqB,CAC9B,OAAOS,EACT,CACA,WAAW,UAAW,CACpB,OAAOC,CACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,SAAU,CACnB,OAAOC,CACT,CACA,WAAW,iBAAkB,CAC3B,OAAOhD,CACT,CACA,WAAW,iBAAkB,CAC3B,OAAOiD,EACT,CACA,WAAW,kBAAmB,CAC5B,OAAOC,CACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,SAAU,CACnB,OAAOC,CACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,eAAgB,CACzB,OAAOC,EACT,CACA,WAAW,eAAgB,CACzB,OAAOC,EACT,CACA,WAAW,SAAU,CACnB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,CACT,CACA,WAAW,cAAe,CACxB,OAAOC,CACT,CACA,WAAW,YAAa,CACtB,OAAOC,CACT,CACA,WAAW,UAAW,CACpB,OAAOC,EACT,CACA,WAAW,WAAY,CACrB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,YAAa,CACtB,OAAOC,CACT,CACA,WAAW,iBAAkB,CAC3B,OAAOC,EACT,CACA,WAAW,iBAAkB,CAC3B,OAAOC,EACT,CACA,WAAW,kBAAmB,CAC5B,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAO1D,EACT,CACA,WAAW,kBAAmB,CAC5B,OAAOG,EACT,CACA,WAAW,uBAAwB,CACjC,OAAOwD,EACT,CACA,WAAW,sBAAuB,CAChC,OAAOC,CACT,CACA,WAAW,oBAAqB,CAC9B,OAAOC,EACT,CACA,WAAW,mBAAoB,CAC7B,OAAOC,EACT,CACA,WAAW,gBAAiB,CAC1B,OAAO7D,CACT,CACA,WAAW,iBAAkB,CAC3B,OAAO8D,EACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,mBAAoB,CAC7B,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,iBAAkB,CAC3B,OAAOC,EACT,CACA,WAAW,iBAAkB,CAC3B,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,kBAAmB,CAC5B,OAAOC,EACT,CACA,WAAW,mBAAoB,CAC7B,OAAOC,CACT,CACA,WAAW,YAAa,CACtB,OAAOC,EACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,SAAU,CACnB,OAAOC,CACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,eAAgB,CACzB,OAAO5D,CACT,CACA,WAAW,kBAAmB,CAC5B,OAAO6D,CACT,CACA,WAAW,cAAe,CACxB,OAAO5D,EACT,CACA,WAAW,cAAe,CACxB,OAAO6D,EACT,CACA,WAAW,aAAc,CACvB,OAAOC,EACT,CACA,WAAW,mBAAoB,CAC7B,OAAOC,EACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,aAAc,CACvB,OAAOnE,EACT,CACA,WAAW,WAAY,CACrB,OAAOoE,EACT,CACA,WAAW,cAAe,CACxB,OAAOC,EACT,CACA,WAAW,gBAAiB,CAC1B,OAAOC,EACT,CACA,WAAW,gBAAiB,CAC1B,OAAOC,EACT,CACA,WAAW,YAAa,CACtB,OAAOC,EACT,CACA,WAAW,WAAY,CACrB,OAAO7E,EACT,CACA,WAAW,eAAgB,CACzB,OAAOgB,EACT,CACF,EAEO8D,GAAQvG","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js b/docs/svg-path-commander.js index 5e1fb58..ee4e86b 100755 --- a/docs/svg-path-commander.js +++ b/docs/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,c,a,l,m,h,f,g,u,y,p,x,C]=r;t.m11=s,t.a=s,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[s,n,i,o,c,a]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(i==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(i.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(i==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(i==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(i==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(i==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&a&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](a);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[p===0?a:x,p===1?a:x,p===2?a:x];r=r[u](...C)}else throw TypeError(s)}),r},Vt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const s=new T;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Ae=(e,t,r)=>{const s=new T,n=Math.PI/180,i=e*n,o=t*n,c=r*n,a=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+a*g;s.m21=p,s.c=p;const x=a*f-l*h*g;return s.m22=x,s.d=x,s.m23=-l*m,s.m31=l*g-a*h*f,s.m32=l*f+a*h*g,s.m33=a*m,s},pe=(e,t,r,s)=>{const n=new T,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,c=t/i,a=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,p=1-2*(u+y)*f;n.m11=p,n.a=p;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const s=new T;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},Ct=(e,t)=>{const r=new T;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),H=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,s,n,i,o,c,a,l,m,h,f,g,u,y,p,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(Vt(this,t))}toFloat64Array(t){return Float64Array.from(Vt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return H(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,be(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),H(this,xe(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,Ae(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,pe(t,r,s,n))}skewX(t){return H(this,Ce(t))}skewY(t){return H(this,Me(t))}skew(t,r){return H(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}R(T,"Translate",be),R(T,"Rotate",Ae),R(T,"RotateAxisAngle",pe),R(T,"Scale",xe),R(T,"SkewX",Ce),R(T,"SkewY",Me),R(T,"Skew",Ct),R(T,"Multiply",H),R(T,"fromArray",ct),R(T,"fromMatrix",ye),R(T,"fromString",de),R(T,"toArray",Vt),R(T,"isCompatibleArray",fe),R(T,"isCompatibleObject",ge);const Z=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,s)=>lt([e,t],[r,s]),It=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[c,a]=Z([e,t],[r,s],n/o);i={x:c,y:a}}}return i},Rt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Pe={getLineBBox:Rt,getLineLength:mt,getPointAtLineLength:It},Et=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,c=t**2*i**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},_=(e,t,r,s,n,i)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(i),h=s*o(i);return[e+a*m-l*h,t+l*m+a*h]},jt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,c=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,s,n,i,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,A={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=A.x**2/u**2+A.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*A.y**2-y**2*A.x**2,q=u**2*A.y**2+y**2*A.x**2;let $=S/q;$=$<0?0:$;const v=(i!==o?1:-1)*f($),N={x:v*(u*A.y/y),y:v*(-(y*A.x)/u)},O={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(A.x-N.x)/u,y:(A.y-N.y)/y},k=jt({x:1,y:0},Y),P={x:(-A.x-N.x)/u,y:(-A.y-N.y)/y};let V=jt(Y,P);!o&&V>0?V-=2*g:o&&V<0&&(V+=2*g),V%=2*g;const B=k+V;return{center:O,startAngle:k,endAngle:B,rx:u,ry:y}},Dt=(e,t,r,s,n,i,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,s,n,i,o,c,a);return Et(l,m,f-h)},Se=(e,t,r,s,n,i,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,s,n,i,o,c,a);if(typeof l=="number"){const p=Et(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return It(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,A=y-u,S=(n%360+360)%360*(x/180),q=u+A*(l/p),$=f*C(q),v=g*d(q);m={x:C(S)*$-d(S)*v+h.x,y:d(S)*$+C(S)*v+h.y}}}return m},Te=(e,t,r,s,n,i,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,s,n,i,o,c,a),u=g-f,{min:y,max:p,tan:x,atan2:C,PI:d}=Math,{x:A,y:M}=l,S=n*d/180,q=x(S),$=C(-h*q,m),v=$,N=$+d,O=C(h,m*q),Y=O+d,k=[c],P=[a];let V=y(e,c),B=p(e,c),D=y(t,a),U=p(t,a);const at=g-u*1e-5,tt=_(A,M,m,h,S,at),L=g-u*.99999,I=_(A,M,m,h,S,L);if(tt[0]>B||I[0]>B){const z=_(A,M,m,h,S,v);k.push(z[0]),P.push(z[1])}if(tt[0]U||I[1]>U){const z=_(A,M,m,h,S,O);k.push(z[0]),P.push(z[1])}return V=y.apply([],k),D=y.apply([],P),B=p.apply([],k),U=p.apply([],P),[V,D,B,U]},Ne={angleBetween:jt,arcLength:Et,arcPoint:_,getArcBBox:Te,getArcLength:Dt,getArcProps:Mt,getPointAtArcLength:Se},Qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=i,a=s*t*2,l=o):r===3&&(c=i*s,a=i*t*3,l=s*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},qe=e=>{const r=Qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sve(r[0],s))},$e=1e-8,Pt=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)<$e)return e===s&&e===t?[e,s]:Pt([e,-.5*e+1.5*t,e-3*t+3*r]);const i=-e*r+e*s-t*r-t*s+t*t+r*r;if(i<=0)return[Math.min(e,s),Math.max(e,s)];const o=Math.sqrt(i);let c=Math.min(e,s),a=Math.max(e,s);const l=e-2*t+r;for(let m=(l+o)/n,h=1;h<=2;m=(l-o)/n,h++)if(m>0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fa&&(a=f)}return[c,a]},ke={bezierLength:qe,calculateBezier:ze,CBEZIER_MINMAX_EPSILON:$e,computeBezier:ve,Cvalues:we,deriveBezier:Le,getBezierLength:ut,minmaxC:Zt,minmaxQ:Pt,Tvalues:Qt},Ve=([e,t,r,s,n,i,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*s+3*l*a**2*i+a**3*c}},St=(e,t,r,s,n,i,o,c)=>ut([e,t,r,s,n,i,o,c]),Ie=(e,t,r,s,n,i,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,s,n,i,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=Ve([e,t,r,s,n,i,o,c],a/h))}return m},Ot=(e,t,r,s,n,i,o,c)=>{const a=Zt([e,r,n,o]),l=Zt([t,s,i,c]);return[a[0],l[0],a[1],l[1]]},Re={getCubicBBox:Ot,getCubicLength:St,getPointAtCubicLength:Ie,getPointAtCubicSegmentLength:Ve},Ee=([e,t,r,s,n,i],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*s+o**2*i}},Tt=(e,t,r,s,n,i)=>ut([e,t,r,s,n,i]),je=(e,t,r,s,n,i,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,s,n,i]);o<=0||(o>=l?a={x:n,y:i}:a=Ee([e,t,r,s,n,i],o/l))}return a},Bt=(e,t,r,s,n,i)=>{const o=Pt([e,r,n]),c=Pt([t,s,i]);return[o[0],c[0],o[1],c[1]]},De={getPointAtQuadLength:je,getPointAtQuadSegmentLength:Ee,getQuadBBox:Bt,getQuadLength:Tt},Qe={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+lt(e[s-1],r):0,0)},et=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=K[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,K[r]))),!!K[r]););},Q="SVGPathCommander Error",Ht=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${Q}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",Ft=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${Q}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${Q}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},_t=e=>F(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=K[r[s].toLowerCase()];if(e.segmentStart=s,!Ut(i)){e.err=`${Q}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const c=n[n.length-1];if(!Kt(i)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${Q}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(i)&&(l===3||l===4)?Ht(e):Ft(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!_t(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const E=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const c=[],a=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=E(e);return j(t,nt)},vt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const c=[],a=e.length;for(let l=1;l{const t=E(e);return j(t,vt)},ft=(e,t,r,s,n,i,o,c,a,l)=>{let m=e,h=t,f=r,g=s,u=c,y=a;const p=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,A,M,S,q;if(l)[A,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,I=(h-y)/2;let z=L*L/(f*f)+I*I/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(i===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*I*I-he*L*L)/(ue*I*I+he*L*L)));S=Ye*f*I/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,A=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),A=mM&&(A-=Math.PI*2),!o&&M>A&&(M-=Math.PI*2)}let $=M-A;if(Math.abs($)>p){const L=M,I=u,z=y;M=A+p*(o&&M>A?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,I,z,[M,L,S,q])}$=M-A;const v=Math.cos(A),N=Math.sin(A),O=Math.cos(M),Y=Math.sin(M),k=Math.tan($/4),P=4/3*f*k,V=4/3*g*k,B=[m,h],D=[m+P*N,h-V*v],U=[u+P*Y,y-V*O],at=[u,y];if(D[0]=2*B[0]-D[0],D[1]=2*B[1]-D[1],l)return[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);C=[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,I=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*s,o*n+c*r,o*i+c*s,n,i]},zt=(e,t,r,s)=>{const n=Z([e,t],[r,s],.3333333333333333),i=Z([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Yt=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(ft(o,c,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Xt(o,c,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(zt(o,c,n,i)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=E(e);return j(r,(s,n,i,o)=>{t.x=i,t.y=o;const c=gt(s,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:s}=J,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=E(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,x=0,C=0,d=0,A=0;j(t,(q,$,v,N)=>{[r]=q;const O=r.toUpperCase(),k=O!==r?nt(q,$,v,N):q.slice(0),P=O==="V"?["L",v,k[1]]:O==="H"?["L",k[1],N]:k;if([r]=P,"TQ".includes(O)||(d=0,A=0),r==="M")[,s,n]=P,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Rt(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const V=y*2-x,B=p*2-C;[h,f,g,u]=Ot(v,N,V,B,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Ot(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,A=p*2-A,[h,f,g,u]=Bt(v,N,d,A,P[1],P[2])):r==="Q"?(d=P[1],A=P[2],[h,f,g,u]=Bt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=Rt(v,N,s,n));c=o(h,c),a=o(f,a),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,p]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=E(e);let r=0,s=0,n=0,i=0,o=0,c=0,a="M",l=0,m=0,h=0;return j(t,(f,g,u,y)=>{[a]=f;const p=a.toUpperCase(),C=p!==a?nt(f,g,u,y):f.slice(0),d=p==="V"?["L",u,C[1]]:p==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(p)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Dt(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const A=r*2-n,M=s*2-i;h+=St(u,y,A,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=s*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,s]=a==="Z"?[l,m]:d.slice(-2),[n,i]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,s]}),h},dt=1e-5,st=e=>{const t=E(e),r={...rt};return j(t,(s,n,i,o)=>{r.x=i,r.y=o;const c=gt(s,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},it=(e,t)=>{const r=st(e);let s=!1,n=[],i="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[x,C].concat(y.slice(1)),s?([,a,l]=y,h={x:a,y:l},f=0):i==="L"?(h=It(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):i==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Dt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=Ie(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=je(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},$t=(e,t)=>{const r=E(e);let s=r.slice(0),n=X(s),i=s.length-1,o=0,c=0,a=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=X(s),c=n-o,a=r[i],{segment:a,index:i,length:c,lengthAtSegment:o};const l=[];for(;i>0;)a=s[i],s=s.slice(0,-1),o=X(s),c=n-o,n=o,l.push({segment:a,index:i,length:c,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=E(e),s=st(r),n=X(s),i=A=>{const M=A.x-t.x,S=A.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let A=0;A<=n;A+=o)c=it(s,A),l=i(c),l1e-6&&(u=m-o,f=it(s,u),p=i(f),y=m+o,g=it(s,y),x=i(g),u>=0&&pbt(e,t).closest,rn=(e,t,r,s,n,i,o,c)=>3*((c-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+c*(n+e/3)-o*(i+t/3))/20,ee=e=>{let t=0,r=0,s=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Oe=e=>ee(yt(e))>=0,Be=(e,t)=>$t(e,t).segment,He=(e,t)=>bt(e,t).segment,At=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>At(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Fe=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Ge=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)At(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),se=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},cn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ie=e=>{const t=Object.keys(ot),r=_e(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(a=>s!==a))throw TypeError(`${Q}: "${s}" is not SVGElement`);const n=r?s:e.type,i=ot[n],o={type:n};r?i.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=E(r?e.getAttribute("d")||"":e.d||"")),At(c)&&c.length?c:!1},Je=(e,t,r)=>{const s=r||document,n=Object.keys(ot),i=_e(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${Q}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${Q}: "${o}" is not SVGElement`);const c=s.createElementNS("http://www.w3.org/2000/svg","path"),a=i?o:e.type,l=ot[a],m={type:a},h=J.round,f=ie(e),g=f&&f.length?qt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),se(g)?(c.setAttribute("d",g),t&&i&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,s)=>{const[n]=e,{round:i}=J,o=i,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(s)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(s)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return p},pt=(e,t)=>{const r=e.slice(1).map(s=>w(s,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),s=typeof t=="number"&&t>=0?t:2,n={...rt},i=[];let o="M",c="Z";return j(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,i[l]=o,l){c=i[l-1];const y=oe(a,f,n,c),p=pt(y,s),x=p.join(""),C=vt(y,l,m,h),d=pt(C,s),A=d.join("");g=x.length{const t=ht(e),r=st(t),s=t.length,n=t[s-1][0]==="Z",i=j(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",a[3],a[4],a[1],a[2],u,y]:p=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",a[1],a[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ce=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?a.x:0,i+=g?a.y:0,o=n,c=i,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,i=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,i]=l,i+=g?a.y:0):([n,i]=l.slice(-2),n+=g?a.x:0,i+=g?a.y:0),r.push(l)),a.x=n,a.y=i,t[s]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||c||a)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-s,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},kt=(e,t,r)=>{const[s,n,i]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-s,m=c-n,h=a-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,c=0,a="M";const l=E(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):j(l,(g,u,y,p)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,p):g.slice(0);let A=x==="A"?["C"].concat(ft(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],p]:d;a=A[0];const M=a==="C"&&A.length>7,S=M?A.slice(0,7):A.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(A.slice(7))),A=S),a==="L")[n,i]=kt(f,[A[1],A[2]],h),r!==n&&s!==i?A=["L",n,i]:s===i?A=["H",n]:r===n&&(A=["V",i]);else for(o=1,c=A.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):j(e,s=>pt(s,r))},Xe=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),c=Z(s,n,r),a=Z(n,i,r),l=Z(i,o,r),m=Z(c,a,r),h=Z(a,l,r),f=Z(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${Q}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=E(t);const{round:i,origin:o}=s;let c;Number.isInteger(i)||i==="off"?c=i:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return it(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,s=ce(r),n=s.length>1?s:!1,i=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=st(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?s:a,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return ke}static get cubicTools(){return Re}static get lineTools(){return Pe}static get polygonTools(){return Qe}static get quadTools(){return De}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return Z}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return E}static get finalizeSegment(){return Nt}static get invalidPathValue(){return G}static get isArcCommand(){return Jt}static get isDigit(){return F}static get isDigitStart(){return _t}static get isMoveCommand(){return Kt}static get isPathCommand(){return Ut}static get isSpace(){return Gt}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Ht}static get scanParam(){return Ft}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return Ze}static get getDrawDirection(){return Oe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return it}static get getPropertiesAtLength(){return $t}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Be}static get getSegmentOfPoint(){return He}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return Fe}static get isNormalizedArray(){return re}static get isPathArray(){return At}static get isPointInStroke(){return Ge}static get isRelativeArray(){return Ue}static get isValidPath(){return se}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return ie}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return j}static get lineToCubic(){return zt}static get normalizePath(){return st}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return kt}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return pt}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=ke,b.cubicTools=Re,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=Ze,b.getDrawDirection=Oe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=it,b.getPropertiesAtLength=$t,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Be,b.getSegmentOfPoint=He,b.getTotalLength=X,b.invalidPathValue=G,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=Fe,b.isDigit=F,b.isDigitStart=_t,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=At,b.isPathCommand=Ut,b.isPointInStroke=Ge,b.isRelativeArray=Ue,b.isSpace=Gt,b.isValidPath=se,b.iterate=j,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=Z,b.normalizePath=st,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=E,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=Qe,b.projection2d=kt,b.quadToCubic=Xt,b.quadTools=De,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=pt,b.roundTo=w,b.scanFlag=Ht,b.scanParam=Ft,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=ie,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); +var SVGPathCommander=function(){"use strict";var Ee=Object.defineProperty,Re=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t,r)=>Re(e,typeof t!="symbol"?t+"":t,r);const je={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},Ft=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),Gt=e=>e instanceof DOMMatrix||e instanceof S||typeof e=="object"&&Object.keys(je).every(t=>e&&t in e),et=e=>{const t=new S,r=Array.from(e);if(!Ft(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,g,u,y,p,b,A]=r;t.m11=s,t.a=s,t.m21=a,t.c=a,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=c,t.d=c,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=b,t.m14=o,t.m24=m,t.m34=u,t.m44=A}else if(r.length===6){const[s,n,i,o,a,c]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=a,t.e=a,t.m42=c,t.f=c}return t},Ut=e=>{if(Gt(e))return et([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},_t=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new S;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],g=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(et(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),b=u==="scale"?1:0,A=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...A)}else throw TypeError(s)}),r},Nt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],Jt=(e,t,r)=>{const s=new S;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Kt=(e,t,r)=>{const s=new S,n=Math.PI/180,i=e*n,o=t*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),g=-Math.sin(a),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+c*g;s.m21=p,s.c=p;const b=c*f-l*h*g;return s.m22=b,s.d=b,s.m23=-l*m,s.m31=l*g-c*h*f,s.m32=l*f+c*h*g,s.m33=c*m,s},Wt=(e,t,r,s)=>{const n=new S,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,a=t/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=a*a,y=c*c,p=1-2*(u+y)*f;n.m11=p,n.a=p;const b=2*(o*a*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(o*c*f-a*m*h);const A=2*(a*o*f-c*m*h);n.m21=A,n.c=A;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(g+u)*f,n},Xt=(e,t,r)=>{const s=new S;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},mt=(e,t)=>{const r=new S;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Yt=e=>mt(e,0),te=e=>mt(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,a=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,c=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,b=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return et([r,s,n,i,o,a,c,l,m,h,f,g,u,y,p,b])};class S{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?_t(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?et(t):typeof t=="object"?Ut(t):this}toFloat32Array(t){return Float32Array.from(Nt(this,t))}toFloat64Array(t){return Float64Array.from(Nt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),B(this,Jt(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),B(this,Xt(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),B(this,Kt(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Wt(t,r,s,n))}skewX(t){return B(this,Yt(t))}skewY(t){return B(this,te(t))}skew(t,r){return B(this,mt(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}V(S,"Translate",Jt),V(S,"Rotate",Kt),V(S,"RotateAxisAngle",Wt),V(S,"Scale",Xt),V(S,"SkewX",Yt),V(S,"SkewY",te),V(S,"Skew",mt),V(S,"Multiply",B),V(S,"fromArray",et),V(S,"fromMatrix",Ut),V(S,"fromString",_t),V(S,"toArray",Nt),V(S,"isCompatibleArray",Ft),V(S,"isCompatibleObject",Gt);const O=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},ut=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),nt=(e,t,r,s)=>ut([e,t],[r,s]),wt=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=ut([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[a,c]=O([e,t],[r,s],n/o);i={x:a,y:c}}}return i},Lt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Qe={getLineBBox:Lt,getLineLength:nt,getPointAtLineLength:wt},Tt=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,a=t**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},U=(e,t,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[e+c*m-l*h,t+l*m+c*h]},vt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},ht=(e,t,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const b=(n%360+360)%360*(g/180);if(e===a&&t===c)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(a+e)/2,y:(c+t)/2}};const A=(e-a)/2,d=(t-c)/2,x={x:h(b)*A+m(b)*d,y:-m(b)*A+h(b)*d},M=x.x**2/u**2+x.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const P=u**2*y**2-u**2*x.y**2-y**2*x.x**2,$=u**2*x.y**2+y**2*x.x**2;let q=P/$;q=q<0?0:q;const T=(i!==o?1:-1)*f(q),N={x:T*(u*x.y/y),y:T*(-(y*x.x)/u)},Z={x:h(b)*N.x-m(b)*N.y+(e+a)/2,y:m(b)*N.x+h(b)*N.y+(t+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/y},z=vt({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/y};let k=vt(J,C);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const D=z+k;return{center:Z,startAngle:z,endAngle:D,rx:u,ry:y}},$t=(e,t,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=ht(e,t,r,s,n,i,o,a,c);return Tt(l,m,f-h)},ee=(e,t,r,s,n,i,o,a,c,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=ht(e,t,r,s,n,i,o,a,c);if(typeof l=="number"){const p=Tt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:a,y:c};else{if(e===a&&t===c)return{x:a,y:c};if(f===0||g===0)return wt(e,t,a,c,l);const{PI:b,cos:A,sin:d}=Math,x=y-u,P=(n%360+360)%360*(b/180),$=u+x*(l/p),q=f*A($),T=g*d($);m={x:A(P)*q-d(P)*T+h.x,y:d(P)*q+A(P)*T+h.y}}}return m},ne=(e,t,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=ht(e,t,r,s,n,i,o,a,c),u=g-f,{min:y,max:p,tan:b,atan2:A,PI:d}=Math,{x,y:M}=l,P=n*d/180,$=b(P),q=A(-h*$,m),T=q,N=q+d,Z=A(h,m*$),J=Z+d,z=[a],C=[c];let k=y(e,a),D=p(e,a),E=y(t,c),H=p(t,c);const tt=g-u*1e-5,K=U(x,M,m,h,P,tt),w=g-u*.99999,I=U(x,M,m,h,P,w);if(K[0]>D||I[0]>D){const v=U(x,M,m,h,P,T);z.push(v[0]),C.push(v[1])}if(K[0]H||I[1]>H){const v=U(x,M,m,h,P,Z);z.push(v[0]),C.push(v[1])}return k=y.apply([],z),E=y.apply([],C),D=p.apply([],z),H=p.apply([],C),[k,E,D,H]},Ze={angleBetween:vt,arcLength:Tt,arcPoint:U,getArcBBox:ne,getArcLength:$t,getArcProps:ht,getPointAtArcLength:ee},qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],re=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],se=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*t*2,l=o):r===3&&(a=i*s,c=i*t*3,l=s*o*3,m=t*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t}},oe=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ce=e=>{const r=qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sie(r[0],s))},ae=1e-8,ft=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},De={bezierLength:ce,calculateBezier:oe,CBEZIER_MINMAX_EPSILON:ae,computeBezier:ie,Cvalues:re,deriveBezier:se,getBezierLength:rt,minmaxC:zt,minmaxQ:ft,Tvalues:qt},le=([e,t,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*e+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*t+3*l**2*c*s+3*l*c**2*i+c**3*a}},gt=(e,t,r,s,n,i,o,a)=>rt([e,t,r,s,n,i,o,a]),me=(e,t,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:e,y:t};if(l){const h=rt([e,t,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=le([e,t,r,s,n,i,o,a],c/h))}return m},kt=(e,t,r,s,n,i,o,a)=>{const c=zt([e,r,n,o]),l=zt([t,s,i,a]);return[c[0],l[0],c[1],l[1]]},Oe={getCubicBBox:kt,getCubicLength:gt,getPointAtCubicLength:me,getPointAtCubicSegmentLength:le},ue=([e,t,r,s,n,i],o)=>{const a=1-o;return{x:a**2*e+2*a*o*r+o**2*n,y:a**2*t+2*a*o*s+o**2*i}},yt=(e,t,r,s,n,i)=>rt([e,t,r,s,n,i]),he=(e,t,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:e,y:t};if(a){const l=rt([e,t,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=ue([e,t,r,s,n,i],o/l))}return c},It=(e,t,r,s,n,i)=>{const o=ft([e,r,n]),a=ft([t,s,i]);return[o[0],a[0],o[1],a[1]]},Be={getPointAtQuadLength:he,getPointAtQuadSegmentLength:ue,getQuadBBox:It,getQuadLength:yt},He={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+ut(e[s-1],r):0,0)},st=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},L=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},_={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Vt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",fe=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${R}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",ge=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=t){e.err=`${R}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${R}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),X=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xe=e=>F(e)||e===43||e===45||e===46,pe=e=>(e|32)===97,be=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},Et=e=>{var c;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(e.segmentStart=s,!de(i)){e.err=`${R}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!be(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){e.err=`${R}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,X(e),e.data=[],!o){Vt(e);return}for(;;){for(let l=o;l>0;l-=1){if(pe(i)&&(l===3||l===4)?fe(e):ge(e),e.err.length)return;e.data.push(e.param),X(e),e.index=e.max||!xe(r.charCodeAt(e.index)))break}Vt(e)};class Rt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const j=e=>{if(typeof e!="string")return e.slice(0);const t=new Rt(e);for(X(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const a=[],c=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const t=j(e);return Q(t,it)},jt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const a=[],c=e.length;for(let l=1;l{const t=j(e);return Q(t,jt)},xt=(e,t,r,s,n,i,o,a,c,l)=>{let m=e,h=t,f=r,g=s,u=a,y=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let A=[],d,x,M,P,$;if(l)[x,M,P,$]=l;else{d=st(m,h,-b),m=d.x,h=d.y,d=st(u,y,-b),u=d.x,y=d.y;const w=(m-u)/2,I=(h-y)/2;let v=w*w/(f*f)+I*I/(g*g);v>1&&(v=Math.sqrt(v),f*=v,g*=v);const Bt=f*f,Ht=g*g,Ve=(i===o?-1:1)*Math.sqrt(Math.abs((Bt*Ht-Bt*I*I-Ht*w*w)/(Bt*I*I+Ht*w*w)));P=Ve*f*I/g+(m+u)/2,$=Ve*-g*w/f+(h+y)/2,x=Math.asin(((h-$)/g*10**9>>0)/10**9),M=Math.asin(((y-$)/g*10**9>>0)/10**9),x=mM&&(x-=Math.PI*2),!o&&M>x&&(M-=Math.PI*2)}let q=M-x;if(Math.abs(q)>p){const w=M,I=u,v=y;M=x+p*(o&&M>x?1:-1),u=P+f*Math.cos(M),y=$+g*Math.sin(M),A=xt(u,y,f,g,n,0,o,I,v,[M,w,P,$])}q=M-x;const T=Math.cos(x),N=Math.sin(x),Z=Math.cos(M),J=Math.sin(M),z=Math.tan(q/4),C=4/3*f*z,k=4/3*g*z,D=[m,h],E=[m+C*N,h-k*T],H=[u+C*J,y-k*Z],tt=[u,y];if(E[0]=2*D[0]-E[0],E[1]=2*D[1]-E[1],l)return[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);A=[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);const K=[];for(let w=0,I=A.length;w{const o=.3333333333333333,a=2/3;return[o*e+a*r,o*t+a*s,o*n+a*r,o*i+a*s,n,i]},Qt=(e,t,r,s)=>{const n=O([e,t],[r,s],.3333333333333333),i=O([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Ce=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(xt(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Me(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Qt(o,a,n,i)):r==="Z"?["C"].concat(Qt(o,a,c,l)):e},pt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-a,u=o*2-c;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},ot={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},bt=e=>{const t={...ot},r=j(e);return Q(r,(s,n,i,o)=>{t.x=i,t.y=o;const a=pt(s,t);let c=Ce(a,t);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return t.x1=+c[m-2],t.y1=+c[m-1],t.x2=+c[m-4]||t.x1,t.y2=+c[m-3]||t.y1,c})},Zt=(e,t)=>{const r=e.length;let{round:s}=_,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=j(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,b=0,A=0,d=0,x=0;Q(t,($,q,T,N)=>{[r]=$;const Z=r.toUpperCase(),z=Z!==r?it($,q,T,N):$.slice(0),C=Z==="V"?["L",T,z[1]]:Z==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(Z)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Lt(T,N,C[1],C[2]);else if(r==="A")[h,f,g,u]=ne(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const k=y*2-b,D=p*2-A;[h,f,g,u]=kt(T,N,k,D,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,g,u]=kt(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=y*2-d,x=p*2-x,[h,f,g,u]=It(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,g,u]=It(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,g,u]=Lt(T,N,s,n));a=o(h,a),c=o(f,c),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:C.slice(-2),[b,A]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[y,p]});const M=l-a,P=m-c;return{width:M,height:P,x:a,y:c,x2:l,y2:m,cx:a+M/2,cy:c+P/2,cz:Math.max(M,P)+Math.min(M,P)/2}},Y=e=>{const t=j(e);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Q(t,(f,g,u,y)=>{[c]=f;const p=c.toUpperCase(),A=p!==c?it(f,g,u,y):f.slice(0),d=p==="V"?["L",u,A[1]]:p==="H"?["L",A[1],y]:A;if([c]=d,"TQ".includes(p)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=nt(u,y,d[1],d[2]);else if(c==="A")h+=$t(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,M=s*2-i;h+=gt(u,y,x,M,d[1],d[2],d[3],d[4])}else c==="C"?h+=gt(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=yt(u,y,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=yt(u,y,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=nt(u,y,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},At=1e-5,ct=e=>{const t=j(e),r={...ot};return Q(t,(s,n,i,o)=>{r.x=i,r.y=o;const a=pt(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},at=(e,t)=>{const r=ct(e);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof t=="number";let h={x:c,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[b,A].concat(y.slice(1)),s?([,c,l]=y,h={x:c,y:l},f=0):i==="L"?(h=wt(n[0],n[1],n[2],n[3],t-u),f=nt(n[0],n[1],n[2],n[3])):i==="A"?(h=ee(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=$t(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=me(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=gt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=he(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=yt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[b,A,c,l],h={x:c,y:l},f=nt(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-At?{x:o,y:a}:g)},Dt=(e,t)=>{const r=j(e);let s=r.slice(0),n=Y(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:c,index:0,length:a,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=Y(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=Y(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},Mt=(e,t)=>{const r=j(e),s=ct(r),n=Y(s),i=x=>{const M=x.x-t.x,P=x.y-t.y;return M*M+P*P};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let x=0;x<=n;x+=o)a=at(s,x),l=i(a),l1e-6&&(u=m-o,f=at(s,u),p=i(f),y=m+o,g=at(s,y),b=i(g),u>=0&&pMt(e,t).closest,Ge=(e,t,r,s,n,i,o,a)=>3*((a-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+a*(n+e/3)-o*(i+t/3))/20,Se=e=>{let t=0,r=0,s=0;return bt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=Ge(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Ue=e=>Se(bt(e))>=0,_e=(e,t)=>Dt(e,t).segment,Je=(e,t)=>Mt(e,t).segment,Ct=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return W[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,Ne=e=>Ct(e)&&e.every(([t])=>t===t.toUpperCase()),we=e=>Ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Ke=e=>we(e)&&e.every(([t])=>"MC".includes(t)),We=(e,t)=>{const{distance:r}=Mt(e,t);return Math.abs(r)Ct(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),Le=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Rt(e);for(X(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Ye=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},tn=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ve=e=>{const t=Object.keys(lt),r=Te(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:e.type,i=lt[n],o={type:n};r?i.forEach(c=>{o[c]=e.getAttribute(c)}):Object.assign(o,e);let a=[];return n==="circle"?a=en(o):n==="ellipse"?a=nn(o):["polyline","polygon"].includes(n)?a=tn(o):n==="rect"?a=rn(o):n==="line"?a=Ye(o):["glyph","path"].includes(n)&&(a=j(r?e.getAttribute("d")||"":e.d||"")),Ct(a)&&a.length?a:!1},sn=(e,t,r)=>{const s=r||document,n=Object.keys(lt),i=Te(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:e.type,l=lt[c],m={type:c},h=_.round,f=ve(e),g=f&&f.length?Zt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||a.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),Le(g)?(a.setAttribute("d",g),t&&i&&(e.before(a,e),e.remove()),a):!1},$e=(e,t,r,s)=>{const[n]=e,{round:i}=_,o=i,a=t.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=a.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,o)===L(u,o))return["V",y];if(L(g,o)===L(y,o))return["H",u]}else if(n==="C"){const[b,A]=a;if(r.x1=b,r.y1=A,"CS".includes(s)&&(L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o)||L(c,o)===L(m*2-f,o)&&L(l,o)===L(h*2-g,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[b,A]=a;if(r.qx=b,r.qy=A,"QT".includes(s)&&L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o))return["T",a[2],a[3]]}return p},Pt=(e,t)=>{const r=e.slice(1).map(s=>L(s,t));return[e[0]].concat(r)},qe=(e,t)=>{const r=dt(e),s=typeof t=="number"&&t>=0?t:2,n={...ot},i=[];let o="M",a="Z";return Q(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=pt(c,n);let g=c;if([o]=c,i[l]=o,l){a=i[l-1];const y=$e(c,f,n,a),p=Pt(y,s),b=p.join(""),A=jt(y,l,m,h),d=Pt(A,s),x=d.join("");g=b.length{const t=dt(e),r=ct(t),s=t.length,n=t[s-1][0]==="Z",i=Q(t,(o,a)=>{const c=r[a],l=a&&t[a-1],m=l&&l[0],h=t[a+1],f=h&&h[0],[g]=o,[u,y]=r[a?a-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,y]:p=[g,c[1],c[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ze=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...ot};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?c.x:0,i+=g?c.y:0,o=n,a=i,r=[g?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=g?c.x:0):h==="V"?([,i]=l,i+=g?c.y:0):([n,i]=l.slice(-2),n+=g?c.x:0,i+=g?c.y:0),r.push(l)),c.x=n,c.y=i,t[s]=r}),t},ke=e=>{let t=new S;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:a}=e,{scale:c}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||a||c)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(t=a[0]?t.skewX(a[0]):t,t=a[1]?t.skewY(a[1]):t):typeof a=="number"&&!Number.isNaN(a)&&(t=t.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?t=t.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(t=t.scale(c)),t=t.translate(-s,-n)),t},on=(e,t)=>{let r=S.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ot=(e,t,r)=>{const[s,n,i]=r,[o,a,c]=on(e,[t[0],t[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},Ie=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=j(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:_.origin});const h=t.origin,f=ke(t);return f.isIdentity?l.slice(0):Q(l,(g,u,y,p)=>{[c]=g;const b=c.toUpperCase(),d=b!==c?it(g,u,y,p):g.slice(0);let x=b==="A"?["C"].concat(xt(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",y,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const M=c==="C"&&x.length>7,P=M?x.slice(0,7):x.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(x.slice(7))),x=P),c==="L")[n,i]=Ot(f,[x[1],x[2]],h),r!==n&&s!==i?x=["L",n,i]:s===i?x=["H",n]:r===n&&(x=["V",i]);else for(o=1,a=x.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},an=(e,t)=>{let{round:r}=_;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):Q(e,s=>Pt(s,r))},ln=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),a=O(s,n,r),c=O(n,i,r),l=O(i,o,r),m=O(a,c,r),h=O(c,l,r),f=O(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class mn{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=j(t);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return Pe(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return at(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=dt(t),this}toRelative(){const{segments:t}=this;return this.segments=Ae(t),this}toCurve(){const{segments:t}=this;return this.segments=bt(t),this}reverse(t){const{segments:r}=this,s=ze(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>t?c?St(a):a.slice(0):St(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:St(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=ct(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=qe(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(c=>c in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(t))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=Ie(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return Zt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return S}static get arcTools(){return Ze}static get bezierTools(){return De}static get cubicTools(){return Oe}static get lineTools(){return Qe}static get polygonTools(){return He}static get quadTools(){return Be}static get pathToAbsolute(){return dt}static get pathToRelative(){return Ae}static get pathToCurve(){return bt}static get pathToString(){return Zt}static get distanceSquareRoot(){return ut}static get midPoint(){return O}static get rotateVector(){return st}static get roundTo(){return L}static get parsePathString(){return j}static get finalizeSegment(){return Vt}static get invalidPathValue(){return G}static get isArcCommand(){return pe}static get isDigit(){return F}static get isDigitStart(){return xe}static get isMoveCommand(){return be}static get isPathCommand(){return de}static get isSpace(){return ye}static get paramsCount(){return W}static get paramsParser(){return ot}static get pathParser(){return Rt}static get scanFlag(){return fe}static get scanParam(){return ge}static get scanSegment(){return Et}static get skipSpaces(){return X}static get distanceEpsilon(){return At}static get getClosestPoint(){return Fe}static get getDrawDirection(){return Ue}static get getPathArea(){return Se}static get getPathBBox(){return Pe}static get getPointAtLength(){return at}static get getPropertiesAtLength(){return Dt}static get getPropertiesAtPoint(){return Mt}static get getSegmentAtLength(){return _e}static get getSegmentOfPoint(){return Je}static get getTotalLength(){return Y}static get isAbsoluteArray(){return Ne}static get isCurveArray(){return Ke}static get isNormalizedArray(){return we}static get isPathArray(){return Ct}static get isPointInStroke(){return We}static get isRelativeArray(){return Xe}static get isValidPath(){return Le}static get shapeParams(){return lt}static get shapeToPath(){return sn}static get shapeToPathArray(){return ve}static get absolutizeSegment(){return it}static get arcToCubic(){return xt}static get getSVGMatrix(){return ke}static get iterate(){return Q}static get lineToCubic(){return Qt}static get normalizePath(){return ct}static get normalizeSegment(){return pt}static get optimizePath(){return qe}static get projection2d(){return Ot}static get quadToCubic(){return Me}static get relativizeSegment(){return jt}static get reverseCurve(){return cn}static get reversePath(){return St}static get roundPath(){return an}static get roundSegment(){return Pt}static get segmentToCubic(){return Ce}static get shortenSegment(){return $e}static get splitCubic(){return ln}static get splitPath(){return ze}static get transformPath(){return Ie}}return mn}(); //# sourceMappingURL=svg-path-commander.js.map diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index 6739cf9..8852bd5 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file From 6596a253827c410d7ce5613465220da4a2d3a073 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 16:45:19 +0200 Subject: [PATCH 3/4] x --- dist/svg-path-commander.cjs.map | 2 +- dist/svg-path-commander.d.cts | 135 -------------------------------- dist/svg-path-commander.d.ts | 135 -------------------------------- dist/svg-path-commander.js.map | 2 +- dist/svg-path-commander.mjs.map | 2 +- docs/svg-path-commander.js.map | 2 +- 6 files changed, 4 insertions(+), 274 deletions(-) diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index 969f8d9..192d5da 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} +{"version":3,"sources":["../src/index.ts","../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index d0c5681..38c5a07 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -1,141 +1,6 @@ import CSSMatrix from '@thednp/dommatrix'; export { default as CSSMatrix } from '@thednp/dommatrix'; -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type PathBBox = { - width: number; - height: number; - x: number; - y: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; -type SegmentLimits = { - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type LengthFactory = { - length: number; - point: { - x: number; - y: number; - }; - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type Options = { - round: "off" | number; - origin: number[]; -}; -type PathTransform = { - s: PathSegment; - c: string; - x: number; - y: number; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; -type TransformProps = keyof TransformObject; -type TransformEntries = [ - TransformProps, - TransformObject[TransformProps] -][]; - type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index d0c5681..38c5a07 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -1,141 +1,6 @@ import CSSMatrix from '@thednp/dommatrix'; export { default as CSSMatrix } from '@thednp/dommatrix'; -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type PathBBox = { - width: number; - height: number; - x: number; - y: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; -type SegmentLimits = { - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type LengthFactory = { - length: number; - point: { - x: number; - y: number; - }; - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type Options = { - round: "off" | number; - origin: number[]; -}; -type PathTransform = { - s: PathSegment; - c: string; - x: number; - y: number; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; -type TransformProps = keyof TransformObject; -type TransformEntries = [ - TransformProps, - TransformObject[TransformProps] -][]; - type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index e6a57e8..836b407 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index b6a6c58..1b60c3e 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} +{"version":3,"sources":["../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index e6a57e8..836b407 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file From deb6bb035dd5dd662bdeecca32260c327b5ab93e Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 16:48:20 +0200 Subject: [PATCH 4/4] build --- dist/svg-path-commander.cjs.map | 2 +- dist/svg-path-commander.d.cts | 2 -- dist/svg-path-commander.d.ts | 2 -- dist/svg-path-commander.js.map | 2 +- dist/svg-path-commander.mjs.map | 2 +- docs/svg-path-commander.js.map | 2 +- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index fa099d5..192d5da 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} +{"version":3,"sources":["../src/index.ts","../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index daa57e1..38c5a07 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -801,8 +801,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -declare const error = "SVGPathCommander Error"; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index daa57e1..38c5a07 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -801,8 +801,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -declare const error = "SVGPathCommander Error"; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index 25dfda5..836b407 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"6CAAA,IAAIA,GAAI,OAAO,eACXC,GAAI,CAACC,EAAG,EAAGC,IAAM,KAAKD,EAAIF,GAAEE,EAAG,EAAG,CAAE,WAAY,GAAI,aAAc,GAAI,SAAU,GAAI,MAAOC,CAAC,CAAE,EAAID,EAAE,CAAC,EAAIC,EACzGC,EAAI,CAACF,EAAG,EAAGC,IAAMF,GAAEC,EAAG,OAAO,GAAK,SAAW,EAAI,GAAK,EAAGC,CAAC,EAC9D,MAAME,GAAI,CACR,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,KAAM,GACN,WAAY,EACd,EAAGC,GAAKJ,IAAOA,aAAa,cAAgBA,aAAa,cAAgB,MAAM,QAAQA,CAAC,GAAKA,EAAE,MAAO,GAAM,OAAO,GAAK,QAAQ,IAAM,CAAC,EAAG,EAAE,EAAE,KAAM,GAAMA,EAAE,SAAW,CAAC,EAAGK,GAAKL,GAAMA,aAAa,WAAaA,aAAaM,GAAK,OAAON,GAAK,UAAY,OAAO,KAAKG,EAAC,EAAE,MAAO,GAAMH,GAAK,KAAKA,CAAC,EAAGO,GAAKP,GAAM,CAC7S,MAAM,EAAI,IAAIM,EAAKL,EAAI,MAAM,KAAKD,CAAC,EACnC,GAAI,CAACI,GAAEH,CAAC,EACN,MAAM,UACJ,eAAeA,EAAE,KAAK,GAAG,CAAC,uCAC3B,EAEH,GAAIA,EAAE,SAAW,GAAI,CACnB,KAAM,CACJO,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACN,EAAQrB,EACJ,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMV,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAM,EAAG,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMV,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMV,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,IAAMI,CACvO,SAAarB,EAAE,SAAW,EAAG,CACzB,KAAM,CAACO,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAIZ,EAC3B,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,CACzH,CACE,OAAO,CACT,EAAGU,GAAKvB,GAAM,CACZ,GAAIK,GAAEL,CAAC,EACL,OAAOO,GAAE,CACPP,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACR,CAAK,EACH,MAAM,UACJ,eAAe,KAAK,UAAUA,CAAC,CAAC,4DACjC,CACH,EAAGwB,GAAKxB,GAAM,CACZ,GAAI,OAAOA,GAAK,SACd,MAAM,UAAU,eAAe,KAAK,UAAUA,CAAC,CAAC,oBAAoB,EACtE,MAAM,EAAI,OAAOA,CAAC,EAAE,QAAQ,MAAO,EAAE,EACrC,IAAIC,EAAI,IAAIK,EACZ,MAAME,EAAI,wCAAwCR,CAAC,IACnD,OAAO,EAAE,MAAM,GAAG,EAAE,OAAQS,GAAMA,CAAC,EAAE,QAASA,GAAM,CAClD,KAAM,CAACC,EAAGC,CAAC,EAAIF,EAAE,MAAM,GAAG,EAC1B,GAAI,CAACE,EAAG,MAAM,UAAUH,CAAC,EACzB,MAAMI,EAAID,EAAE,MAAM,GAAG,EAAE,IACpBO,GAAMA,EAAE,SAAS,KAAK,EAAI,WAAWA,CAAC,GAAK,IAAM,KAAK,IAAM,WAAWA,CAAC,CAC/E,EAAO,CAACL,EAAGC,EAAGC,EAAGC,CAAC,EAAIJ,EAAG,EAAI,CAACC,EAAGC,EAAGC,CAAC,EAAGE,EAAI,CAACJ,EAAGC,EAAGC,EAAGC,CAAC,EACnD,GAAIN,IAAM,eAAiBG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC9DjB,EAAE,IAAM,GAAKY,UACNH,EAAE,SAAS,QAAQ,GAAK,CAAC,EAAG,EAAE,EAAE,SAASE,EAAE,MAAM,GAAKA,EAAE,MAAOM,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAAG,CAChG,MAAMA,EAAIN,EAAE,IAAKO,GAAM,KAAK,IAAIA,CAAC,EAAI,KAAO,EAAIA,CAAC,EACjDlB,EAAIA,EAAE,SAASM,GAAEW,CAAC,CAAC,CACpB,SAAUR,IAAM,eAAiB,EAAE,MAAOQ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAChEjB,EAAIA,EAAE,UAAUY,EAAGC,EAAGC,CAAC,UAChBL,IAAM,aAAeG,GAAKE,IAAM,OACvCd,EAAIA,EAAE,UAAUY,EAAGC,GAAK,EAAG,CAAC,UACrBJ,IAAM,YAAcO,EAAE,MAAOC,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAKF,EAChEf,EAAIA,EAAE,gBAAgBY,EAAGC,EAAGC,EAAGC,CAAC,UACzBN,IAAM,UAAYG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC9DjB,EAAIA,EAAE,OAAO,EAAG,EAAGY,CAAC,UACbH,IAAM,WAAa,EAAE,MAAOQ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAK,EAAE,KAAMA,GAAMA,IAAM,CAAC,EACpFjB,EAAIA,EAAE,MAAMY,EAAGC,EAAGC,CAAC,UAInBL,IAAM,SAAW,CAAC,OAAO,MAAMG,CAAC,IAAMA,IAAM,GAAKC,IAAM,IAAMC,IAAM,OACnE,CACA,MAAMI,EAAI,OAAO,MAAM,CAACL,CAAC,EAAID,EAAIC,EACjCb,EAAIA,EAAE,MAAMY,EAAGM,EAAG,CAAC,CACpB,SAAUT,IAAM,SAAWG,GAAK,CAAC,OAAO,MAAMA,CAAC,GAAKC,IAAMC,IAAM,OAC/Dd,EAAIA,EAAE,KAAKY,EAAGC,GAAK,CAAC,UACb,CAAC,YAAa,SAAU,QAAS,MAAM,EAAE,KAC/CI,GAAMR,EAAE,SAASQ,CAAC,CACpB,GAAI,QAAQ,KAAKR,CAAC,GAAKG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC3D,GAAIR,IAAM,SAAWA,IAAM,QACzBT,EAAIA,EAAES,CAAC,EAAEG,CAAC,MACP,CACH,MAAMK,EAAIR,EAAE,QAAQ,QAAS,EAAE,EAAGS,EAAIT,EAAE,QAAQQ,EAAG,EAAE,EAAGE,EAAI,CAAC,IAAK,IAAK,GAAG,EAAE,QAAQD,CAAC,EAAGE,EAAIH,IAAM,QAAU,EAAI,EAAGI,EAAI,CACrHF,IAAM,EAAIP,EAAIQ,EACdD,IAAM,EAAIP,EAAIQ,EACdD,IAAM,EAAIP,EAAIQ,CACf,EACDpB,EAAIA,EAAEiB,CAAC,EAAE,GAAGI,CAAC,CACrB,KAEM,OAAM,UAAUd,CAAC,CACpB,CAAA,EAAGP,CACN,EAAGwB,GAAI,CAACzB,EAAG,IAAM,EAAI,CAACA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAI,CACpDA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACJ,EAAG0B,GAAI,CAAC1B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EACd,OAAOE,EAAE,IAAMR,EAAGQ,EAAE,EAAIR,EAAGQ,EAAE,IAAM,EAAGA,EAAE,EAAI,EAAGA,EAAE,IAAMP,EAAGO,CAC5D,EAAGmB,GAAI,CAAC3B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EAAKG,EAAI,KAAK,GAAK,IAAKC,EAAIV,EAAIS,EAAGE,EAAI,EAAIF,EAAGG,EAAIX,EAAIQ,EAAGI,EAAI,KAAK,IAAIH,CAAC,EAAGI,EAAI,CAAC,KAAK,IAAIJ,CAAC,EAAGK,EAAI,KAAK,IAAIJ,CAAC,EAAGK,EAAI,CAAC,KAAK,IAAIL,CAAC,EAAG,EAAI,KAAK,IAAIC,CAAC,EAAGK,EAAI,CAAC,KAAK,IAAIL,CAAC,EAAGM,EAAIH,EAAI,EAAGI,EAAI,CAACJ,EAAIE,EACpMT,EAAE,IAAMU,EAAGV,EAAE,EAAIU,EAAGV,EAAE,IAAMW,EAAGX,EAAE,EAAIW,EAAGX,EAAE,IAAMQ,EAChD,MAAMI,EAAIN,EAAIE,EAAI,EAAIH,EAAII,EAC1BT,EAAE,IAAMY,EAAGZ,EAAE,EAAIY,EACjB,MAAMC,EAAIR,EAAI,EAAIC,EAAIE,EAAIC,EAC1B,OAAOT,EAAE,IAAMa,EAAGb,EAAE,EAAIa,EAAGb,EAAE,IAAM,CAACM,EAAIC,EAAGP,EAAE,IAAMM,EAAIG,EAAIJ,EAAIG,EAAI,EAAGR,EAAE,IAAMM,EAAI,EAAID,EAAIG,EAAIC,EAAGT,EAAE,IAAMK,EAAIE,EAAGP,CAClH,EAAGoB,GAAI,CAAC5B,EAAG,EAAGC,EAAGO,IAAM,CACrB,MAAMC,EAAI,IAAIH,EAAKI,EAAI,KAAK,KAAKV,EAAIA,EAAI,EAAI,EAAIC,EAAIA,CAAC,EACtD,GAAIS,IAAM,EACR,OAAOD,EACT,MAAME,EAAIX,EAAIU,EAAGE,EAAI,EAAIF,EAAGG,EAAIZ,EAAIS,EAAGI,EAAIN,GAAK,KAAK,GAAK,KAAMO,EAAI,KAAK,IAAID,CAAC,EAAGE,EAAI,KAAK,IAAIF,CAAC,EAAG,EAAIC,EAAIA,EAAGE,EAAIN,EAAIA,EAAGO,EAAIN,EAAIA,EAAGO,EAAIN,EAAIA,EAAGO,EAAI,EAAI,GAAKF,EAAIC,GAAK,EACpKV,EAAE,IAAMW,EAAGX,EAAE,EAAIW,EACjB,MAAMC,EAAI,GAAKV,EAAIC,EAAI,EAAIC,EAAIE,EAAIC,GACnCP,EAAE,IAAMY,EAAGZ,EAAE,EAAIY,EAAGZ,EAAE,IAAM,GAAKE,EAAIE,EAAI,EAAID,EAAIG,EAAIC,GACrD,MAAMM,EAAI,GAAKV,EAAID,EAAI,EAAIE,EAAIE,EAAIC,GACnCP,EAAE,IAAMa,EAAGb,EAAE,EAAIa,EACjB,MAAMO,EAAI,EAAI,GAAKV,EAAIF,GAAK,EAC5B,OAAOR,EAAE,IAAMoB,EAAGpB,EAAE,EAAIoB,EAAGpB,EAAE,IAAM,GAAKG,EAAIC,EAAI,EAAIF,EAAII,EAAIC,GAAIP,EAAE,IAAM,GAAKI,EAAIF,EAAI,EAAIC,EAAIG,EAAIC,GAAIP,EAAE,IAAM,GAAKI,EAAID,EAAI,EAAID,EAAII,EAAIC,GAAIP,EAAE,IAAM,EAAI,GAAKQ,EAAIC,GAAK,EAAGT,CACzK,EAAGqB,GAAI,CAAC9B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EACd,OAAOE,EAAE,IAAMR,EAAGQ,EAAE,EAAIR,EAAGQ,EAAE,IAAM,EAAGA,EAAE,EAAI,EAAGA,EAAE,IAAMP,EAAGO,CAC5D,EAAGuB,GAAI,CAAC/B,EAAG,IAAM,CACf,MAAMC,EAAI,IAAIK,EACd,GAAIN,EAAG,CACL,MAAMQ,EAAIR,EAAI,KAAK,GAAK,IAAKS,EAAI,KAAK,IAAID,CAAC,EAC3CP,EAAE,IAAMQ,EAAGR,EAAE,EAAIQ,CACrB,CACE,GAAI,EAAG,CACL,MAAMD,EAAI,EAAI,KAAK,GAAK,IAAKC,EAAI,KAAK,IAAID,CAAC,EAC3CP,EAAE,IAAMQ,EAAGR,EAAE,EAAIQ,CACrB,CACE,OAAOR,CACT,EAAG+B,GAAKhC,GAAM+B,GAAE/B,EAAG,CAAC,EAAGiC,GAAKjC,GAAM+B,GAAE,EAAG/B,CAAC,EAAGkC,EAAI,CAAClC,EAAG,IAAM,CACvD,MAAMC,EAAI,EAAE,IAAMD,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKQ,EAAI,EAAE,IAAMR,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKS,EAAI,EAAE,IAAMT,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKU,EAAI,EAAE,IAAMV,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKW,EAAI,EAAE,IAAMX,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKY,EAAI,EAAE,IAAMZ,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKa,EAAI,EAAE,IAAMb,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKc,EAAI,EAAE,IAAMd,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKe,EAAI,EAAE,IAAMf,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKgB,EAAI,EAAE,IAAMhB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAK,EAAI,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKiB,EAAI,EAAE,IAAMjB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKkB,EAAI,EAAE,IAAMlB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKmB,EAAI,EAAE,IAAMnB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKoB,EAAI,EAAE,IAAMpB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKqB,EAAI,EAAE,IAAMrB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IACjjC,OAAOO,GAAE,CACPN,EACAO,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA,EACAC,EACAC,EACAC,EACAC,EACAC,CACJ,CAAG,CACH,EACA,MAAMf,CAAE,CAQN,YAAY,EAAG,CACb,OAAO,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,EAAI,KAAK,eAAe,CAAC,EAAI,IAChV,CAQE,IAAI,YAAa,CACf,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CACtS,CAOE,IAAI,MAAO,CACT,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CAClH,CAeE,eAAe,EAAG,CAChB,OAAO,OAAO,GAAK,UAAY,EAAE,QAAU,IAAM,OAASkB,GAAE,CAAC,EAAI,MAAM,QAAQ,CAAC,GAAK,aAAa,cAAgB,aAAa,aAAejB,GAAE,CAAC,EAAI,OAAO,GAAK,SAAWgB,GAAE,CAAC,EAAI,IACvL,CASE,eAAe,EAAG,CAChB,OAAO,aAAa,KAAKE,GAAE,KAAM,CAAC,CAAC,CACvC,CASE,eAAe,EAAG,CAChB,OAAO,aAAa,KAAKA,GAAE,KAAM,CAAC,CAAC,CACvC,CAUE,UAAW,CACT,KAAM,CAAE,KAAM,CAAG,EAAG,KAAMxB,EAAI,KAAK,eAAe,CAAC,EAAE,KAAK,IAAI,EAC9D,MAAO,GAAG,EAAI,SAAW,UAAU,IAAIA,CAAC,GAC5C,CAWE,QAAS,CACP,KAAM,CAAE,KAAM,EAAG,WAAYA,CAAG,EAAG,KACnC,MAAO,CAAE,GAAG,KAAM,KAAM,EAAG,WAAYA,CAAG,CAC9C,CASE,SAAS,EAAG,CACV,OAAOiC,EAAE,KAAM,CAAC,CACpB,CAYE,UAAU,EAAGjC,EAAGO,EAAG,CACjB,MAAMC,EAAI,EACV,IAAIC,EAAIT,EAAGU,EAAIH,EACf,OAAO,OAAOE,EAAI,MAAQA,EAAI,GAAI,OAAOC,EAAI,MAAQA,EAAI,GAAIuB,EAAE,KAAMR,GAAEjB,EAAGC,EAAGC,CAAC,CAAC,CACnF,CAYE,MAAM,EAAGV,EAAGO,EAAG,CACb,MAAMC,EAAI,EACV,IAAIC,EAAIT,EAAGU,EAAIH,EACf,OAAO,OAAOE,EAAI,MAAQA,EAAI,GAAI,OAAOC,EAAI,MAAQA,EAAI,GAAIuB,EAAE,KAAMJ,GAAErB,EAAGC,EAAGC,CAAC,CAAC,CACnF,CAaE,OAAO,EAAGV,EAAGO,EAAG,CACd,IAAIC,EAAI,EAAGC,EAAIT,GAAK,EAAGU,EAAIH,GAAK,EAChC,OAAO,OAAO,GAAK,UAAY,OAAOP,EAAI,KAAO,OAAOO,EAAI,MAAQG,EAAIF,EAAGA,EAAI,EAAGC,EAAI,GAAIwB,EAAE,KAAMP,GAAElB,EAAGC,EAAGC,CAAC,CAAC,CAChH,CAaE,gBAAgB,EAAGV,EAAGO,EAAGC,EAAG,CAC1B,GAAI,CAAC,EAAGR,EAAGO,EAAGC,CAAC,EAAE,KAAMC,GAAM,OAAO,MAAM,CAACA,CAAC,CAAC,EAC3C,MAAM,IAAI,UAAU,+BAA+B,EACrD,OAAOwB,EAAE,KAAMN,GAAE,EAAG3B,EAAGO,EAAGC,CAAC,CAAC,CAChC,CAQE,MAAM,EAAG,CACP,OAAOyB,EAAE,KAAMF,GAAE,CAAC,CAAC,CACvB,CAQE,MAAM,EAAG,CACP,OAAOE,EAAE,KAAMD,GAAE,CAAC,CAAC,CACvB,CASE,KAAK,EAAGhC,EAAG,CACT,OAAOiC,EAAE,KAAMH,GAAE,EAAG9B,CAAC,CAAC,CAC1B,CAYE,eAAe,EAAG,CAChB,MAAMA,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGO,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGC,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGC,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAC/R,OAAO,aAAa,SAAW,IAAI,SAAST,EAAGO,EAAGC,EAAGC,CAAC,EAAI,CACxD,EAAGT,EACH,EAAGO,EACH,EAAGC,EACH,EAAGC,CACJ,CACL,CACA,CACAR,EAAEI,EAAG,YAAaoB,EAAC,EAAGxB,EAAEI,EAAG,SAAUqB,EAAC,EAAGzB,EAAEI,EAAG,kBAAmBsB,EAAC,EAAG1B,EAAEI,EAAG,QAASwB,EAAC,EAAG5B,EAAEI,EAAG,QAAS0B,EAAC,EAAG9B,EAAEI,EAAG,QAAS2B,EAAC,EAAG/B,EAAEI,EAAG,OAAQyB,EAAC,EAAG7B,EAAEI,EAAG,WAAY4B,CAAC,EAAGhC,EAAEI,EAAG,YAAaC,EAAC,EAAGL,EAAEI,EAAG,aAAciB,EAAC,EAAGrB,EAAEI,EAAG,aAAckB,EAAC,EAAGtB,EAAEI,EAAG,UAAWmB,EAAC,EAAGvB,EAAEI,EAAG,oBAAqBF,EAAC,EAAGF,EAAEI,EAAG,qBAAsBD,EAAC,ECtanT,MAAM8B,EAAW,CAACxB,EAAeW,EAAec,IAA0B,CAClE,KAAA,CAACC,EAAIC,CAAE,EAAI3B,EACX,CAAC4B,EAAIC,CAAE,EAAIlB,EACV,MAAA,CAACe,GAAME,EAAKF,GAAMD,EAAGE,GAAME,EAAKF,GAAMF,CAAC,CAChD,ECLMK,GAAqB,CAAC9B,EAAeW,IAClC,KAAK,MACTX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,EAC7D,ECDIoB,GAAgB,CAACC,EAAYC,EAAYC,EAAYC,IAClDL,GAAmB,CAACE,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EAaxCC,GAAuB,CAC3BJ,EACAC,EACAC,EACAC,EACAE,IACG,CACH,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAGvB,GAAA,OAAOI,GAAa,SAAU,CAC1B,MAAAE,EAAST,GAAmB,CAACE,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EACpD,GAAIE,GAAY,EACdC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,UACdI,GAAYE,EACrBD,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,MAClB,CACL,KAAM,CAACrB,EAAGnB,CAAC,EAAI6B,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAGE,EAAWE,CAAM,EACrDD,EAAA,CAAE,EAAAxB,EAAG,EAAAnB,CAAE,CAAA,CACjB,CAEK,OAAA2C,CACT,EAYME,GAAc,CAACR,EAAYC,EAAYC,EAAYC,IAAe,CAChE,KAAA,CAAE,IAAAM,EAAK,IAAAC,CAAA,EAAQ,KAErB,MAAO,CAACD,EAAIT,EAAIE,CAAE,EAAGO,EAAIR,EAAIE,CAAE,EAAGO,EAAIV,EAAIE,CAAE,EAAGQ,EAAIT,EAAIE,CAAE,CAAC,CAM5D,EAEMQ,GAAY,CAChB,YAAAH,GACA,cAAAT,GACA,qBAAAK,EACF,ECjEMQ,GAAY,CAACC,EAAYC,EAAYC,IAAkB,CAC3D,MAAMC,EAAYD,EAAQ,EACpBE,EAAe,KAAK,IAAID,CAAS,EACjCE,EAAe,KAAK,IAAIF,CAAS,EACjCG,EAAQN,GAAM,EAAII,GAAgB,EAClCG,EAAQN,GAAM,EAAII,GAAgB,EAClCX,EAAS,KAAK,KAAKY,EAAQC,CAAK,EAAIL,EACnC,OAAA,KAAK,IAAIR,CAAM,CACxB,EAYMc,EAAW,CACfC,EACAC,EACAV,EACAC,EACAU,EACAT,IACG,CACG,KAAA,CAAE,IAAAU,EAAK,IAAAC,CAAA,EAAQ,KAGfC,EAAOD,EAAIF,CAAK,EAChBI,EAAOH,EAAID,CAAK,EAChB1C,EAAI+B,EAAKa,EAAIX,CAAK,EAClBpD,EAAImD,EAAKW,EAAIV,CAAK,EAEjB,MAAA,CAACO,EAAKK,EAAO7C,EAAI8C,EAAOjE,EAAG4D,EAAKK,EAAO9C,EAAI6C,EAAOhE,CAAC,CAC5D,EAQMkE,GAAe,CAACC,EAAWC,IAAc,CAC7C,KAAM,CAAE,EAAGC,EAAK,EAAGC,CAAQ,EAAAH,EACrB,CAAE,EAAGI,EAAK,EAAGC,CAAQ,EAAAJ,EACrBxE,EAAIyE,EAAME,EAAMD,EAAME,EACtBtE,EAAI,KAAK,MAAMmE,GAAO,EAAIC,GAAO,IAAMC,GAAO,EAAIC,GAAO,EAAE,EAEjE,OADaH,EAAMG,EAAMF,EAAMC,EAAM,EAAI,GAAK,GAChC,KAAK,KAAK3E,EAAIM,CAAC,CAC/B,EAiBMuE,GAAc,CAClBpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,IAAA+E,EAAK,IAAAjB,EAAK,IAAAC,EAAK,KAAAiB,EAAM,GAAAC,GAAO,KAChC,IAAA/B,EAAK6B,EAAIL,CAAE,EACXvB,EAAK4B,EAAIJ,CAAE,EAET,MAAAO,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KAGzB,GAAA5C,IAAOlB,GAAKmB,IAAOtC,EACd,MAAA,CACL,GAAAkD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,EAAAhC,EAAG,EAAAnB,CAAE,CACjB,EAGE,GAAAkD,IAAO,GAAKC,IAAO,EACd,MAAA,CACL,GAAAD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,GAAIhC,EAAIkB,GAAM,EAAG,GAAIrC,EAAIsC,GAAM,CAAE,CAC7C,EAGI,MAAA6C,GAAM9C,EAAKlB,GAAK,EAChBiE,GAAM9C,EAAKtC,GAAK,EAEhBqF,EAAmB,CACvB,EAAGtB,EAAImB,CAAO,EAAIC,EAAKrB,EAAIoB,CAAO,EAAIE,EACtC,EAAG,CAACtB,EAAIoB,CAAO,EAAIC,EAAKpB,EAAImB,CAAO,EAAIE,CACzC,EAEME,EAAaD,EAAiB,GAAK,EAAInC,GAAM,EACjDmC,EAAiB,GAAK,EAAIlC,GAAM,EAE9BmC,EAAa,IACfpC,GAAM8B,EAAKM,CAAU,EACrBnC,GAAM6B,EAAKM,CAAU,GAGvB,MAAMC,EAAmBrC,GAAM,EAAIC,GAAM,EACvCD,GAAM,EAAImC,EAAiB,GAAK,EAAIlC,GAAM,EAAIkC,EAAiB,GAAK,EAChEG,EAAmBtC,GAAM,EAAImC,EAAiB,GAAK,EACvDlC,GAAM,EAAIkC,EAAiB,GAAK,EAElC,IAAII,EAAYF,EAAmBC,EAEvBC,EAAAA,EAAY,EAAI,EAAIA,EAChC,MAAMC,GAASb,IAAQC,EAAK,EAAI,IAAME,EAAKS,CAAS,EAC9CE,EAAoB,CACxB,EAAGD,GAAUxC,EAAKmC,EAAiB,EAAKlC,GACxC,EAAGuC,GAAS,EAAEvC,EAAKkC,EAAiB,GAAKnC,EAC3C,EAEM0C,EAAS,CACb,EAAG7B,EAAImB,CAAO,EAAIS,EAAkB,EAAI7B,EAAIoB,CAAO,EAAIS,EAAkB,GACtEtD,EAAKlB,GAAK,EACb,EAAG2C,EAAIoB,CAAO,EAAIS,EAAkB,EAAI5B,EAAImB,CAAO,EAAIS,EAAkB,GACtErD,EAAKtC,GAAK,CACf,EAEM6F,EAAc,CAClB,GAAIR,EAAiB,EAAIM,EAAkB,GAAKzC,EAChD,GAAImC,EAAiB,EAAIM,EAAkB,GAAKxC,CAClD,EAEM2C,EAAa5B,GAAa,CAAE,EAAG,EAAG,EAAG,GAAK2B,CAAW,EAErDE,EAAY,CAChB,GAAI,CAACV,EAAiB,EAAIM,EAAkB,GAAKzC,EACjD,GAAI,CAACmC,EAAiB,EAAIM,EAAkB,GAAKxC,CACnD,EAEI,IAAA6C,EAAa9B,GAAa2B,EAAaE,CAAS,EAChD,CAACjB,GAAMkB,EAAa,EACtBA,GAAc,EAAIf,EACTH,GAAMkB,EAAa,IAC5BA,GAAc,EAAIf,GAEpBe,GAAc,EAAIf,EAElB,MAAMgB,EAAWH,EAAaE,EAUvB,MAAA,CACL,OAAAJ,EACA,WAAAE,EACA,SAAAG,EACA,GAAA/C,EACA,GAAAC,CACF,CACF,EAeM+C,GAAe,CACnB7D,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,GAAAkD,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,CAAa,EAAAxB,GACvCpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EACA,OAAOiD,GAAUC,EAAIC,EAAI8C,EAAWH,CAAU,CAChD,EAiBMK,GAAsB,CAC1B9D,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,EACA0C,IACG,CACH,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAC3B,KAAM,CAAE,OAAAsD,EAAQ,GAAA1C,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,GAAaxB,GAC/CpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EAGI,GAAA,OAAO0C,GAAa,SAAU,CAChC,MAAME,EAASK,GAAUC,EAAIC,EAAI8C,EAAWH,CAAU,EACtD,GAAIpD,GAAY,EACdC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,UACdI,GAAYE,EACbD,EAAA,CAAE,EAAAxB,EAAG,EAAAnB,CAAE,MACV,CAED,GAAAqC,IAAOlB,GAAKmB,IAAOtC,EACd,MAAA,CAAE,EAAAmB,EAAG,EAAAnB,CAAE,EAGZ,GAAAkD,IAAO,GAAKC,IAAO,EACrB,OAAOV,GAAqBJ,EAAIC,EAAInB,EAAGnB,EAAG0C,CAAQ,EAEpD,KAAM,CAAE,GAAAuC,EAAI,IAAAlB,EAAK,IAAAD,CAAQ,EAAA,KACnBkC,EAAaC,EAAWH,EAExBZ,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KACvBpB,EAAQiC,EAAaE,GAActD,EAAWE,GAC9CwD,EAAoBlD,EAAKa,EAAIF,CAAK,EAClCwC,EAAoBlD,EAAKW,EAAID,CAAK,EAEhClB,EAAA,CACN,EAAGoB,EAAImB,CAAO,EAAIkB,EAAoBtC,EAAIoB,CAAO,EAAImB,EACnDT,EAAO,EACT,EAAG9B,EAAIoB,CAAO,EAAIkB,EAAoBrC,EAAImB,CAAO,EAAImB,EACnDT,EAAO,CACX,CAAA,CACF,CAGK,OAAAjD,CACT,EAmBM2D,GAAa,CACjBjE,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,OAAA4F,EAAQ,GAAA1C,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,GAAaxB,GAC/CpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EACMuG,EAAaN,EAAWH,EACxB,CAAE,IAAAhD,EAAK,IAAAC,EAAK,IAAAyD,EAAK,MAAAC,EAAO,GAAAxB,GAAO,KAG/B,CAAEtB,EAAO,EAAGC,CAAO,EAAAgC,EAGnB/B,EAASe,EAAQK,EAAM,IACvByB,EAAUF,EAAI3C,CAAK,EAMnBT,EAAQqD,EAAM,CAACtD,EAAKuD,EAASxD,CAAE,EAC/ByD,EAASvD,EACTwD,EAASxD,EAAQ6B,EACjB4B,EAASJ,EAAMtD,EAAID,EAAKwD,CAAO,EAC/BI,EAASD,EAAS5B,EAClB8B,EAAS,CAAC5F,CAAC,EACX6F,EAAS,CAAChH,CAAC,EAGb,IAAAiH,EAAOnE,EAAIT,EAAIlB,CAAC,EAChB+F,EAAOnE,EAAIV,EAAIlB,CAAC,EAChBgG,EAAOrE,EAAIR,EAAItC,CAAC,EAChBoH,EAAOrE,EAAIT,EAAItC,CAAC,EAGd,MAAAqH,GAAkBpB,EAAWM,EAAa,KAC1Ce,EAAM5D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOwD,EAAe,EAGrDE,EAAiBtB,EAAWM,EAAa,OACzCiB,EAAM9D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO0D,CAAc,EAU1D,GAAID,EAAI,CAAC,EAAIJ,GAAQM,EAAI,CAAC,EAAIN,EAAM,CAElC,MAAMO,EAAK/D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO8C,CAAM,EAC1CI,EAAA,KAAKU,EAAG,CAAC,CAAC,EACVT,EAAA,KAAKS,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIH,EAAI,CAAC,EAAIL,GAAQO,EAAI,CAAC,EAAIP,EAAM,CAElC,MAAMS,EAAKhE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO+C,CAAM,EAC1CG,EAAA,KAAKW,EAAG,CAAC,CAAC,EACVV,EAAA,KAAKU,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIJ,EAAI,CAAC,EAAIH,GAAQK,EAAI,CAAC,EAAIL,EAAM,CAElC,MAAMQ,EAAKjE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOiD,CAAM,EAC1CC,EAAA,KAAKY,EAAG,CAAC,CAAC,EACVX,EAAA,KAAKW,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIL,EAAI,CAAC,EAAIF,GAAQI,EAAI,CAAC,EAAIJ,EAAM,CAElC,MAAMQ,EAAKlE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOgD,CAAM,EAC1CE,EAAA,KAAKa,EAAG,CAAC,CAAC,EACVZ,EAAA,KAAKY,EAAG,CAAC,CAAC,CAAA,CAGnB,OAAAX,EAAOnE,EAAI,MAAM,CAAA,EAAIiE,CAAM,EAC3BI,EAAOrE,EAAI,MAAM,CAAA,EAAIkE,CAAM,EAC3BE,EAAOnE,EAAI,MAAM,CAAA,EAAIgE,CAAM,EAC3BK,EAAOrE,EAAI,MAAM,CAAA,EAAIiE,CAAM,EAEpB,CAACC,EAAME,EAAMD,EAAME,CAAI,CAChC,EAEMS,GAAW,CACf,aAAA3D,GACA,UAAAjB,GACA,SAAAS,EACA,WAAA4C,GACA,aAAAJ,GACA,YAAAzB,GACA,oBAAA0B,EACF,ECpaM2B,GAAU,CACd,oBACA,mBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,kBACA,iBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,iBACF,EAEMC,GAAU,CACd,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,oBACA,oBACA,kBACA,iBACF,EAMMC,GAAgBC,GAAqC,CACzD,MAAMC,EAAU,CAAC,EACjB,QAAStI,EAAIqI,EAAQpH,EAAIjB,EAAE,OAAQa,EAAII,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAGJ,GAAK,EAAG,CACnE,MAAM0H,EAAO,CAAC,EACd,QAASC,EAAI,EAAGA,EAAI3H,EAAG2H,GAAK,EAC1BD,EAAK,KAAK,CACR,EAAG1H,GAAKb,EAAEwI,EAAI,CAAC,EAAE,EAAIxI,EAAEwI,CAAC,EAAE,GAC1B,EAAG3H,GAAKb,EAAEwI,EAAI,CAAC,EAAE,EAAIxI,EAAEwI,CAAC,EAAE,GAC1B,EAAG,CAAA,CACJ,EAEHF,EAAQ,KAAKC,CAAI,EACbvI,EAAAuI,CAAA,CAEC,OAAAD,CACT,EAMMG,GAAgB,CACpBJ,EACA,IACG,CAGH,GAAI,IAAM,EACD,OAAAA,EAAA,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAGX,MAAAK,EAAQL,EAAO,OAAS,EAG9B,GAAI,IAAM,EACD,OAAAA,EAAAK,CAAK,EAAE,EAAI,EACXL,EAAOK,CAAK,EAGrB,MAAMC,EAAK,EAAI,EACf,IAAI3I,EAAIqI,EASR,GAAIK,IAAU,EACL,OAAAL,EAAA,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAKjB,GAAIK,IAAU,EACL,MAAA,CACL,EAAGC,EAAK3I,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAC1B,EAAG2I,EAAK3I,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAC1B,CACF,EAIF,MAAM4I,EAAMD,EAAKA,EACXE,EAAK,EAAI,EACf,IAAI,EAAI,EACJzH,EAAI,EACJP,EAAI,EACJI,EAAI,EAER,OAAIyH,IAAU,GACZ1I,EAAI,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAE,EAAG,EAAG,EAAG,EAAmB,EACjD,EAAA4I,EACJxH,EAAIuH,EAAK,EAAI,EACT9H,EAAAgI,GACKH,IAAU,IACnB,EAAIE,EAAMD,EACVvH,EAAIwH,EAAM,EAAI,EACd/H,EAAI8H,EAAKE,EAAK,EACd5H,EAAI,EAAI4H,GAEH,CACL,EAAG,EAAI7I,EAAE,CAAC,EAAE,EAAIoB,EAAIpB,EAAE,CAAC,EAAE,EAAIa,EAAIb,EAAE,CAAC,EAAE,EAAIiB,EAAIjB,EAAE,CAAC,EAAE,EACnD,EAAG,EAAIA,EAAE,CAAC,EAAE,EAAIoB,EAAIpB,EAAE,CAAC,EAAE,EAAIa,EAAIb,EAAE,CAAC,EAAE,EAAIiB,EAAIjB,EAAE,CAAC,EAAE,EACnD,CACF,CACF,EAEM8I,GAAkB,CAACC,EAA8B,IAAc,CAC7D,MAAA9H,EAAI8H,EAAa,CAAC,EAClBrI,EAAIO,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAEvB,OAAA,KAAK,KAAKP,CAAC,CACpB,EAEMsI,GAAgBD,GAAiC,CAErD,MAAME,EAAMf,GAAQ,OAEpB,IAAIgB,EAAM,EAEV,QAAS3I,EAAI,EAAG2B,EAAG3B,EAAI0I,EAAK1I,IACtB2B,EAAA,GAAIgG,GAAQ3H,CAAC,EAAI,GACrB2I,GAAOf,GAAQ5H,CAAC,EAAIuI,GAAgBC,EAAc7G,CAAC,EAErD,MAAO,IAAIgH,CACb,EAMMC,GAAmBC,GAA8C,CACrE,MAAMf,EAAS,CAAC,EACP,QAAAgB,EAAM,EAAGJ,EAAMG,EAAM,OAAQE,EAAO,EAAGD,EAAMJ,EAAKI,GAAOC,EAChEjB,EAAO,KAAK,CACV,EAAGe,EAAMC,CAAG,EACZ,EAAGD,EAAMC,EAAM,CAAC,CAAA,CACjB,EAEG,MAAAf,EAAUF,GAAaC,CAAM,EAC5B,OAAAW,GAAc9G,GACZuG,GAAcH,EAAQ,CAAC,EAAGpG,CAAC,CACnC,CACH,EAGMqH,GAAyB,KAOzBC,GAAU,CAAC,CAAChF,EAAIiF,EAAIC,CAAE,IAAgC,CAC1D,MAAMxG,EAAM,KAAK,IAAIsB,EAAIkF,CAAE,EACrBvG,EAAM,KAAK,IAAIqB,EAAIkF,CAAE,EAG3B,GAAID,GAAMjF,EAAKkF,GAAMD,EAAKC,GAAMD,EAEvB,MAAA,CAACvG,EAAKC,CAAG,EAIlB,MAAMjD,GAAKsE,EAAKkF,EAAKD,EAAKA,IAAOjF,EAAK,EAAIiF,EAAKC,GACvC,OAAAxJ,EAAIgD,EAAM,CAAChD,EAAGiD,CAAG,EAAI,CAACD,EAAKhD,CAAC,CACtC,EAOMyJ,GAAU,CAAC,CAACnF,EAAIoF,EAAKC,EAAKH,CAAE,IAAwC,CACxE,MAAMI,EAAItF,EAAK,EAAIoF,EAAM,EAAIC,EAAMH,EAInC,GAAI,KAAK,IAAII,CAAC,EAAIP,GACZ,OAAA/E,IAAOkF,GAAMlF,IAAOoF,EAEf,CAACpF,EAAIkF,CAAE,EAGTF,GAAQ,CAAChF,EAAI,IAAOA,EAAK,IAAMoF,EAAKpF,EAAK,EAAIoF,EAAM,EAAIC,CAAG,CAAC,EAIpE,MAAMnI,EAAI,CAAC8C,EAAKqF,EAAMrF,EAAKkF,EAAKE,EAAMC,EAAMD,EAAMF,EAAKE,EAAMA,EAAMC,EAAMA,EAGzE,GAAInI,GAAK,EACA,MAAA,CAAC,KAAK,IAAI8C,EAAIkF,CAAE,EAAG,KAAK,IAAIlF,EAAIkF,CAAE,CAAC,EAEtC,MAAAK,EAAI,KAAK,KAAKrI,CAAC,EAGrB,IAAIwB,EAAM,KAAK,IAAIsB,EAAIkF,CAAE,EACrBvG,EAAM,KAAK,IAAIqB,EAAIkF,CAAE,EAEnB,MAAAM,EAAIxF,EAAK,EAAIoF,EAAMC,EAEzB,QAAS/H,GAAKkI,EAAID,GAAKD,EAAGvJ,EAAI,EAAGA,GAAK,EAAGuB,GAAKkI,EAAID,GAAKD,EAAGvJ,IAEpD,GAAAuB,EAAI,GAAKA,EAAI,EAAG,CAEZ,MAAAmI,EAAIzF,GAAM,EAAI1C,IAAM,EAAIA,IAAM,EAAIA,GACtC8H,EAAM,GAAK,EAAI9H,IAAM,EAAIA,GAAKA,EAAI+H,EAAM,GAAK,EAAI/H,GAAKA,EAAIA,EAC1D4H,EAAK5H,EAAIA,EAAIA,EACXmI,EAAI/G,IACAA,EAAA+G,GAEJA,EAAI9G,IACAA,EAAA8G,EACR,CAIG,MAAA,CAAC/G,EAAKC,CAAG,CAClB,EACM+G,GAAc,CAClB,aAAAlB,GACA,gBAAAF,GACA,uBAAAS,GACA,cAAAd,GACA,QAAAN,GACA,aAAAC,GACA,gBAAAe,GACA,QAAAQ,GACA,QAAAH,GACA,QAAAtB,EACF,ECjRMiC,GAA+B,CACnC,CAAC1H,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,EACnCV,IACG,CACH,MAAMsI,EAAK,EAAItI,EACR,MAAA,CACL,EAAGsI,GAAM,EAAI/H,EAAK,EAAI+H,GAAM,EAAItI,EAAIkI,EAAM,EAAII,EAAKtI,GAAK,EAAIoI,EAC1DpI,GAAK,EAAIS,EACX,EAAG6H,GAAM,EAAI9H,EAAK,EAAI8H,GAAM,EAAItI,EAAImI,EAAM,EAAIG,EAAKtI,GAAK,EAAIqI,EAC1DrI,GAAK,EAAIU,CACb,CACF,EAeM6H,GAAiB,CACrBhI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IAEOuG,GAAgB,CAAC1G,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,CAAC,EAiBvD8H,GAAwB,CAC5BjI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,EACAE,IACG,CACG,MAAA6H,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAE3B,GAAIiI,EAAkB,CACd,MAAAC,EAAgBzB,GAAgB,CAAC1G,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,CAAC,EACtEE,GAAY,IAELA,GAAY8H,EACrB7H,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,EAEfG,EAAAoH,GACN,CAAC1H,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,EACnCE,EAAW8H,CACb,EACF,CAEK,OAAA7H,CACT,EAgBM8H,GAAe,CACnBpI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IACG,CACH,MAAMkI,EAAWnB,GAAQ,CAAClH,EAAI2H,EAAKE,EAAK3H,CAAE,CAAC,EACrCoI,EAAWpB,GAAQ,CAACjH,EAAI2H,EAAKE,EAAK3H,CAAE,CAAC,EAE3C,MAAO,CAACkI,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,EAEMC,GAAa,CACjB,aAAAH,GACA,eAAAJ,GACA,sBAAAC,GACA,6BAAAP,EACF,EC1HMc,GAA8B,CAClC,CAACxI,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,EACvBV,IACG,CACH,MAAMsI,EAAK,EAAItI,EACR,MAAA,CACL,EAAGsI,GAAM,EAAI/H,EAAK,EAAI+H,EAAKtI,EAAI6B,EAAK7B,GAAK,EAAIS,EAC7C,EAAG6H,GAAM,EAAI9H,EAAK,EAAI8H,EAAKtI,EAAI8B,EAAK9B,GAAK,EAAIU,CAC/C,CACF,EAaMsI,GAAgB,CACpBzI,EACAC,EACAqB,EACAC,EACArB,EACAC,IAEOuG,GAAgB,CAAC1G,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,CAAC,EAe3CuI,GAAuB,CAC3B1I,EACAC,EACAqB,EACAC,EACArB,EACAC,EACAE,IACG,CACG,MAAA6H,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAG3B,GAAIiI,EAAkB,CACd,MAAAC,EAAgBzB,GAAgB,CAAC1G,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,CAAC,EAC1DE,GAAY,IAELA,GAAY8H,EACrB7H,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,EAEfG,EAAAkI,GACN,CAACxI,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,EACvBE,EAAW8H,CACb,EACF,CAEK,OAAA7H,CACT,EAcMqI,GAAc,CAClB3I,EACAC,EACAqB,EACAC,EACArB,EACAC,IACG,CACH,MAAMkI,EAAWtB,GAAQ,CAAC/G,EAAIsB,EAAIpB,CAAE,CAAC,EAC/BoI,EAAWvB,GAAQ,CAAC9G,EAAIsB,EAAIpB,CAAE,CAAC,EACrC,MAAO,CAACkI,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,EACMM,GAAY,CAChB,qBAAAF,GACA,4BAAAF,GACA,YAAAG,GACA,cAAAF,EACF,EChFMI,GAAe,CACnB,YAnCmBC,GAA0B,CAC7C,MAAMjL,EAAIiL,EAAQ,OAClB,IAAIhL,EAAI,GACJE,EACAW,EAAImK,EAAQjL,EAAI,CAAC,EACjBkL,EAAO,EAGJ,KAAA,EAAEjL,EAAID,GACPG,EAAAW,EACJA,EAAImK,EAAQhL,CAAC,EACLiL,GAAA/K,EAAE,CAAC,EAAIW,EAAE,CAAC,EAAIX,EAAE,CAAC,EAAIW,EAAE,CAAC,EAGlC,OAAOoK,EAAO,CAChB,EAqBE,cAVqBD,GACdA,EAAQ,OAAO,CAACvI,EAAQD,EAAOxC,IAChCA,EACKyC,EAAST,GAAmBgJ,EAAQhL,EAAI,CAAC,EAAGwC,CAAK,EAEnD,EACN,CAAC,CAKN,ECxCM0I,GAAe,CACnBlK,EACAnB,EACAsL,IAC6B,CACvB,KAAA,CAAE,IAAAxH,EAAK,IAAAC,CAAA,EAAQ,KACf9C,EAAIE,EAAI4C,EAAIuH,CAAG,EAAItL,EAAI8D,EAAIwH,CAAG,EAC9BlK,EAAID,EAAI2C,EAAIwH,CAAG,EAAItL,EAAI+D,EAAIuH,CAAG,EACpC,MAAO,CAAE,EAAGrK,EAAG,EAAGG,CAAE,CACtB,EClBMmK,EAAU,CAACrL,EAAWsL,IAAkB,CAC5C,MAAMC,EAAMD,GAAS,EAAI,IAAMA,EAAQ,EAEhC,OAAAA,EAAQ,EAAI,KAAK,MAAMtL,EAAIuL,CAAG,EAAIA,EAAM,KAAK,MAAMvL,CAAC,CAC7D,ECDMwL,EAA0B,CAC9B,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,MAAO,CACT,ECLMC,EAAc,CAClB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACL,ECJMC,GAAmBC,GAAqB,CAC5C,IAAIC,EAAcD,EAAK,UAAUA,EAAK,YAAY,EAC9CE,EAAkBD,EAAY,YAAY,EACxC,KAAA,CAAE,KAAAE,GAASH,EAEjB,KAAOG,EAAK,QAAUL,EAAYI,CAAe,IAG3CA,IAAoB,KAAOC,EAAK,OAAS,GAC3CH,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAG,CAAC,CAAA,CAEpB,EACkBD,EAAA,IACJD,EAAAA,IAAgB,IAAM,IAAM,KAE1CD,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAGL,EAAYI,CAAe,CAAC,CAAA,CAE/C,EAGE,EAACJ,EAAYI,CAAe,IAA5B,CAIR,ECrCME,EAAQ,yBCSRC,GAAYL,GAAqB,CAC/B,KAAA,CAAE,MAAAM,EAAO,UAAAC,CAAA,EAAcP,EACvBQ,EAAOD,EAAU,WAAWD,CAAK,EAEvC,GAAIE,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGF,GAAIQ,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGGA,EAAA,IAAM,GAAGI,CAAK,uBACjBG,EAAUD,CAAK,CACjB,gCAAgCA,CAAK,EACvC,ECpBMG,EAAWD,GACRA,GAAQ,IAAMA,GAAQ,GCTzBE,EAAmB,qBCWnBC,GAAaX,GAAqB,CACtC,KAAM,CAAE,IAAA9I,EAAK,UAAAqJ,EAAW,MAAOK,CAAU,EAAAZ,EACzC,IAAIM,EAAQM,EACRC,EAAY,GACZC,EAAa,GACbC,EAAa,GACbC,EAAS,GACTC,EAEJ,GAAIX,GAASpJ,EAAK,CAChB8I,EAAK,IACH,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,iCACjD,MAAA,CAYF,GAVKW,EAAAV,EAAU,WAAWD,CAAK,GAE3BW,IAAO,IAAgBA,IAAO,MACvBX,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,GAK7B,CAACG,EAAQQ,CAAE,GAAKA,IAAO,GAAc,CAElCjB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,oBACA,MAAA,CAGF,GAAIW,IAAO,GAAc,CAMnB,GALJJ,EAAYI,IAAO,GACVX,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,EAE3BO,GAAaP,EAAQpJ,GAEnB+J,GAAMR,EAAQQ,CAAE,EAAG,CAGhBjB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaE,CAAK,MACxDL,EAAUK,CAAK,CACjB,mBACA,MAAA,CAIJ,KAAON,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,EACIQ,EAAA,GAGVG,EAAAV,EAAU,WAAWD,CAAK,CAAA,CAGjC,GAAIW,IAAO,GAAc,CAGvB,IAFSD,EAAA,GACAV,GAAA,EACFG,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC/BA,GAAA,EACIS,EAAA,GAGVE,EAAAV,EAAU,WAAWD,CAAK,CAAA,CAG7B,GAAAW,IAAO,KAAgBA,IAAO,GAAc,CAC9C,GAAID,GAAU,CAACF,GAAc,CAACC,EAAY,CACnCf,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,2BACA,MAAA,CAUF,GAPSA,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,GAE3BW,IAAO,IAAgBA,IAAO,MACvBX,GAAA,GAEPA,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,EACpD,KAAOA,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,MAEN,CACAN,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,6BACA,MAAA,CACF,CAGFN,EAAK,MAAQM,EACbN,EAAK,MAAQ,CAACA,EAAK,UAAU,MAAMY,EAAON,CAAK,CACjD,ECpGMY,GAAWD,GACG,CAEhB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MAEA,GACA,GACA,KACA,KAEA,GACA,EACA,GACA,GACA,GACF,EAEiB,SAASA,CAAE,EChCxBE,EAAcnB,GAAqB,CACjC,KAAA,CAAE,UAAAO,EAAW,IAAArJ,CAAA,EAAQ8I,EACpB,KAAAA,EAAK,MAAQ9I,GAAOgK,GAAQX,EAAU,WAAWP,EAAK,KAAK,CAAC,GACjEA,EAAK,OAAS,CAElB,ECPMoB,GAAiBZ,GAA4C,CAEjE,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IAEI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,EChBMa,GACJb,GAEOC,EAAQD,CAAI,GAAgBA,IAAS,IAC1CA,IAAS,IAAgBA,IAAS,GCRhCc,GAAgBd,IAEZA,EAAO,MAAU,GCFrBe,GAAiBf,GAAsC,CAE3D,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,IACI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,ECMMgB,GAAexB,GAAqB,OACxC,KAAM,CAAE,IAAA9I,EAAK,UAAAqJ,EAAW,MAAAD,EAAO,SAAAmB,CAAa,EAAAzB,EACtC0B,EAAUnB,EAAU,WAAWD,CAAK,EACpCqB,EACJC,EAAYrB,EAAUD,CAAK,EAAE,aAAgC,EAK3D,GAHJN,EAAK,aAAeM,EAGhB,CAACc,GAAcM,CAAO,EAAG,CACtB1B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,oCAAoCA,CAAK,GACzC,MAAA,CAIF,MAAMuB,EAAcJ,EAASA,EAAS,OAAS,CAAC,EAE9C,GAAA,CAACF,GAAcG,CAAO,KAAKI,EAAAD,GAAA,YAAAA,EAAc,KAAd,YAAAC,EAAkB,uBAAwB,IACrE,CACK9B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,2CAA2CA,CAAK,GAChD,MAAA,CAQF,GALAN,EAAK,OAAS,EACdmB,EAAWnB,CAAI,EAEfA,EAAK,KAAO,CAAC,EAET,CAAC2B,EAAW,CAEd5B,GAAgBC,CAAI,EACpB,MAAA,CAGO,OAAA,CACP,QAAS1L,EAAIqN,EAAWrN,EAAI,EAAGA,GAAK,EAAG,CAIjC,GAHAgN,GAAaI,CAAO,IAAMpN,IAAM,GAAKA,IAAM,MAAa0L,CAAI,KACjDA,CAAI,EAEfA,EAAK,IAAI,OACX,OAEGA,EAAA,KAAK,KAAKA,EAAK,KAAK,EAEzBmB,EAAWnB,CAAI,EAIbA,EAAK,MAAQ9I,GAAOqJ,EAAU,WAAWP,EAAK,KAAK,IAAM,KAEzDA,EAAK,OAAS,EACdmB,EAAWnB,CAAI,EACjB,CAQF,GALIA,EAAK,OAASA,EAAK,KAKnB,CAACqB,GAAad,EAAU,WAAWP,EAAK,KAAK,CAAC,EAChD,KACF,CAGFD,GAAgBC,CAAI,CACtB,ECnFA,MAAqB+B,EAAW,CAU9B,YAAYC,EAAoB,CAC9B,KAAK,SAAW,CAAC,EACjB,KAAK,UAAYA,EACjB,KAAK,IAAMA,EAAW,OACtB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,aAAe,EACpB,KAAK,KAAO,CAAC,EACb,KAAK,IAAM,EAAA,CAEf,CChBA,MAAMC,EAAwCC,GAA0B,CAClE,GAAA,OAAOA,GAAc,SAChB,OAAAA,EAAU,MAAM,CAAC,EAGpB,MAAAlC,EAAO,IAAI+B,GAAWG,CAAS,EAIrC,IAFAf,EAAWnB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCwB,GAAYxB,CAAI,EAKd,GAAA,CAACA,EAAK,IAAI,OACRA,EAAK,SAAS,SAMhBA,EAAK,SAAS,CAAC,EAAE,CAAC,EAAI,SAGlB,OAAA,UAAUA,EAAK,GAAG,EAG1B,OAAOA,EAAK,QACd,ECjBMmC,GAAoB,CACxBC,EACA9B,EACA+B,EACAC,IACG,CACG,KAAA,CAACrC,CAAW,EAAImC,EAChBG,EAAatC,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKiC,IAAetC,EAGI,OAAAmC,EAEtC,GAAIG,IAAe,IACV,MAAA,CACLA,EACAH,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWE,IAAe,IACjB,MAAA,CACLA,EACCH,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAME,EAAY,CAAC,EACbC,EAASL,EAAQ,OACvB,QAAS7F,EAAI,EAAGA,EAAIkG,EAAQlG,GAAK,EAC/BiG,EAAU,KAAMJ,EAAQ7F,CAAC,GAAgBA,EAAI,EAAI8F,EAAQC,EAAM,EAGjE,MAAO,CAACC,CAAwC,EAAE,OAAOC,CAAS,CAAA,CAOtE,ECjEME,EAAU,CACd1C,EACA2C,IACG,CACH,IAAIC,EAAU5C,EAAK,OACfoC,EACAnC,EAAc,IACdsC,EAAa,IACbM,EAAa,GACbvN,EAAI,EACJnB,EAAI,EACJ2O,EAAK,EACLC,EAAK,EACLC,EAAS,EAEb,QAAS1O,EAAI,EAAGA,EAAIsO,EAAStO,GAAK,EAAG,CACnC8N,EAAUpC,EAAK1L,CAAC,EAChB,CAAC2L,CAAW,EAAImC,EAChBY,EAASZ,EAAQ,OACjBG,EAAatC,EAAY,YAAY,EACrC4C,EAAaN,IAAetC,EAE5B,MAAMgD,EAAiBN,EAASP,EAAS9N,EAAGgB,EAAGnB,CAAC,EAGhD,GAAI8O,IAAmB,GACrB,MAIEV,IAAe,KACbjN,EAAAwN,EACA3O,EAAA4O,GACKR,IAAe,IACxBjN,EAAK8M,EAAQ,CAAC,GAAgBS,EAAavN,EAAI,GACtCiN,IAAe,IACxBpO,EAAKiO,EAAQ,CAAC,GAAgBS,EAAa1O,EAAI,IAE/CmB,EAAK8M,EAAQY,EAAS,CAAC,GAAgBH,EAAavN,EAAI,GACxDnB,EAAKiO,EAAQY,EAAS,CAAC,GAAgBH,EAAa1O,EAAI,GAEpDoO,IAAe,MACZO,EAAAxN,EACAyN,EAAA5O,IAIL8O,IACFjD,EAAK1L,CAAC,EAAI2O,EACNA,EAAe,CAAC,IAAM,MACxBL,EAAU5C,EAAK,QAEnB,CAEK,OAAAA,CACT,ECpDMkD,GAAkBhB,GAAkC,CAClD,MAAAlC,EAAOiC,EAAgBC,CAAS,EAE/B,OAAAQ,EAAuB1C,EAAMmC,EAAiB,CACvD,ECQMgB,GAAoB,CACxBf,EACA9B,EACA+B,EACAC,IACG,CACG,KAAA,CAACrC,CAAW,EAAImC,EAChBgB,EAAanD,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKL,IAAgBmD,EAGG,OAAAhB,EAEtC,GAAIgB,IAAe,IACV,MAAA,CACLA,EACAhB,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWc,IAAe,IACxB,MAAO,CAACA,EAAahB,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWc,IAAe,IACxB,MAAO,CAACA,EAAahB,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWe,IAAe,IACjB,MAAA,CACLA,EACChB,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAMe,EAAY,CAAC,EACbZ,EAASL,EAAQ,OACvB,QAAS7F,EAAI,EAAGA,EAAIkG,EAAQlG,GAAK,EAC/B8G,EAAU,KAAMjB,EAAQ7F,CAAC,GAAgBA,EAAI,EAAI8F,EAAQC,EAAM,EAGjE,MAAO,CAACc,CAAsC,EAAE,OAAOC,CAAS,CAAA,CAMpE,EC7DMC,GAAkBpB,GAAiD,CACjE,MAAAlC,EAAOiC,EAAgBC,CAAS,EAE/B,OAAAQ,EAAuB1C,EAAMmD,EAAiB,CACvD,ECIMI,GAAa,CACjBC,EACAC,EACA5K,EACAC,EACAC,EACAC,EACAC,EACAyK,EACAC,EACAC,IACa,CACb,IAAIpN,EAAKgN,EACL/M,EAAKgN,EACLpM,EAAKwB,EACLvB,EAAKwB,EACLpC,EAAKgN,EACL/M,EAAKgN,EAGH,MAAAE,EAAQ,KAAK,GAAK,IAAO,IAEzBpE,EAAO,KAAK,GAAK,KAAQ,CAAC1G,GAAS,GACzC,IAAI+K,EAAM,CAAC,EACPC,EACAC,EACAC,EACAnM,EACAC,EAEJ,GAAK6L,EA4CH,CAACI,EAAIC,EAAInM,EAAIC,CAAE,EAAI6L,MA5CL,CACdG,EAAKvE,GAAahJ,EAAIC,EAAI,CAACgJ,CAAG,EAC9BjJ,EAAKuN,EAAG,EACRtN,EAAKsN,EAAG,EACRA,EAAKvE,GAAa9I,EAAIC,EAAI,CAAC8I,CAAG,EAC9B/I,EAAKqN,EAAG,EACRpN,EAAKoN,EAAG,EAEF,MAAAzO,GAAKkB,EAAKE,GAAM,EAChBvC,GAAKsC,EAAKE,GAAM,EACtB,IAAIhC,EAAKW,EAAIA,GAAM+B,EAAKA,GAAOlD,EAAIA,GAAMmD,EAAKA,GAC1C3C,EAAI,IACFA,EAAA,KAAK,KAAKA,CAAC,EACT0C,GAAA1C,EACA2C,GAAA3C,GAER,MAAMuP,GAAM7M,EAAKA,EACX8M,GAAM7M,EAAKA,EAEX5B,IAAKsD,IAAQC,EAAK,GAAK,GAC3B,KAAK,KACH,KAAK,KACFiL,GAAMC,GAAMD,GAAM/P,EAAIA,EAAIgQ,GAAM7O,EAAIA,IAAM4O,GAAM/P,EAAIA,EAAIgQ,GAAM7O,EAAIA,EAAA,CAEvE,EAEFwC,EAAMpC,GAAI2B,EAAKlD,EAAKmD,GAAMd,EAAKE,GAAM,EACrCqB,EAAMrC,GAAI,CAAC4B,EAAKhC,EAAK+B,GAAMZ,EAAKE,GAAM,EAEjCqN,EAAA,KAAK,OAASvN,EAAKsB,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAEvD2M,EAAA,KAAK,OAAStN,EAAKoB,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAE5D0M,EAAKxN,EAAKsB,EAAK,KAAK,GAAKkM,EAAKA,EAC9BC,EAAKvN,EAAKoB,EAAK,KAAK,GAAKmM,EAAKA,EAC1BD,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3BC,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3BhL,GAAM+K,EAAKC,IACbD,GAAM,KAAK,GAAK,GAEd,CAAC/K,GAAMgL,EAAKD,IACdC,GAAM,KAAK,GAAK,EAClB,CAIF,IAAIG,EAAKH,EAAKD,EACd,GAAI,KAAK,IAAII,CAAE,EAAIP,EAAM,CACvB,MAAMQ,EAAQJ,EACRK,EAAQ5N,EACR6N,EAAQ5N,EACdsN,EAAKD,EAAKH,GAAQ5K,GAAMgL,EAAKD,EAAK,EAAI,IACtCtN,EAAKoB,EAAKT,EAAK,KAAK,IAAI4M,CAAE,EAC1BtN,EAAKoB,EAAKT,EAAK,KAAK,IAAI2M,CAAE,EACpBH,EAAAP,GAAW7M,EAAIC,EAAIU,EAAIC,EAAIyB,EAAO,EAAGE,EAAIqL,EAAOC,EAAO,CAC3DN,EACAI,EACAvM,EACAC,CAAA,CACD,CAAA,CAEHqM,EAAKH,EAAKD,EACJ,MAAAQ,EAAK,KAAK,IAAIR,CAAE,EAChBS,EAAK,KAAK,IAAIT,CAAE,EAChBU,EAAK,KAAK,IAAIT,CAAE,EAChBU,EAAK,KAAK,IAAIV,CAAE,EAChBhO,EAAI,KAAK,IAAImO,EAAK,CAAC,EACnBQ,EAAM,EAAI,EAAKvN,EAAKpB,EACpB4O,EAAM,EAAI,EAAKvN,EAAKrB,EACpB6O,EAAK,CAACtO,EAAIC,CAAE,EACZsO,EAAK,CAACvO,EAAKoO,EAAKH,EAAIhO,EAAKoO,EAAKL,CAAE,EAChCQ,EAAK,CAACtO,EAAKkO,EAAKD,EAAIhO,EAAKkO,EAAKH,CAAE,EAChCO,GAAK,CAACvO,EAAIC,CAAE,EAGlB,GAFAoO,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACxBA,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACpBnB,EACK,MAAA,CAACmB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOnB,CAAG,EAExDA,EAAA,CAACiB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOnB,CAAG,EAC3D,MAAMoB,EAAS,CAAC,EACP,QAAA5Q,EAAI,EAAG6Q,EAAKrB,EAAI,OAAQxP,EAAI6Q,EAAI7Q,GAAK,EACrC4Q,EAAA5Q,CAAC,EAAIA,EAAI,EACZkL,GAAasE,EAAIxP,EAAI,CAAC,EAAGwP,EAAIxP,CAAC,EAAGmL,CAAG,EAAE,EACtCD,GAAasE,EAAIxP,CAAC,EAAGwP,EAAIxP,EAAI,CAAC,EAAGmL,CAAG,EAAE,EAErC,OAAAyF,CACT,EC7HME,GAAc,CAClB5O,EACAC,EACA4O,EACAC,EACA5O,EACAC,IACqD,CACrD,MAAM4O,EAAM,kBACNC,EAAM,EAAI,EACT,MAAA,CACLD,EAAM/O,EAAKgP,EAAMH,EACjBE,EAAM9O,EAAK+O,EAAMF,EACjBC,EAAM7O,EAAK8O,EAAMH,EACjBE,EAAM5O,EAAK6O,EAAMF,EACjB5O,EACAC,CACF,CACF,EClBM8O,GAAc,CAACjP,EAAYC,EAAYC,EAAYC,IAAe,CAChE,MAAA6N,EAAKxO,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,iBAAS,EAC3C+N,EAAK1O,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,EAAM,CAAG,EACjD,MAAO,CAAC6N,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGhO,EAAIC,CAAE,CAC5C,ECFM+O,GAAiB,CAACtD,EAAsBuD,IAAyB,CAC/D,KAAA,CAAC1F,CAAW,EAAImC,EAChBwD,EAASxD,EAAQ,MAAM,CAAC,EAAE,IAAI,MAAM,EACpC,CAAC9M,EAAGnB,CAAC,EAAIyR,EAET,CAAE,GAAIC,EAAK,GAAIC,EAAK,EAAGC,EAAI,EAAGC,CAAA,EAAOL,EAO3C,MALK,KAAK,SAAS1F,CAAW,IAC5B0F,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV1F,IAAgB,KAClB0F,EAAO,EAAIrQ,EACXqQ,EAAO,EAAIxR,EACJiO,GACEnC,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BsD,GACEsC,EACAC,EACAF,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,CAAA,CAEZ,EACS3F,IAAgB,KACzB0F,EAAO,GAAKrQ,EACZqQ,EAAO,GAAKxR,EACL,CAAC,GAAsB,EAAE,OAC9BiR,GAAYS,EAAKC,EAAKF,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAClE,GACS3F,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BwF,GAAYI,EAAKC,EAAKxQ,EAAGnB,CAAC,CAC5B,EACS8L,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BwF,GAAYI,EAAKC,EAAKC,EAAIC,CAAE,CAC9B,EAGK5D,CACT,ECtCM6D,GAAmB,CAAC7D,EAAsBuD,IAAyB,CACjE,KAAA,CAAC1F,CAAW,EAAImC,EAChBG,EAAatC,EAAY,YAAY,EACrC4C,EAAa5C,IAAgBsC,EAC7B,CAAE,GAAIsD,EAAK,GAAIC,EAAK,GAAII,EAAK,GAAIC,EAAK,EAAA7Q,EAAG,EAAAnB,CAAM,EAAAwR,EAC/CC,EAASxD,EAAQ,MAAM,CAAC,EAC9B,IAAII,EAAYoD,EAAO,IAAI,CAACvR,EAAGkI,IAAMlI,GAAKwO,EAActG,EAAI,EAAIpI,EAAImB,EAAK,EAAE,EAS3E,GAPK,KAAK,SAASiN,CAAU,IAE3BoD,EAAO,GAAK,KACZA,EAAO,GAAK,MAIVpD,IAAe,IACjB,OAAAC,EAAYoD,EAAO,MAAM,EAAG,EAAE,EAAE,OAC9BA,EAAO,CAAC,GAAK/C,EAAavN,EAAI,GAC9BsQ,EAAO,CAAC,GAAK/C,EAAa1O,EAAI,EAChC,EAEO,CAAC,GAA2B,EAAE,OAAOqO,CAAS,EACvD,GAAWD,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC7CwQ,CACF,EACF,GAAWvD,IAAe,IACjB,MAAA,CACL,IACAsD,EACCzD,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC5C8M,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC5C8M,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACxB,MAAO,CAAC,GAA2B,EAAE,OAAOC,CAAS,EACvD,GAAWD,IAAe,IAAK,CACvB,MAAA/L,EAAKqP,EAAM,EAAIK,EACfzP,EAAKqP,EAAM,EAAIK,EACrB,OAAAR,EAAO,GAAKnP,EACZmP,EAAO,GAAKlP,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAO+L,CAAS,CAAA,SAC5BD,IAAe,IAAK,CAC7B,MAAM8C,EAAKQ,EAAM,GAAKF,EAAO,GAAKA,EAAO,GAAgC,GACnEL,EAAKQ,EAAM,GAAKH,EAAO,GAAKA,EAAO,GAAgC,GACzE,OAAAA,EAAO,GAAKN,EACZM,EAAO,GAAKL,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAO9C,CAAS,CAAA,SAC5BD,IAAe,IAAK,CACvB,KAAA,CAAC6D,EAAKC,CAAG,EAAI7D,EACnB,OAAAmD,EAAO,GAAKS,EACZT,EAAO,GAAKU,EACL,CAAC,GAA2B,EAAE,OAAO7D,CAAS,CAAA,SAC5CD,IAAe,IACxB,MAAO,CAAC,GAAG,EAIN,OAAAH,CACT,EC3FMkE,GAA6B,CACjC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,EAAG,EACH,GAAI,KACJ,GAAI,IACN,ECMMC,GAAerE,GAA8C,CAC3D,MAAAyD,EAAS,CAAE,GAAGW,EAAa,EAC3BtG,EAAOiC,EAAgBC,CAAS,EAEtC,OAAOQ,EAAoB1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC7DqD,EAAO,EAAItD,EACXsD,EAAO,EAAIrD,EACL,MAAAmE,EAAgBR,GAAiBO,EAAKb,CAAM,EAC9C,IAAAe,EAAShB,GAAee,EAAed,CAAM,EAC/Be,EAAO,CAAC,IAAM,KAAOA,EAAO,OAAS,IAGhD1G,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAA+B,EAAE,OAAOoG,EAAO,MAAM,CAAC,CAAC,CAC1D,EACSA,EAAAA,EAAO,MAAM,EAAG,CAAC,GAG5B,MAAMjE,EAASiE,EAAO,OACtB,OAAAf,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAC1CA,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAEnCe,CAAA,CACR,CACH,ECjCMC,GAAe,CACnB3G,EACA4G,IACW,CACX,MAAMhE,EAAU5C,EAAK,OACjB,GAAA,CAAE,MAAAL,GAAUE,EACZuC,EAAUpC,EAAK,CAAC,EAChB0G,EAAS,GAGb/G,EAAQiH,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOjH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAEzC,QAASrL,EAAI,EAAGA,EAAIsO,EAAStO,GAAK,EAAG,CACnC8N,EAAUpC,EAAK1L,CAAC,EACV,KAAA,CAAC2L,CAAW,EAAImC,EAChBwD,EAASxD,EAAQ,MAAM,CAAC,EAE9B,GADUsE,GAAAzG,EACNN,IAAU,MACF+G,GAAAd,EAAO,KAAK,GAAG,MACpB,CACL,IAAIrJ,EAAI,EACR,MAAMsK,EAASjB,EAAO,OACtB,KAAOrJ,EAAIsK,GACTH,GAAUhH,EAAQkG,EAAOrJ,CAAC,EAAGoD,CAAK,EAC9BpD,IAAMsK,EAAS,IAAaH,GAAA,KAC3BnK,GAAA,CACP,CACF,CAGK,OAAAmK,CACT,ECvCMI,GAAe5E,GAAkC,CACrD,GAAI,CAACA,EACI,MAAA,CACL,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACN,EAGI,MAAAlC,EAAOiC,EAAgBC,CAAS,EACtC,IAAIjC,EAAc,IACd6C,EAAK,EACLC,EAAK,EACH,KAAA,CAAE,IAAA7L,EAAK,IAAAD,CAAA,EAAQ,KACrB,IAAImE,EAAO,IACPE,EAAO,IACPD,EAAO,KACPE,EAAO,KACPwL,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EAEd9E,EAAQ1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC1C,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEVC,EAAgBlE,IAAe,IAChC,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAYJ,GAVA,CAACxH,CAAW,EAAIwG,EAEX,KAAK,SAASlE,CAAU,IAEjBgF,EAAA,EACAC,EAAA,GAKRvH,IAAgB,IACjB,EAAE6C,EAAIC,CAAE,EAAI0D,EACNM,EAAAjE,EACAkE,EAAAjE,EACAkE,EAAAnE,EACAoE,EAAAnE,UACE9C,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIlQ,GACzBqL,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIzM,GACzB4H,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IAAK,CACxB,MAAAyH,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAE3B,CAACP,EAAMC,EAAMC,EAAMC,CAAI,EAAItI,GACzByD,EACAC,EACAoF,EACAC,EACAlB,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACSxG,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAItI,GACzByD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACSxG,IAAgB,KACzBsH,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACxB,CAACT,EAAMC,EAAMC,EAAMC,CAAI,EAAI/H,GACzBkD,EACAC,EACAiF,EACAC,EACAf,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,KACzBsH,EAAUd,EAAc,CAAC,EACzBe,EAAUf,EAAc,CAAC,EACzB,CAACM,EAAMC,EAAMC,EAAMC,CAAI,EAAI/H,GACzBkD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,MACxB,CAAA8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIlQ,GAAYqL,EAAOC,EAAOQ,EAAIC,CAAE,GAEtD3H,EAAAnE,EAAI8P,EAAM3L,CAAI,EACdE,EAAArE,EAAI+P,EAAM1L,CAAI,EACdD,EAAAnE,EAAI+P,EAAM5L,CAAI,EACdE,EAAArE,EAAIgQ,EAAM3L,CAAI,EAGpB,CAAA4L,EAASC,CAAO,EAAInH,IAAgB,IACjC,CAAC6C,EAAIC,CAAE,EACN0D,EAAc,MAAM,EAAE,EAC1B,CAAAY,EAASC,CAAO,EAAIrH,IAAgB,IAChC,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpCxG,IAAgB,IACf,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAACU,EAASC,CAAO,CAAA,CACtB,EAED,MAAMQ,EAAQvM,EAAOD,EACfyM,EAAStM,EAAOD,EAEf,MAAA,CACL,MAAAsM,EACA,OAAAC,EACA,EAAGzM,EACH,EAAGE,EACH,GAAID,EACJ,GAAIE,EACJ,GAAIH,EAAOwM,EAAQ,EACnB,GAAItM,EAAOuM,EAAS,EAEpB,GAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,CAC1D,CACF,EChKMC,EAAkB5F,GAAkC,CAClD,MAAAlC,EAAOiC,EAAgBC,CAAS,EACtC,IAAIiF,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVvH,EAAc,IACd6C,EAAK,EACLC,EAAK,EACLgF,EAAc,EAElB,OAAArF,EAAQ1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC1C,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEVC,EAAgBlE,IAAe,IAChC,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAWJ,GAVA,CAACxH,CAAW,EAAIwG,EAEX,KAAK,SAASlE,CAAU,IAEjBgF,EAAA,EACAC,EAAA,GAKRvH,IAAgB,IAEjB,EAAE6C,EAAIC,CAAE,EAAI0D,UACJxG,IAAgB,IACV8H,GAAAxR,GACb8L,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IACV8H,GAAA1N,GACbgI,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IAAK,CACxB,MAAAyH,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAEZS,GAAAvJ,GACb6D,EACAC,EACAoF,EACAC,EACAlB,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACSxG,IAAgB,IACV8H,GAAAvJ,GACb6D,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACSxG,IAAgB,KACzBsH,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACTO,GAAA9I,GACboD,EACAC,EACAiF,EACAC,EACAf,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,KACzBsH,EAAUd,EAAc,CAAC,EACzBe,EAAUf,EAAc,CAAC,EACVsB,GAAA9I,GACboD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,MACzB8H,GAAexR,GAAc8L,EAAOC,EAAOQ,EAAIC,CAAE,GAIlD,CAAAoE,EAASC,CAAO,EAAInH,IAAgB,IACjC,CAAC6C,EAAIC,CAAE,EACN0D,EAAc,MAAM,EAAE,EAC1B,CAAAY,EAASC,CAAO,EAAIrH,IAAgB,IAChC,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpCxG,IAAgB,IACf,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAACU,EAASC,CAAO,CAAA,CACtB,EAEMW,CACT,ECxIMC,GAAmB,KCcnBC,GAAiB/F,GAAkC,CACjD,MAAAlC,EAAOiC,EAAgBC,CAAS,EAChCyD,EAAS,CAAE,GAAGW,EAAa,EAEjC,OAAO5D,EAAqB1C,EAAM,CAACwG,EAAK0B,EAAG7F,EAAOC,IAAU,CAC1DqD,EAAO,EAAItD,EACXsD,EAAO,EAAIrD,EACL,MAAAoE,EAAST,GAAiBO,EAAKb,CAAM,EAErClD,EAASiE,EAAO,OACtB,OAAAf,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAC1CA,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAEnCe,CAAA,CACR,CACH,ECfMyB,GAAmB,CAACjG,EAA+BrL,IAAsB,CACvE,MAAAmJ,EAAOiI,GAAc/F,CAAS,EACpC,IAAIkG,EAAM,GACNjI,EAAO,CAAC,EACRF,EAAc,IACd3K,EAAI,EACJnB,EAAI,EACJ,CAAC2O,EAAIC,CAAE,EAAI/C,EAAK,CAAC,EAAE,MAAM,CAAC,EACxB,MAAAtB,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EACvBhM,EAAS,EACTsR,EAAQvR,EACRiR,EAAc,EAElB,MAAI,CAACrJ,GAAoB7H,EAAWmR,GAAyBlR,GAG7D4L,EAAQ1C,EAAM,CAACwG,EAAK0B,EAAG7F,EAAOC,IAAU,CA8FtC,GA7FA,CAACrC,CAAW,EAAIuG,EAChB4B,EAAMnI,IAAgB,IACfE,EAACiI,EAAwDjI,EAAlD,CAACkC,EAAOC,CAAK,EAAE,OAAOkE,EAAI,MAAM,CAAC,CAAa,EAIxD4B,GAED,EAAEtF,EAAIC,CAAE,EAAIyD,EACb1P,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EACdhM,EAAA,GACAkJ,IAAgB,KACjBnJ,EAAAF,GACNuJ,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACAhR,EAASR,GAAc4J,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAChDF,IAAgB,KACjBnJ,EAAAwD,GACN6F,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAsD,GACP8F,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBnJ,EAAA2H,GACN0B,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAyH,GACP2B,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBnJ,EAAAoI,GACNiB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAkI,GACPkB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,MACzBE,EAAO,CAACkC,EAAOC,EAAOQ,EAAIC,CAAE,EAC5BjM,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EAEvBhM,EAASR,GAAc4J,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAG3D,CAAC7K,EAAGnB,CAAC,EAAIgM,EAAK,MAAM,EAAE,EAElB4H,EAAclR,EACRwR,EAAAvR,MAKD,OAAA,GAGMiR,GAAAhR,CACf,CACD,EAIGF,EAAWkR,EAAcC,GACpB,CAAE,EAAA1S,EAAG,EAAAnB,CAAE,EAGTkU,EACT,ECtIMC,GAAwB,CAC5BpG,EACArL,IACsB,CAChB,MAAA0R,EAAYtG,EAAgBC,CAAS,EAEvC,IAAAsG,EAAWD,EAAU,MAAM,CAAC,EAC5BE,EAAaX,EAAeU,CAAQ,EACpClI,EAAQkI,EAAS,OAAS,EAC1BE,EAAkB,EAClB3R,EAAS,EACTqL,EAAUmG,EAAU,CAAC,EAGrB,GAAAjI,GAAS,GAAK,CAACzJ,GAAY,CAAC,OAAO,SAASA,CAAQ,EAC/C,MAAA,CACL,QAAAuL,EACA,MAAO,EACP,OAAArL,EACA,gBAAA2R,CACF,EAGF,GAAI7R,GAAY4R,EACH,OAAAD,EAAAD,EAAU,MAAM,EAAG,EAAE,EAChCG,EAAkBZ,EAAeU,CAAQ,EACzCzR,EAAS0R,EAAaC,EACtBtG,EAAUmG,EAAUjI,CAAK,EAClB,CACL,QAAA8B,EACA,MAAA9B,EACA,OAAAvJ,EACA,gBAAA2R,CACF,EAGF,MAAMjH,EAAW,CAAC,EAClB,KAAOnB,EAAQ,GACb8B,EAAUoG,EAASlI,CAAK,EACbkI,EAAAA,EAAS,MAAM,EAAG,EAAE,EAC/BE,EAAkBZ,EAAeU,CAAQ,EACzCzR,EAAS0R,EAAaC,EACTD,EAAAC,EAEbjH,EAAS,KAAK,CACZ,QAAAW,EACA,MAAA9B,EACA,OAAAvJ,EACA,gBAAA2R,CAAA,CACD,EACQpI,GAAA,EAGX,OAAOmB,EAAS,KAAK,CAAC,CAAE,gBAAiBhN,KACvCA,GAAKoC,CACP,CACF,ECnDM8R,GAAuB,CAC3BzG,EACApL,IACoB,CACd,MAAAkJ,EAAOiC,EAAgBC,CAAS,EAChC0G,EAAaX,GAAcjI,CAAI,EAC/ByI,EAAaX,EAAec,CAAU,EACtCC,EAAc9U,GAAa,CACzB,MAAAuF,EAAKvF,EAAE,EAAI+C,EAAM,EACjByC,EAAKxF,EAAE,EAAI+C,EAAM,EAChB,OAAAwC,EAAKA,EAAKC,EAAKA,CACxB,EACA,IAAIuP,EAAY,EACZC,EACAC,EAAU,CAAE,EAAG,EAAG,EAAG,CAAE,EACvBC,EAAe,EACfC,EAAa,EACbC,EAAe,IAGnB,QAASC,EAAa,EAAGA,GAAcX,EAAYW,GAAcN,EACxDC,EAAAZ,GAAiBS,EAAYQ,CAAU,EAC9CH,EAAeJ,EAAWE,CAAI,EAE1BE,EAAeE,IACPH,EAAAD,EACGG,EAAAE,EACED,EAAAF,GAKNH,GAAA,EACT,IAAAO,EACAC,EACAC,EAAe,EACfC,EAAc,EACdC,EAAiB,EACjBC,EAAgB,EAEpB,KAAOZ,EAAY,OACjBS,EAAeL,EAAaJ,EACnBO,EAAAlB,GAAiBS,EAAYW,CAAY,EAClDE,EAAiBZ,EAAWQ,CAAM,EAClCG,EAAcN,EAAaJ,EACnBQ,EAAAnB,GAAiBS,EAAYY,CAAW,EAChDE,EAAgBb,EAAWS,CAAK,EAE5BC,GAAgB,GAAKE,EAAiBN,GAC9BH,EAAAK,EACGH,EAAAK,EACEJ,EAAAM,GACND,GAAef,GAAciB,EAAgBP,GAC5CH,EAAAM,EACGJ,EAAAM,EACEL,EAAAO,GAEFZ,GAAA,EAEX,EAAAA,EAAY,QAAhB,CAGI,MAAA1G,EAAUkG,GAAsBtI,EAAMkJ,CAAU,EAChDrS,EAAW,KAAK,KAAKsS,CAAY,EAEhC,MAAA,CAAE,QAAAH,EAAS,SAAAnS,EAAU,QAAAuL,CAAQ,CACtC,EC1EMuH,GAAkB,CACtBzH,EACApL,IAEO6R,GAAqBzG,EAAWpL,CAAK,EAAE,QCI1C8S,GAAkB,CACtBpT,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IAGG,IACGA,EAAKF,IAAO0H,EAAME,IACjB3H,EAAKF,IAAO4H,EAAME,GACnBF,GAAO5H,EAAK6H,GACZF,GAAO1H,EAAK6H,GACZ3H,GAAM0H,EAAM7H,EAAK,GACjBE,GAAM4H,EAAM7H,EAAK,IACrB,GAcEoT,GAAe7J,GAAoB,CACvC,IAAI1K,EAAI,EACJnB,EAAI,EACJ6I,EAAM,EAEV,OAAOuJ,GAAYvG,CAAI,EACpB,IAAKwG,GAAQ,CACJ,OAAAA,EAAI,CAAC,EAAG,CACd,IAAK,IACF,QAAElR,EAAGnB,CAAC,EAAIqS,EACJ,EACT,QACQ,OAAAxJ,EAAA4M,GACJtU,EACAnB,EACAqS,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,CACP,EACA,CAAClR,EAAGnB,CAAC,EAAIqS,EAAI,MAAM,EAAE,EACdxJ,CAAA,CACX,CACD,EACA,OAAO,CAACxI,EAAGW,IAAMX,EAAIW,EAAG,CAAC,CAC9B,EClEM2U,GAAoB9J,GACjB6J,GAAYtD,GAAYvG,CAAI,CAAC,GAAK,ECFrC+J,GAAqB,CACzB7H,EACArL,IAEOyR,GAAsBpG,EAAWrL,CAAQ,EAAE,QCH9CmT,GAAoB,CACxBhK,EACAlJ,IAEO6R,GAAqB3I,EAAMlJ,CAAK,EAAE,QCNrCmT,GAAejK,GAEjB,MAAM,QAAQA,CAAI,GAClBA,EAAK,MAAOwG,GAAqB,CAC/B,MAAM0D,EAAK1D,EAAI,CAAC,EAAE,YAAY,EAC9B,OACE1G,EAAYoK,CAAE,IAAM1D,EAAI,OAAS,GACjC,aAAa,SAAS0D,CAAE,GACvB1D,EAAI,MAAM,CAAC,EAAgB,MAAM,OAAO,QAAQ,CAAA,CAEpD,GACDxG,EAAK,OAAS,ECVZmK,GAAmBnK,GAErBiK,GAAYjK,CAAI,GAEhBA,EAAK,MAAM,CAAC,CAAC1K,CAAC,IAAMA,IAAMA,EAAE,aAAa,ECHvC8U,GAAqBpK,GAElBmK,GAAgBnK,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACqK,CAAE,IAAM,SAAS,SAASA,CAAE,CAAC,ECHtEC,GAAgBtK,GAEboK,GAAkBpK,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACqK,CAAE,IAAM,KAAK,SAASA,CAAE,CAAC,ECDpEE,GAAkB,CACtBrI,EACApL,IACG,CACH,KAAM,CAAE,SAAAD,CAAa,EAAA8R,GAAqBzG,EAAWpL,CAAK,EACnD,OAAA,KAAK,IAAID,CAAQ,EAAImR,EAC9B,ECPMwC,GAAmBxK,GAErBiK,GAAYjK,CAAI,GAEhBA,EAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAACqK,CAAE,IAAMA,IAAOA,EAAG,aAAa,ECHnDI,GAAezI,GAAuB,CAC1C,GAAI,OAAOA,GAAe,UAAY,CAACA,EAAW,OACzC,MAAA,GAGH,MAAAhC,EAAO,IAAI+B,GAAWC,CAAU,EAItC,IAFAb,EAAWnB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCwB,GAAYxB,CAAI,EAGX,MAAA,CAACA,EAAK,IAAI,QAAU,KAAK,SAASA,EAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAC9D,ECpBM0K,GAA2B,CAC/B,KAAM,CAAC,KAAM,KAAM,KAAM,IAAI,EAC7B,OAAQ,CAAC,KAAM,KAAM,GAAG,EACxB,QAAS,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,KAAM,CAAC,QAAS,SAAU,IAAK,IAAK,KAAM,IAAI,EAC9C,QAAS,CAAC,QAAQ,EAClB,SAAU,CAAC,QAAQ,EACnB,MAAO,CAAC,GAAG,CACb,ECbMC,GAAaC,GACKA,GAAS,MAC/B,OAAOA,GAAS,UACfA,EAAc,WAAa,ECmBjBC,GAAeC,GAA8B,CACxD,GAAI,CAAE,GAAAtU,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAO,EAAAmU,EACzB,OAACtU,EAAIC,EAAIC,EAAIC,CAAE,EAAI,CAACH,EAAIC,EAAIC,EAAIC,CAAE,EAAE,IAAKnC,GAAM,CAACA,CAAC,EAC1C,CACL,CAAC,IAAKgC,EAAIC,CAAE,EACZ,CAAC,IAAKC,EAAIC,CAAE,CACd,CACF,EAQaoU,GAAeD,GAA8B,CACxD,MAAMvC,EAAY,CAAC,EACbnM,GAAU0O,EAAK,QAAU,IAC5B,KAAK,EACL,MAAM,QAAQ,EACd,IAAKtW,GAAM,CAACA,CAAC,EAEhB,IAAI8L,EAAQ,EACL,KAAAA,EAAQlE,EAAO,QACpBmM,EAAU,KAAK,CAACjI,EAAQ,IAAM,IAAKlE,EAAOkE,CAAK,EAAGlE,EAAOkE,EAAQ,CAAC,CAAC,CAAC,EAC3DA,GAAA,EAGH,OAAAwK,EAAK,OAAS,UAClB,CAAC,GAAGvC,EAAW,CAAC,GAAG,CAAC,EACpBA,CACN,EAQayC,GAAiBF,GAAgC,CAC5D,GAAI,CAAE,GAAAhT,EAAI,GAAAC,EAAI,EAAAxD,CAAM,EAAAuW,EACpB,OAAChT,EAAIC,EAAIxD,CAAC,EAAI,CAACuD,EAAIC,EAAIxD,CAAC,EAAE,IAAKC,GAAM,CAACA,CAAC,EAEhC,CACL,CAAC,IAAKsD,EAAKvD,EAAGwD,CAAE,EAChB,CAAC,IAAKxD,EAAGA,EAAG,EAAG,EAAG,EAAG,EAAIA,EAAG,CAAC,EAC7B,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAG,GAAKA,EAAG,CAAC,CAChC,CACF,EAQa0W,GAAkBH,GAAiC,CAC1D,GAAA,CAAE,GAAAhT,EAAI,GAAAC,CAAA,EAAO+S,EACbzT,EAAKyT,EAAK,IAAM,EAChBxT,EAAKwT,EAAK,IAAMzT,EACpB,OAACS,EAAIC,EAAIV,EAAIC,CAAE,EAAI,CAACQ,EAAIC,EAAIV,EAAIC,CAAE,EAAE,IAAK9C,GAAM,CAACA,CAAC,EAE1C,CACL,CAAC,IAAKsD,EAAKT,EAAIU,CAAE,EACjB,CAAC,IAAKV,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAID,EAAI,CAAC,EAChC,CAAC,IAAKA,EAAIC,EAAI,EAAG,EAAG,EAAG,GAAKD,EAAI,CAAC,CACnC,CACF,EAQa6T,GAAoBJ,GAA8B,CACvD,MAAAxV,EAAI,CAACwV,EAAK,GAAK,EACf3W,EAAI,CAAC2W,EAAK,GAAK,EACfhW,EAAI,CAACgW,EAAK,MACVnW,EAAI,CAACmW,EAAK,OACZ,IAAAzT,EAAK,EAAEyT,EAAK,IAAM,GAClBxT,EAAK,EAAEwT,EAAK,IAAMzT,GAGtB,OAAIA,GAAMC,GAKJD,EAAK,EAAIvC,IAAUuC,IAAAA,EAAK,EAAIvC,GAAK,GAEjCwC,EAAK,EAAI3C,IAAU2C,IAAAA,EAAK,EAAI3C,GAAK,GAE9B,CACL,CAAC,IAAKW,EAAI+B,EAAIlD,CAAC,EACf,CAAC,IAAKW,EAAIuC,EAAK,CAAC,EAChB,CAAC,IAAKA,EAAI,EAAGA,EAAIC,CAAE,EACnB,CAAC,IAAK3C,EAAI2C,EAAK,CAAC,EAChB,CAAC,IAAK,EAAGA,EAAI,CAACD,EAAIC,CAAE,EACpB,CAAC,IAAK,CAACxC,EAAIuC,EAAK,CAAC,EACjB,CAAC,IAAK,CAACA,EAAI,EAAG,CAACA,EAAI,CAACC,CAAE,EACtB,CAAC,IAAK,CAAC3C,EAAI2C,EAAK,CAAC,EACjB,CAAC,IAAK,EAAG,CAACA,EAAID,EAAI,CAACC,CAAE,CACvB,GAGK,CAAC,CAAC,IAAKhC,EAAGnB,CAAC,EAAG,CAAC,IAAKW,CAAC,EAAG,CAAC,IAAKH,CAAC,EAAG,CAAC,IAAKW,CAAC,EAAG,CAAC,GAAG,CAAC,CAC1D,EAYM6V,GACJC,GACG,CACG,MAAAC,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEhD,GAAAG,GAAW,CAAC,GAAGF,EAAiB,MAAM,EAAE,MAAOxX,GAAM0X,IAAY1X,CAAC,EACpE,MAAM,UAAU,GAAGuM,CAAK,MAAMmL,CAAO,qBAAqB,EAGtD,MAAAC,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAElBF,EACSG,EAAA,QAAS1X,GAAM,CACxB2X,EAAO3X,CAAC,EAAIqX,EAAQ,aAAarX,CAAC,CAAA,CACnC,EAEM,OAAA,OAAO2X,EAAQN,CAAO,EAI/B,IAAI7C,EAAY,CAAC,EAsBjB,OAnBIiD,IAAS,SACXjD,EAAYyC,GAAcU,CAA+B,EAChDF,IAAS,UAClBjD,EAAY0C,GAAeS,CAAgC,EAClD,CAAC,WAAY,SAAS,EAAE,SAASF,CAAI,EAC9CjD,EAAYwC,GAAYW,CAA6B,EAC5CF,IAAS,OAClBjD,EAAY2C,GAAiBQ,CAA6B,EACjDF,IAAS,OAClBjD,EAAYsC,GAAYa,CAA6B,EAC5C,CAAC,QAAS,MAAM,EAAE,SAASF,CAAI,IAC5BjD,EAAAtG,EACVqJ,EACIF,EAAQ,aAAa,GAAG,GAA0C,GACjEA,EAAsB,GAAK,EAClC,GAIEnB,GAAY1B,CAAS,GAAKA,EAAU,OAC/BA,EAEF,EACT,ECtKMoD,GAAc,CAClBP,EACAQ,EACAC,IAC2B,CAC3B,MAAMC,EAAMD,GAAiB,SACvBR,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEpD,GAAIG,IAAY,OACd,MAAM,UAAU,GAAGnL,CAAK,MAAMmL,CAAO,6BAA6B,EAEpE,GAAIA,GAAWF,EAAgB,MAAOxX,GAAM0X,IAAY1X,CAAC,EACvD,MAAM,UAAU,GAAGuM,CAAK,MAAMmL,CAAO,qBAAqB,EAG5D,MAAMvL,EAAO8L,EAAI,gBAAgB,6BAA8B,MAAM,EAC/DN,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAGhB7L,EAAQE,EAAe,MACvB0I,EAAY4C,GAAiBC,CAAO,EACpCW,EAAcxD,GAAaA,EAAU,OACvC5B,GAAa4B,EAAW5I,CAAK,EAC7B,GAwBA,OAtBA2L,GACSG,EAAA,QAAS1X,GAAM,CACxB2X,EAAO3X,CAAC,EAAIqX,EAAQ,aAAarX,CAAC,CAAA,CACnC,EAEM,OAAA,OAAOqX,EAAQ,UAAU,EAAE,QAAQ,CAAC,CAAE,KAAAY,EAAM,MAAAC,KAAY,CACxDR,EAAW,SAASO,CAAI,GAAQhM,EAAA,aAAagM,EAAMC,CAAK,CAAA,CAC9D,IAEM,OAAA,OAAOP,EAAQN,CAAO,EAE7B,OAAO,KAAKM,CAAM,EAAE,QAAShW,GAAM,CAC7B,CAAC+V,EAAW,SAAS/V,CAAC,GAAKA,IAAM,QAC9BsK,EAAA,aACHtK,EAAE,QAAQ,SAAWhB,GAAM,IAAIA,EAAE,YAAa,CAAA,EAAE,EAChDgX,EAAOhW,CAAC,CACV,CACF,CACD,GAIC+U,GAAYsB,CAAW,GACpB/L,EAAA,aAAa,IAAK+L,CAAW,EAC9BH,GAAWN,IACLF,EAAA,OAAOpL,EAAMoL,CAAO,EAC5BA,EAAQ,OAAO,GAEVpL,GAEF,EACT,ECtEMkM,GAAiB,CACrB9J,EACAqE,EACAd,EACAwG,IACiB,CACX,KAAA,CAAClM,CAAW,EAAImC,EAChB,CAAE,MAAOgK,CAAA,EAAiBvM,EAC1BF,EACFyM,EAEEC,EAAe5F,EAAc,MAAM,CAAC,EACpC,CAAE,GAAAjQ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,EAAArB,EAAG,EAAAnB,GAAMwR,EAC3B,CAAC2G,EAAIC,CAAE,EAAIF,EAAa,MAAM,EAAE,EAChC3F,EAAStE,EAQf,GANK,KAAK,SAASnC,CAAW,IAE5B0F,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV1F,IAAgB,IAAK,CACvB,GAAIP,EAAQpK,EAAGqK,CAAK,IAAMD,EAAQ4M,EAAI3M,CAAK,EAClC,MAAA,CAAC,IAAK4M,CAAE,EACjB,GAAW7M,EAAQvL,EAAGwL,CAAK,IAAMD,EAAQ6M,EAAI5M,CAAK,EACzC,MAAA,CAAC,IAAK2M,CAAE,CACjB,SACSrM,IAAgB,IAAK,CACxB,KAAA,CAACuM,EAAKC,CAAG,EAAIJ,EAInB,GAHA1G,EAAO,GAAK6G,EACZ7G,EAAO,GAAK8G,EAGV,KAAK,SAASN,CAAW,IACvBzM,EAAQ8M,EAAK7M,CAAK,IAAMD,EAAQlJ,EAAK,EAAIE,EAAIiJ,CAAK,GAClDD,EAAQ+M,EAAK9M,CAAK,IAAMD,EAAQjJ,EAAK,EAAIE,EAAIgJ,CAAK,GACjDD,EAAQlJ,EAAImJ,CAAK,IAAMD,EAAQhJ,EAAK,EAAIpB,EAAGqK,CAAK,GAC/CD,EAAQjJ,EAAIkJ,CAAK,IAAMD,EAAQ/I,EAAK,EAAIxC,EAAGwL,CAAK,GAE7C,MAAA,CACL,IACA0M,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,CAChB,CACF,SACSpM,IAAgB,IAAK,CACxB,KAAA,CAACoF,EAAIC,CAAE,EAAI+G,EAKf,GAJF1G,EAAO,GAAKN,EACZM,EAAO,GAAKL,EAGV,KAAK,SAAS6G,CAAW,GACzBzM,EAAQ2F,EAAI1F,CAAK,IAAMD,EAAQlJ,EAAK,EAAIE,EAAIiJ,CAAK,GACjDD,EAAQ4F,EAAI3F,CAAK,IAAMD,EAAQjJ,EAAK,EAAIE,EAAIgJ,CAAK,EAEjD,MAAO,CAAC,IAAK0M,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,CAC/C,CAIK,OAAA3F,CACT,EClFMgG,GAAe,CACnBtK,EACAwE,IACG,CACH,MAAMhB,EAAUxD,EAAQ,MAAM,CAAC,EAAe,IAAK/N,GACjDqL,EAAQrL,EAAGuS,CAAW,CACxB,EACA,MAAO,CAACxE,EAAQ,CAAC,CAAyB,EAAE,OAAOwD,CAAM,CAC3D,ECOM+G,GAAe,CAACzK,EAAsB0E,IAAyB,CAC7D,MAAA5G,EAAOkD,GAAehB,CAAS,EAE/BvC,EAAQ,OAAOiH,GAAgB,UAAYA,GAAe,EAC5DA,EACqC,EAEnCgG,EAAc,CAAE,GAAGtG,EAAa,EAEhCuG,EAAkB,CAAC,EACzB,IAAI5M,EAAc,IACdkM,EAAc,IAElB,OAAOzJ,EAAQ1C,EAAM,CAACwG,EAAKlS,EAAG+N,EAAOC,IAAU,CAC7CsK,EAAY,EAAIvK,EAChBuK,EAAY,EAAItK,EACV,MAAAwK,EAAoB7G,GAAiBO,EAAKoG,CAAW,EAC3D,IAAIlG,EAASF,EAKb,GAJA,CAACvG,CAAW,EAAIuG,EAGhBqG,EAAgBvY,CAAC,EAAI2L,EACjB3L,EAAG,CAES6X,EAAAU,EAAgBvY,EAAI,CAAC,EACnC,MAAMyY,EAAeb,GACnB1F,EACAsG,EACAF,EACAT,CACF,EACMa,EAAaN,GAAaK,EAAcpN,CAAK,EAC7CsN,EAAYD,EAAW,KAAK,EAAE,EAC9BE,EAAkB/J,GAAkB4J,EAAczY,EAAG+N,EAAOC,CAAK,EACjE6K,EAAaT,GAAaQ,EAAiBvN,CAAK,EAChDyN,EAAYD,EAAW,KAAK,EAAE,EACpCzG,EAASuG,EAAU,OAASG,EAAU,OAASJ,EAAaG,CAAA,CAG9D,MAAM1K,EAASqK,EAAkB,OACjC,OAAAF,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,EAC9CmK,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,EAC9CmK,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,GAAKmK,EAAY,GAC/DA,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,GAAKmK,EAAY,GAExDlG,CAAA,CACR,CACH,ECzCM2G,GAAenL,GAAyB,CACtC,MAAAoL,EAAepK,GAAehB,CAAS,EACvCqL,EAAiBtF,GAAcqF,CAAY,EAC3CE,EAAOF,EAAa,OACpBG,EAAWH,EAAaE,EAAO,CAAC,EAAE,CAAC,IAAM,IAEzCE,EAAehL,EAAQ4K,EAAc,CAAClL,EAAS9N,IAAM,CACnD,MAAAwY,EAAoBS,EAAejZ,CAAC,EACpCqZ,EAAUrZ,GAAKgZ,EAAahZ,EAAI,CAAC,EACjC6X,EAAcwB,GAAWA,EAAQ,CAAC,EAClCC,EAAUN,EAAahZ,EAAI,CAAC,EAC5BuZ,EAAcD,GAAWA,EAAQ,CAAC,EAClC,CAAC3N,CAAW,EAAImC,EAChB,CAAC9M,EAAG,CAAC,EAAIiY,EAAejZ,EAAIA,EAAI,EAAIkZ,EAAO,CAAC,EAAE,MAAM,EAAE,EAC5D,IAAI9G,EAAStE,EAEb,OAAQnC,EAAa,CACnB,IAAK,IACHyG,EAAU+G,EAAW,CAAC,GAAG,EAAI,CAACxN,EAAa3K,EAAG,CAAC,EAC/C,MACF,IAAK,IACMoR,EAAA,CACPzG,EACAmC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,IAAM,EAAI,EAAI,EACvB9M,EACA,CACF,EACA,MACF,IAAK,IACCsY,GAAWC,IAAgB,IACpBnH,EAAA,CAAC,IAAKtE,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG9M,EAAG,CAAC,EAElCoR,EAAA,CACPzG,EACAmC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACT9M,EACA,CACF,EAEF,MACF,IAAK,IAED6W,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpBnH,EAAA,CACP,IACAoG,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAESoR,EAAA,CACPzG,EACA6M,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAEF,MACF,IAAK,IACCsY,GAAWC,IAAgB,IACpBnH,EAAA,CAAC,IAAKpR,EAAG,CAAC,EAEVoR,EAAA,CAACzG,EAAamC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG9M,EAAG,CAAC,EAErD,MACF,IAAK,IAED6W,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpBnH,EAAA,CACP,IACAoG,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAESoR,EAAA,CAACzG,EAAa3K,EAAG,CAAC,EAE7B,MACF,IAAK,IACMoR,EAAA,CAAC,IAAKpR,EAAG,CAAC,EACnB,MACF,IAAK,IACMoR,EAAA,CAACzG,EAAa3K,CAAC,EACxB,MACF,IAAK,IACMoR,EAAA,CAACzG,EAAa,CAAC,EACxB,MACF,QACWyG,EAAA,CAACzG,CAA0C,EAAE,OACpDmC,EAAQ,MAAM,EAAG,EAAE,EACnB9M,EACA,CACF,CAAA,CAGG,OAAAoR,CAAA,CACR,EAED,OACE+G,EACIC,EAAa,QAAQ,EACrB,CAACA,EAAa,CAAC,CAAgB,EAAE,OAAOA,EAAa,MAAM,CAAC,EAAE,SAAS,CAE/E,EC3HMI,GAAa5L,GAAsC,CACvD,MAAM6L,EAAY,CAAC,EACf,IAAA/N,EACAgO,EAAK,GACL1Y,EAAI,EACJnB,EAAI,EACJ2O,EAAK,EACLC,EAAK,EACH,MAAA4C,EAAS,CAAE,GAAGW,EAAa,EAEvB,OAAApE,EAAA,QAASsE,GAAQ,CACnB,KAAA,CAACvG,CAAW,EAAIuG,EAChBjE,EAAatC,EAAY,YAAY,EACrCmD,EAAanD,EAAY,YAAY,EACrC4C,EAAa5C,IAAgBmD,EAC7BwC,EAASY,EAAI,MAAM,CAAC,EAEtBjE,IAAe,KACXyL,GAAA,EACL,CAAA1Y,EAAGnB,CAAC,EAAIyR,EACJtQ,GAAAuN,EAAa8C,EAAO,EAAI,EACxBxR,GAAA0O,EAAa8C,EAAO,EAAI,EACxB7C,EAAAxN,EACAyN,EAAA5O,EACL6L,EAAO,CAAE6C,EAAa,CAACN,EAAYO,EAAIC,CAAE,EAAIyD,CAAgB,IAEzDjE,IAAe,KACbjN,EAAAwN,EACA3O,EAAA4O,GACKR,IAAe,KACvB,CAAE,CAAAjN,CAAC,EAAIkR,EACRlR,GAAKuN,EAAa8C,EAAO,EAAyC,GACzDpD,IAAe,KACvB,CAAE,CAAApO,CAAC,EAAIqS,EACRrS,GAAK0O,EAAa8C,EAAO,EAAyC,IAElE,CAACrQ,EAAGnB,CAAC,EAAIqS,EAAI,MAAM,EAAE,EAChBlR,GAAAuN,EAAa8C,EAAO,EAAI,EACxBxR,GAAA0O,EAAa8C,EAAO,EAAI,GAE/B3F,EAAK,KAAKwG,CAAG,GAGfb,EAAO,EAAIrQ,EACXqQ,EAAO,EAAIxR,EACX4Z,EAAUC,CAAE,EAAIhO,CAAA,CACjB,EAEM+N,CACT,ECzDME,GAAgBC,GAAgD,CAChE,IAAAC,EAAS,IAAIC,EACX,KAAA,CAAE,OAAAC,GAAWH,EACb,CAACI,EAASC,CAAO,EAAIF,EACrB,CAAE,UAAAG,GAAcN,EAChB,CAAE,OAAAO,GAAWP,EACb,CAAE,KAAAQ,GAASR,EACX,CAAE,MAAAS,GAAUT,EAIhB,OAAA,MAAM,QAAQM,CAAS,GACvBA,EAAU,QAAU,GACpBA,EAAU,MAAOlZ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACxCkZ,EAAU,KAAMlZ,GAAMA,IAAM,CAAC,EAEpB6Y,EAAAA,EAAO,UAAU,GAAIK,CAAuC,EAC5D,OAAOA,GAAc,UAAY,CAAC,OAAO,MAAMA,CAAS,IACxDL,EAAAA,EAAO,UAAUK,CAAS,IAGjCC,GAAUC,GAAQC,KAEXR,EAAAA,EAAO,UAAUG,EAASC,CAAO,EAIxC,MAAM,QAAQE,CAAM,GACpBA,EAAO,QAAU,GACjBA,EAAO,MAAOnZ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACrCmZ,EAAO,KAAMnZ,GAAMA,IAAM,CAAC,EAEjB6Y,EAAAA,EAAO,OAAO,GAAIM,CAAoC,EACtD,OAAOA,GAAW,UAAY,CAAC,OAAO,MAAMA,CAAM,IAClDN,EAAAA,EAAO,OAAOM,CAAM,GAK7B,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAW,GAAKA,EAAK,MAAOpZ,GACtD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACboZ,EAAK,KAAMpZ,GAAMA,IAAM,CAAC,GAEpB6Y,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,EAClCA,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,GAClC,OAAOO,GAAS,UAAY,CAAC,OAAO,MAAMA,CAAI,IAC9CP,EAAAA,EAAO,MAAMO,CAAI,GAK1B,MAAM,QAAQC,CAAK,GAAKA,EAAM,QAAU,GAAKA,EAAM,MAAOrZ,GACxD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACbqZ,EAAM,KAAMrZ,GAAMA,IAAM,CAAC,EAErB6Y,EAAAA,EAAO,MAAM,GAAIQ,CAAmC,EACpD,OAAOA,GAAU,UAAY,CAAC,OAAO,MAAMA,CAAK,IAChDR,EAAAA,EAAO,MAAMQ,CAAK,GAG7BR,EAASA,EAAO,UAAU,CAACG,EAAS,CAACC,CAAO,GAGvCJ,CACT,EC9DMS,GAAiB,CACrBC,EACAjZ,IACqC,CACjC,IAAAlB,EAAI0Z,EAAU,UAAUxY,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE5C,UAAOlB,EAAE,GAAG,EAAIkB,EACZlB,EAAAma,EAAK,SAASna,CAAC,EAEZ,CAACA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,GAAG,CACpC,EAgBMoa,GAAe,CACnBpa,EACAqa,EACAV,IACe,CACf,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAC9B,CAAC/Y,EAAGnB,EAAGP,CAAC,EAAIgb,GAAela,EAAG,CAACqa,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG,EAAG,CAAC,CAAC,EAE5DE,EAAoB3Z,EAAIgZ,EACxBY,EAAoB/a,EAAIoa,EACxBY,EAAoBvb,EAAIob,EAEvB,MAAA,CAELC,GAAqB,KAAK,IAAID,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEb,EACAY,GAAqB,KAAK,IAAIF,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEZ,CACF,CACF,EChCMa,GAAgB,CACpBlN,EACAgM,IACG,CAEH,IAAI5Y,EAAI,EACJnB,EAAI,EAEJkb,EAAK,EACLC,EAAK,EAEL/S,EAAI,EACJgT,EAAK,EACLtP,EAAc,IAEZ,MAAAD,EAAOiC,EAAgBC,CAAS,EAChCsN,EAAiBtB,GAAa,OAAO,KAAKA,CAAS,EAGzD,GAAI,CAACA,GAAcsB,GAAkB,CAACA,EAAe,OAC5C,OAAAxP,EAAK,MAAM,CAAC,EAIhBkO,EAAU,QACb,OAAO,OAAOA,EAAW,CAAE,OAAQrO,EAAe,OAAQ,EAE5D,MAAMwO,EAASH,EAAU,OACnBuB,EAAiBxB,GAAaC,CAAkC,EAEtE,OAAIuB,EAAe,WAAmBzP,EAAK,MAAM,CAAC,EAE3C0C,EAAuB1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAChE,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEhB,IAAIE,EAASnE,IAAe,IAEvB,CAAC,GAAsB,EAAE,OAC1BgB,GACElB,EACAC,EACAmF,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,CAAA,CACnB,EAEAlF,IAAe,IACd,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAGJxH,EAAcyG,EAAO,CAAC,EACtB,MAAMgJ,EAAYzP,IAAgB,KAAOyG,EAAO,OAAS,EACnDiJ,EACHD,EAAYhJ,EAAO,MAAM,EAAG,CAAC,EAAIA,EAAO,MAAM,CAAC,EAalD,GAXIgJ,IACG1P,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAAkC,EAAE,OACnCoG,EAAO,MAAM,CAAC,CAAA,CAElB,EACSA,EAAAiJ,GAGP1P,IAAgB,IAClB,CAACoP,EAAIC,CAAE,EAAIR,GAAaW,EAAgB,CACrC/I,EAAoB,CAAC,EACrBA,EAAoB,CAAC,GACrB2H,CAAM,EAGL/Y,IAAM+Z,GAAMlb,IAAMmb,EACX5I,EAAA,CAAC,IAAK2I,EAAIC,CAAE,EACZnb,IAAMmb,EACN5I,EAAA,CAAC,IAAK2I,CAAE,EACR/Z,IAAM+Z,IACN3I,EAAA,CAAC,IAAK4I,CAAE,OAGd,KAAA/S,EAAI,EAAGgT,EAAK7I,EAAO,OAAQnK,EAAIgT,EAAIhT,GAAK,EAC1C,CAAA8S,EAAIC,CAAE,EAAIR,GACTW,EACA,CAAC,CAAC/I,EAAOnK,CAAC,EAAG,CAACmK,EAAOnK,EAAI,CAAC,CAAC,EAC3B8R,CACF,EACA3H,EAAOnK,CAAC,EAAI8S,EACL3I,EAAAnK,EAAI,CAAC,EAAI+S,EAIhB,OAAAha,EAAA+Z,EACAlb,EAAAmb,EAEG5I,CAAA,CACR,CACH,EC/HMkJ,GAAgB5P,GAAqB,CACzC,MAAM6P,EAAe7P,EAClB,MAAM,CAAC,EACP,IAAI,CAAC1K,EAAGhB,EAAGwb,IACTxb,EAEGwb,EAAUxb,EAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAOgB,EAAE,MAAM,CAAC,CAAC,EAD5C0K,EAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO1K,EAAE,MAAM,CAAC,CAAa,CACF,EAEjD,IAAKA,GAAMA,EAAE,IAAI,CAAC4S,EAAG5T,IAAMgB,EAAEA,EAAE,OAAShB,EAAI,GAAK,EAAKA,EAAI,EAAG,CAAC,CAAC,EAC/D,QAAQ,EAEX,MAAO,CAAC,CAAC,GAA2B,EAAE,OAAOub,EAAa,CAAC,EAAE,MAAM,EAAG,CAAC,CAAC,CAAC,EACtE,OACCA,EAAa,IAAKva,GAAM,CAAC,GAA2B,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,CAC1E,CACJ,ECXMya,GAAY,CAAC/P,EAAiB4G,IAAiC,CAC/D,GAAA,CAAE,MAAAjH,GAAUE,EAWhB,OATAF,EAAQiH,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOjH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAGrCA,IAAU,MAAcK,EAAK,MAAM,CAAC,EAEjC0C,EAAqB1C,EAAOoC,GAC1BsK,GAAatK,EAASzC,CAAK,CACnC,CACH,ECpBMqQ,GAAa,CACjBC,EACAC,EAAQ,KACyB,CACjC,MAAMja,EAAIia,EACJC,EAAKF,EAAI,MAAM,EAAG,CAAC,EACnBrU,EAAKqU,EAAI,MAAM,EAAG,CAAC,EACnBpU,EAAKoU,EAAI,MAAM,EAAG,CAAC,EACnBlU,EAAKkU,EAAI,MAAM,EAAG,CAAC,EACnBnU,EAAK9F,EAASma,EAAIvU,EAAI3F,CAAC,EACvBma,EAAKpa,EAAS4F,EAAIC,EAAI5F,CAAC,EACvBoa,EAAKra,EAAS6F,EAAIE,EAAI9F,CAAC,EACvBqa,EAAKta,EAAS8F,EAAIsU,EAAIna,CAAC,EACvBsa,EAAKva,EAASoa,EAAIC,EAAIpa,CAAC,EACvBua,EAAKxa,EAASsa,EAAIC,EAAIta,CAAC,EAEtB,MAAA,CACL,CAAC,IAAK6F,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGwU,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,EAC9C,CAAC,IAAKD,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGF,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGtU,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAChD,CACF,EC6DA,MAAM0U,EAAiB,CAWrB,YAAYlQ,EAAmBmL,EAA2B,CAClD,MAAAgF,EAAkBhF,GAAU,CAAC,EAC7BiF,EAAY,OAAOpQ,EAAc,IAEnC,GAAAoQ,GAAa,CAACpQ,EAAU,OACpB,MAAA,UACJ,GAAGH,CAAK,oBAAoBuQ,EAAY,YAAc,OAAO,EAC/D,EAGG,KAAA,SAAW1O,EAAgB1B,CAAS,EAGzC,KAAM,CAAE,MAAOqG,EAAa,OAAQgK,CAAiB,EAAAF,EACjD,IAAA/Q,EAEA,OAAO,UAAUiH,CAAW,GAAKA,IAAgB,MAC3CjH,EAAAiH,EAERjH,EAAQE,EAAe,MAKzB,IAAIwO,EAASxO,EAAe,OAE5B,GAAI,MAAM,QAAQ+Q,CAAY,GAAKA,EAAa,QAAU,EAAG,CAC3D,KAAM,CAACtC,EAASC,EAASS,CAAO,EAAI4B,EAAa,IAAI,MAAM,EAClDvC,EAAA,CACN,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMS,CAAO,EAAc,EAAVA,CAC3B,CAAA,CAGF,YAAK,MAAQrP,EACb,KAAK,OAAS0O,EAEP,IAAA,CAET,IAAI,MAAO,CACF,OAAAvH,GAAY,KAAK,QAAQ,CAAA,CAElC,IAAI,QAAS,CACJ,OAAAgB,EAAe,KAAK,QAAQ,CAAA,CASrC,SAAU,CACR,OAAO,KAAK,IAAA,CASd,gBAAiB,CACf,OAAO,KAAK,MAAA,CAWd,iBAAiB/Q,EAAgB,CACxB,OAAAoR,GAAiB,KAAK,SAAUpR,CAAM,CAAA,CAQ/C,YAAa,CACL,KAAA,CAAE,SAAA0K,GAAa,KAChB,YAAA,SAAWyB,GAAezB,CAAQ,EAChC,IAAA,CAQT,YAAa,CACL,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAW6B,GAAe7B,CAAQ,EAChC,IAAA,CAST,SAAU,CACF,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAW8E,GAAY9E,CAAQ,EAC7B,IAAA,CAST,QAAQoP,EAAuB,CACvB,KAAA,CAAE,SAAApP,GAAa,KACfqP,EAAQhD,GAAUrM,CAAQ,EAC1BsP,EAAUD,EAAM,OAAS,EAAIA,EAAQ,GAErCE,EAAoBD,EACtBA,EAAQ,IAAI,CAACzb,EAAGhB,IACVuc,EACKvc,EAAI+Y,GAAY/X,CAAC,EAAIA,EAAE,MAAM,CAAC,EAEhC+X,GAAY/X,CAAC,CACrB,EACDmM,EAAS,MAAM,CAAC,EAEpB,IAAIzB,EAAO,CAAC,EACZ,OAAI+Q,EACK/Q,EAAAgR,EAAkB,KAAK,CAAC,EAExBhR,EAAA6Q,EAAcpP,EAAW4L,GAAY5L,CAAQ,EAGjD,KAAA,SAAWzB,EAAK,MAAM,CAAC,EACrB,IAAA,CAUT,WAAY,CACJ,KAAA,CAAE,SAAAyB,GAAa,KAChB,YAAA,SAAWwG,GAAcxG,CAAQ,EAC/B,IAAA,CAWT,UAAW,CACH,KAAA,CAAE,SAAAA,GAAa,KACf9B,EAAQ,KAAK,QAAU,MAAQ,EAAI,KAAK,MAEzC,YAAA,SAAWgN,GAAalL,EAAU9B,CAAK,EACrC,IAAA,CAWT,UAAUsR,EAAmC,CAEzC,GAAA,CAACA,GACD,OAAOA,GAAW,UACjB,OAAOA,GAAW,UACjB,CAAC,CAAC,YAAa,SAAU,OAAQ,OAAO,EAAE,KAAM3b,GAAMA,KAAK2b,CAAM,EAE5D,OAAA,KAGH,KAAA,CACJ,SAAAxP,EACA,OAAQ,CAAC3J,EAAIC,EAAImZ,CAAE,CAAA,EACjB,KACEhD,EAAY,CAAC,EACnB,SAAW,CAACxY,EAAGE,CAAC,IAAK,OAAO,QAAQqb,CAAM,EAEpCvb,IAAM,QAAU,MAAM,QAAQE,CAAC,IAGhCF,IAAM,UACLA,IAAM,aACNA,IAAM,UACNA,IAAM,UACR,MAAM,QAAQE,CAAC,EANfsY,EAAUxY,CAAC,EAAIE,EAAE,IAAI,MAAM,EASlBF,IAAM,UAAY,OAAO,OAAOE,CAAC,GAAM,WACtCsY,EAAAxY,CAAC,EAAI,OAAOE,CAAC,GAMrB,KAAA,CAAE,OAAAyY,GAAWH,EAEnB,GAAI,MAAM,QAAQG,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAAO,IAAI,MAAM,EACrDH,EAAU,OAAS,CAChB,OAAO,MAAMI,CAAO,EAAcxW,EAAVwW,EACxB,OAAO,MAAMC,CAAO,EAAcxW,EAAVwW,EACzBS,GAAWkC,CACb,CAAA,MAEAhD,EAAU,OAAS,CAACpW,EAAIC,EAAImZ,CAAE,EAG3B,YAAA,SAAW9B,GAAc3N,EAAUyM,CAAS,EAC1C,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAApW,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,EAAG,IAAK,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAAD,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,IAAK,EAAG,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAUT,UAAW,CACT,OAAO4O,GAAa,KAAK,SAAU,KAAK,KAAK,CAAA,CAS/C,SAAU,CACD,OAAA,KAAK,IAAI,EAAE,QAASwK,GAAQ,OAAO,KAAKA,CAAwB,CAAC,CAAA,CAG1E,WAAW,WAAY,CACd,OAAA/C,CAAA,CAET,WAAW,UAAW,CACb,OAAApS,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiC,EAAA,CAGT,WAAW,YAAa,CACf,OAAAc,EAAA,CAET,WAAW,WAAY,CACd,OAAA5H,EAAA,CAET,WAAW,cAAe,CACjB,OAAAkI,EAAA,CAET,WAAW,WAAY,CACd,OAAAD,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAA8D,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAI,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiD,EAAA,CAET,WAAW,cAAe,CACjB,OAAAI,EAAA,CAET,WAAW,oBAAqB,CACvB,OAAArQ,EAAA,CAET,WAAW,UAAW,CACb,OAAAN,CAAA,CAET,WAAW,cAAe,CACjB,OAAAwJ,EAAA,CAET,WAAW,SAAU,CACZ,OAAAE,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAuC,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAlC,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAW,CAAA,CAET,WAAW,cAAe,CACjB,OAAAY,EAAA,CAET,WAAW,SAAU,CACZ,OAAAb,CAAA,CAET,WAAW,cAAe,CACjB,OAAAY,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAE,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAH,EAAA,CAET,WAAW,SAAU,CACZ,OAAAF,EAAA,CAET,WAAW,aAAc,CAChB,OAAApB,CAAA,CAET,WAAW,cAAe,CACjB,OAAAwG,EAAA,CAET,WAAW,YAAa,CACf,OAAA8K,EAAA,CAET,WAAW,UAAW,CACb,OAAA/Q,EAAA,CAET,WAAW,WAAY,CACd,OAAAM,EAAA,CAET,WAAW,aAAc,CAChB,OAAAa,EAAA,CAET,WAAW,YAAa,CACf,OAAAL,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAkQ,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAA1H,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAG,EAAA,CAET,WAAW,aAAc,CAChB,OAAAD,EAAA,CAET,WAAW,aAAc,CAChB,OAAA/C,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAqB,EAAA,CAET,WAAW,uBAAwB,CAC1B,OAAAG,EAAA,CAET,WAAW,sBAAuB,CACzB,OAAAK,EAAA,CAET,WAAW,oBAAqB,CACvB,OAAAoB,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAC,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAlC,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAqC,EAAA,CAET,WAAW,cAAe,CACjB,OAAAG,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAF,EAAA,CAET,WAAW,aAAc,CAChB,OAAAH,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAAM,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiB,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAR,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAhJ,EAAA,CAET,WAAW,YAAa,CACf,OAAAoB,EAAA,CAET,WAAW,cAAe,CACjB,OAAA0K,EAAA,CAET,WAAW,SAAU,CACZ,OAAAvL,CAAA,CAET,WAAW,aAAc,CAChB,OAAA+C,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAwC,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAhC,EAAA,CAET,WAAW,cAAe,CACjB,OAAA0G,EAAA,CAET,WAAW,cAAe,CACjB,OAAAmC,EAAA,CAET,WAAW,aAAc,CAChB,OAAA1J,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAjC,EAAA,CAET,WAAW,cAAe,CACjB,OAAAyM,EAAA,CAET,WAAW,aAAc,CAChB,OAAAvC,EAAA,CAET,WAAW,WAAY,CACd,OAAA0C,EAAA,CAET,WAAW,cAAe,CACjB,OAAArD,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAhH,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAwG,EAAA,CAET,WAAW,YAAa,CACf,OAAA8D,EAAA,CAET,WAAW,WAAY,CACd,OAAAlC,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAsB,EAAA,CAEX","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index 75e0ac7..1b60c3e 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} +{"version":3,"sources":["../src/main.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index 25dfda5..836b407 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"6CAAA,IAAIA,GAAI,OAAO,eACXC,GAAI,CAACC,EAAG,EAAGC,IAAM,KAAKD,EAAIF,GAAEE,EAAG,EAAG,CAAE,WAAY,GAAI,aAAc,GAAI,SAAU,GAAI,MAAOC,CAAC,CAAE,EAAID,EAAE,CAAC,EAAIC,EACzGC,EAAI,CAACF,EAAG,EAAGC,IAAMF,GAAEC,EAAG,OAAO,GAAK,SAAW,EAAI,GAAK,EAAGC,CAAC,EAC9D,MAAME,GAAI,CACR,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,KAAM,GACN,WAAY,EACd,EAAGC,GAAKJ,IAAOA,aAAa,cAAgBA,aAAa,cAAgB,MAAM,QAAQA,CAAC,GAAKA,EAAE,MAAO,GAAM,OAAO,GAAK,QAAQ,IAAM,CAAC,EAAG,EAAE,EAAE,KAAM,GAAMA,EAAE,SAAW,CAAC,EAAGK,GAAKL,GAAMA,aAAa,WAAaA,aAAaM,GAAK,OAAON,GAAK,UAAY,OAAO,KAAKG,EAAC,EAAE,MAAO,GAAMH,GAAK,KAAKA,CAAC,EAAGO,GAAKP,GAAM,CAC7S,MAAM,EAAI,IAAIM,EAAKL,EAAI,MAAM,KAAKD,CAAC,EACnC,GAAI,CAACI,GAAEH,CAAC,EACN,MAAM,UACJ,eAAeA,EAAE,KAAK,GAAG,CAAC,uCAC3B,EAEH,GAAIA,EAAE,SAAW,GAAI,CACnB,KAAM,CACJO,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACN,EAAQrB,EACJ,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMV,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMI,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAM,EAAG,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMV,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMV,EAAG,EAAE,IAAMI,EAAG,EAAE,IAAMG,EAAG,EAAE,IAAMI,CACvO,SAAarB,EAAE,SAAW,EAAG,CACzB,KAAM,CAACO,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,EAAIZ,EAC3B,EAAE,IAAMO,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,EAAG,EAAE,IAAMC,EAAG,EAAE,EAAIA,CACzH,CACE,OAAO,CACT,EAAGU,GAAKvB,GAAM,CACZ,GAAIK,GAAEL,CAAC,EACL,OAAOO,GAAE,CACPP,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACR,CAAK,EACH,MAAM,UACJ,eAAe,KAAK,UAAUA,CAAC,CAAC,4DACjC,CACH,EAAGwB,GAAKxB,GAAM,CACZ,GAAI,OAAOA,GAAK,SACd,MAAM,UAAU,eAAe,KAAK,UAAUA,CAAC,CAAC,oBAAoB,EACtE,MAAM,EAAI,OAAOA,CAAC,EAAE,QAAQ,MAAO,EAAE,EACrC,IAAIC,EAAI,IAAIK,EACZ,MAAME,EAAI,wCAAwCR,CAAC,IACnD,OAAO,EAAE,MAAM,GAAG,EAAE,OAAQS,GAAMA,CAAC,EAAE,QAASA,GAAM,CAClD,KAAM,CAACC,EAAGC,CAAC,EAAIF,EAAE,MAAM,GAAG,EAC1B,GAAI,CAACE,EAAG,MAAM,UAAUH,CAAC,EACzB,MAAMI,EAAID,EAAE,MAAM,GAAG,EAAE,IACpBO,GAAMA,EAAE,SAAS,KAAK,EAAI,WAAWA,CAAC,GAAK,IAAM,KAAK,IAAM,WAAWA,CAAC,CAC/E,EAAO,CAACL,EAAGC,EAAGC,EAAGC,CAAC,EAAIJ,EAAG,EAAI,CAACC,EAAGC,EAAGC,CAAC,EAAGE,EAAI,CAACJ,EAAGC,EAAGC,EAAGC,CAAC,EACnD,GAAIN,IAAM,eAAiBG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC9DjB,EAAE,IAAM,GAAKY,UACNH,EAAE,SAAS,QAAQ,GAAK,CAAC,EAAG,EAAE,EAAE,SAASE,EAAE,MAAM,GAAKA,EAAE,MAAOM,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAAG,CAChG,MAAMA,EAAIN,EAAE,IAAKO,GAAM,KAAK,IAAIA,CAAC,EAAI,KAAO,EAAIA,CAAC,EACjDlB,EAAIA,EAAE,SAASM,GAAEW,CAAC,CAAC,CACpB,SAAUR,IAAM,eAAiB,EAAE,MAAOQ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAChEjB,EAAIA,EAAE,UAAUY,EAAGC,EAAGC,CAAC,UAChBL,IAAM,aAAeG,GAAKE,IAAM,OACvCd,EAAIA,EAAE,UAAUY,EAAGC,GAAK,EAAG,CAAC,UACrBJ,IAAM,YAAcO,EAAE,MAAOC,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAKF,EAChEf,EAAIA,EAAE,gBAAgBY,EAAGC,EAAGC,EAAGC,CAAC,UACzBN,IAAM,UAAYG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC9DjB,EAAIA,EAAE,OAAO,EAAG,EAAGY,CAAC,UACbH,IAAM,WAAa,EAAE,MAAOQ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAK,EAAE,KAAMA,GAAMA,IAAM,CAAC,EACpFjB,EAAIA,EAAE,MAAMY,EAAGC,EAAGC,CAAC,UAInBL,IAAM,SAAW,CAAC,OAAO,MAAMG,CAAC,IAAMA,IAAM,GAAKC,IAAM,IAAMC,IAAM,OACnE,CACA,MAAMI,EAAI,OAAO,MAAM,CAACL,CAAC,EAAID,EAAIC,EACjCb,EAAIA,EAAE,MAAMY,EAAGM,EAAG,CAAC,CACpB,SAAUT,IAAM,SAAWG,GAAK,CAAC,OAAO,MAAMA,CAAC,GAAKC,IAAMC,IAAM,OAC/Dd,EAAIA,EAAE,KAAKY,EAAGC,GAAK,CAAC,UACb,CAAC,YAAa,SAAU,QAAS,MAAM,EAAE,KAC/CI,GAAMR,EAAE,SAASQ,CAAC,CACpB,GAAI,QAAQ,KAAKR,CAAC,GAAKG,GAAK,CAACC,EAAGC,CAAC,EAAE,MAAOG,GAAMA,IAAM,MAAM,EAC3D,GAAIR,IAAM,SAAWA,IAAM,QACzBT,EAAIA,EAAES,CAAC,EAAEG,CAAC,MACP,CACH,MAAMK,EAAIR,EAAE,QAAQ,QAAS,EAAE,EAAGS,EAAIT,EAAE,QAAQQ,EAAG,EAAE,EAAGE,EAAI,CAAC,IAAK,IAAK,GAAG,EAAE,QAAQD,CAAC,EAAGE,EAAIH,IAAM,QAAU,EAAI,EAAGI,EAAI,CACrHF,IAAM,EAAIP,EAAIQ,EACdD,IAAM,EAAIP,EAAIQ,EACdD,IAAM,EAAIP,EAAIQ,CACf,EACDpB,EAAIA,EAAEiB,CAAC,EAAE,GAAGI,CAAC,CACrB,KAEM,OAAM,UAAUd,CAAC,CACpB,CAAA,EAAGP,CACN,EAAGwB,GAAI,CAACzB,EAAG,IAAM,EAAI,CAACA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAI,CACpDA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACJ,EAAG0B,GAAI,CAAC1B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EACd,OAAOE,EAAE,IAAMR,EAAGQ,EAAE,EAAIR,EAAGQ,EAAE,IAAM,EAAGA,EAAE,EAAI,EAAGA,EAAE,IAAMP,EAAGO,CAC5D,EAAGmB,GAAI,CAAC3B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EAAKG,EAAI,KAAK,GAAK,IAAKC,EAAIV,EAAIS,EAAGE,EAAI,EAAIF,EAAGG,EAAIX,EAAIQ,EAAGI,EAAI,KAAK,IAAIH,CAAC,EAAGI,EAAI,CAAC,KAAK,IAAIJ,CAAC,EAAGK,EAAI,KAAK,IAAIJ,CAAC,EAAGK,EAAI,CAAC,KAAK,IAAIL,CAAC,EAAG,EAAI,KAAK,IAAIC,CAAC,EAAGK,EAAI,CAAC,KAAK,IAAIL,CAAC,EAAGM,EAAIH,EAAI,EAAGI,EAAI,CAACJ,EAAIE,EACpMT,EAAE,IAAMU,EAAGV,EAAE,EAAIU,EAAGV,EAAE,IAAMW,EAAGX,EAAE,EAAIW,EAAGX,EAAE,IAAMQ,EAChD,MAAMI,EAAIN,EAAIE,EAAI,EAAIH,EAAII,EAC1BT,EAAE,IAAMY,EAAGZ,EAAE,EAAIY,EACjB,MAAMC,EAAIR,EAAI,EAAIC,EAAIE,EAAIC,EAC1B,OAAOT,EAAE,IAAMa,EAAGb,EAAE,EAAIa,EAAGb,EAAE,IAAM,CAACM,EAAIC,EAAGP,EAAE,IAAMM,EAAIG,EAAIJ,EAAIG,EAAI,EAAGR,EAAE,IAAMM,EAAI,EAAID,EAAIG,EAAIC,EAAGT,EAAE,IAAMK,EAAIE,EAAGP,CAClH,EAAGoB,GAAI,CAAC5B,EAAG,EAAGC,EAAGO,IAAM,CACrB,MAAMC,EAAI,IAAIH,EAAKI,EAAI,KAAK,KAAKV,EAAIA,EAAI,EAAI,EAAIC,EAAIA,CAAC,EACtD,GAAIS,IAAM,EACR,OAAOD,EACT,MAAME,EAAIX,EAAIU,EAAGE,EAAI,EAAIF,EAAGG,EAAIZ,EAAIS,EAAGI,EAAIN,GAAK,KAAK,GAAK,KAAMO,EAAI,KAAK,IAAID,CAAC,EAAGE,EAAI,KAAK,IAAIF,CAAC,EAAG,EAAIC,EAAIA,EAAGE,EAAIN,EAAIA,EAAGO,EAAIN,EAAIA,EAAGO,EAAIN,EAAIA,EAAGO,EAAI,EAAI,GAAKF,EAAIC,GAAK,EACpKV,EAAE,IAAMW,EAAGX,EAAE,EAAIW,EACjB,MAAMC,EAAI,GAAKV,EAAIC,EAAI,EAAIC,EAAIE,EAAIC,GACnCP,EAAE,IAAMY,EAAGZ,EAAE,EAAIY,EAAGZ,EAAE,IAAM,GAAKE,EAAIE,EAAI,EAAID,EAAIG,EAAIC,GACrD,MAAMM,EAAI,GAAKV,EAAID,EAAI,EAAIE,EAAIE,EAAIC,GACnCP,EAAE,IAAMa,EAAGb,EAAE,EAAIa,EACjB,MAAMO,EAAI,EAAI,GAAKV,EAAIF,GAAK,EAC5B,OAAOR,EAAE,IAAMoB,EAAGpB,EAAE,EAAIoB,EAAGpB,EAAE,IAAM,GAAKG,EAAIC,EAAI,EAAIF,EAAII,EAAIC,GAAIP,EAAE,IAAM,GAAKI,EAAIF,EAAI,EAAIC,EAAIG,EAAIC,GAAIP,EAAE,IAAM,GAAKI,EAAID,EAAI,EAAID,EAAII,EAAIC,GAAIP,EAAE,IAAM,EAAI,GAAKQ,EAAIC,GAAK,EAAGT,CACzK,EAAGqB,GAAI,CAAC9B,EAAG,EAAGC,IAAM,CAClB,MAAMO,EAAI,IAAIF,EACd,OAAOE,EAAE,IAAMR,EAAGQ,EAAE,EAAIR,EAAGQ,EAAE,IAAM,EAAGA,EAAE,EAAI,EAAGA,EAAE,IAAMP,EAAGO,CAC5D,EAAGuB,GAAI,CAAC/B,EAAG,IAAM,CACf,MAAMC,EAAI,IAAIK,EACd,GAAIN,EAAG,CACL,MAAMQ,EAAIR,EAAI,KAAK,GAAK,IAAKS,EAAI,KAAK,IAAID,CAAC,EAC3CP,EAAE,IAAMQ,EAAGR,EAAE,EAAIQ,CACrB,CACE,GAAI,EAAG,CACL,MAAMD,EAAI,EAAI,KAAK,GAAK,IAAKC,EAAI,KAAK,IAAID,CAAC,EAC3CP,EAAE,IAAMQ,EAAGR,EAAE,EAAIQ,CACrB,CACE,OAAOR,CACT,EAAG+B,GAAKhC,GAAM+B,GAAE/B,EAAG,CAAC,EAAGiC,GAAKjC,GAAM+B,GAAE,EAAG/B,CAAC,EAAGkC,EAAI,CAAClC,EAAG,IAAM,CACvD,MAAMC,EAAI,EAAE,IAAMD,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKQ,EAAI,EAAE,IAAMR,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKS,EAAI,EAAE,IAAMT,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKU,EAAI,EAAE,IAAMV,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKW,EAAI,EAAE,IAAMX,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKY,EAAI,EAAE,IAAMZ,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKa,EAAI,EAAE,IAAMb,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKc,EAAI,EAAE,IAAMd,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKe,EAAI,EAAE,IAAMf,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKgB,EAAI,EAAE,IAAMhB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAK,EAAI,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKiB,EAAI,EAAE,IAAMjB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKkB,EAAI,EAAE,IAAMlB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKmB,EAAI,EAAE,IAAMnB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKoB,EAAI,EAAE,IAAMpB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAKqB,EAAI,EAAE,IAAMrB,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,IACjjC,OAAOO,GAAE,CACPN,EACAO,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA,EACAC,EACAC,EACAC,EACAC,EACAC,CACJ,CAAG,CACH,EACA,MAAMf,CAAE,CAQN,YAAY,EAAG,CACb,OAAO,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,EAAI,KAAK,eAAe,CAAC,EAAI,IAChV,CAQE,IAAI,YAAa,CACf,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CACtS,CAOE,IAAI,MAAO,CACT,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CAClH,CAeE,eAAe,EAAG,CAChB,OAAO,OAAO,GAAK,UAAY,EAAE,QAAU,IAAM,OAASkB,GAAE,CAAC,EAAI,MAAM,QAAQ,CAAC,GAAK,aAAa,cAAgB,aAAa,aAAejB,GAAE,CAAC,EAAI,OAAO,GAAK,SAAWgB,GAAE,CAAC,EAAI,IACvL,CASE,eAAe,EAAG,CAChB,OAAO,aAAa,KAAKE,GAAE,KAAM,CAAC,CAAC,CACvC,CASE,eAAe,EAAG,CAChB,OAAO,aAAa,KAAKA,GAAE,KAAM,CAAC,CAAC,CACvC,CAUE,UAAW,CACT,KAAM,CAAE,KAAM,CAAG,EAAG,KAAMxB,EAAI,KAAK,eAAe,CAAC,EAAE,KAAK,IAAI,EAC9D,MAAO,GAAG,EAAI,SAAW,UAAU,IAAIA,CAAC,GAC5C,CAWE,QAAS,CACP,KAAM,CAAE,KAAM,EAAG,WAAYA,CAAG,EAAG,KACnC,MAAO,CAAE,GAAG,KAAM,KAAM,EAAG,WAAYA,CAAG,CAC9C,CASE,SAAS,EAAG,CACV,OAAOiC,EAAE,KAAM,CAAC,CACpB,CAYE,UAAU,EAAGjC,EAAGO,EAAG,CACjB,MAAMC,EAAI,EACV,IAAIC,EAAIT,EAAGU,EAAIH,EACf,OAAO,OAAOE,EAAI,MAAQA,EAAI,GAAI,OAAOC,EAAI,MAAQA,EAAI,GAAIuB,EAAE,KAAMR,GAAEjB,EAAGC,EAAGC,CAAC,CAAC,CACnF,CAYE,MAAM,EAAGV,EAAGO,EAAG,CACb,MAAMC,EAAI,EACV,IAAIC,EAAIT,EAAGU,EAAIH,EACf,OAAO,OAAOE,EAAI,MAAQA,EAAI,GAAI,OAAOC,EAAI,MAAQA,EAAI,GAAIuB,EAAE,KAAMJ,GAAErB,EAAGC,EAAGC,CAAC,CAAC,CACnF,CAaE,OAAO,EAAGV,EAAGO,EAAG,CACd,IAAIC,EAAI,EAAGC,EAAIT,GAAK,EAAGU,EAAIH,GAAK,EAChC,OAAO,OAAO,GAAK,UAAY,OAAOP,EAAI,KAAO,OAAOO,EAAI,MAAQG,EAAIF,EAAGA,EAAI,EAAGC,EAAI,GAAIwB,EAAE,KAAMP,GAAElB,EAAGC,EAAGC,CAAC,CAAC,CAChH,CAaE,gBAAgB,EAAGV,EAAGO,EAAGC,EAAG,CAC1B,GAAI,CAAC,EAAGR,EAAGO,EAAGC,CAAC,EAAE,KAAMC,GAAM,OAAO,MAAM,CAACA,CAAC,CAAC,EAC3C,MAAM,IAAI,UAAU,+BAA+B,EACrD,OAAOwB,EAAE,KAAMN,GAAE,EAAG3B,EAAGO,EAAGC,CAAC,CAAC,CAChC,CAQE,MAAM,EAAG,CACP,OAAOyB,EAAE,KAAMF,GAAE,CAAC,CAAC,CACvB,CAQE,MAAM,EAAG,CACP,OAAOE,EAAE,KAAMD,GAAE,CAAC,CAAC,CACvB,CASE,KAAK,EAAGhC,EAAG,CACT,OAAOiC,EAAE,KAAMH,GAAE,EAAG9B,CAAC,CAAC,CAC1B,CAYE,eAAe,EAAG,CAChB,MAAMA,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGO,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGC,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAGC,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAAI,KAAK,IAAM,EAAE,EAC/R,OAAO,aAAa,SAAW,IAAI,SAAST,EAAGO,EAAGC,EAAGC,CAAC,EAAI,CACxD,EAAGT,EACH,EAAGO,EACH,EAAGC,EACH,EAAGC,CACJ,CACL,CACA,CACAR,EAAEI,EAAG,YAAaoB,EAAC,EAAGxB,EAAEI,EAAG,SAAUqB,EAAC,EAAGzB,EAAEI,EAAG,kBAAmBsB,EAAC,EAAG1B,EAAEI,EAAG,QAASwB,EAAC,EAAG5B,EAAEI,EAAG,QAAS0B,EAAC,EAAG9B,EAAEI,EAAG,QAAS2B,EAAC,EAAG/B,EAAEI,EAAG,OAAQyB,EAAC,EAAG7B,EAAEI,EAAG,WAAY4B,CAAC,EAAGhC,EAAEI,EAAG,YAAaC,EAAC,EAAGL,EAAEI,EAAG,aAAciB,EAAC,EAAGrB,EAAEI,EAAG,aAAckB,EAAC,EAAGtB,EAAEI,EAAG,UAAWmB,EAAC,EAAGvB,EAAEI,EAAG,oBAAqBF,EAAC,EAAGF,EAAEI,EAAG,qBAAsBD,EAAC,ECtanT,MAAM8B,EAAW,CAACxB,EAAeW,EAAec,IAA0B,CAClE,KAAA,CAACC,EAAIC,CAAE,EAAI3B,EACX,CAAC4B,EAAIC,CAAE,EAAIlB,EACV,MAAA,CAACe,GAAME,EAAKF,GAAMD,EAAGE,GAAME,EAAKF,GAAMF,CAAC,CAChD,ECLMK,GAAqB,CAAC9B,EAAeW,IAClC,KAAK,MACTX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,IAAMX,EAAE,CAAC,EAAIW,EAAE,CAAC,EAC7D,ECDIoB,GAAgB,CAACC,EAAYC,EAAYC,EAAYC,IAClDL,GAAmB,CAACE,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EAaxCC,GAAuB,CAC3BJ,EACAC,EACAC,EACAC,EACAE,IACG,CACH,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAGvB,GAAA,OAAOI,GAAa,SAAU,CAC1B,MAAAE,EAAST,GAAmB,CAACE,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EACpD,GAAIE,GAAY,EACdC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,UACdI,GAAYE,EACrBD,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,MAClB,CACL,KAAM,CAACrB,EAAGnB,CAAC,EAAI6B,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAGE,EAAWE,CAAM,EACrDD,EAAA,CAAE,EAAAxB,EAAG,EAAAnB,CAAE,CAAA,CACjB,CAEK,OAAA2C,CACT,EAYME,GAAc,CAACR,EAAYC,EAAYC,EAAYC,IAAe,CAChE,KAAA,CAAE,IAAAM,EAAK,IAAAC,CAAA,EAAQ,KAErB,MAAO,CAACD,EAAIT,EAAIE,CAAE,EAAGO,EAAIR,EAAIE,CAAE,EAAGO,EAAIV,EAAIE,CAAE,EAAGQ,EAAIT,EAAIE,CAAE,CAAC,CAM5D,EAEMQ,GAAY,CAChB,YAAAH,GACA,cAAAT,GACA,qBAAAK,EACF,ECjEMQ,GAAY,CAACC,EAAYC,EAAYC,IAAkB,CAC3D,MAAMC,EAAYD,EAAQ,EACpBE,EAAe,KAAK,IAAID,CAAS,EACjCE,EAAe,KAAK,IAAIF,CAAS,EACjCG,EAAQN,GAAM,EAAII,GAAgB,EAClCG,EAAQN,GAAM,EAAII,GAAgB,EAClCX,EAAS,KAAK,KAAKY,EAAQC,CAAK,EAAIL,EACnC,OAAA,KAAK,IAAIR,CAAM,CACxB,EAYMc,EAAW,CACfC,EACAC,EACAV,EACAC,EACAU,EACAT,IACG,CACG,KAAA,CAAE,IAAAU,EAAK,IAAAC,CAAA,EAAQ,KAGfC,EAAOD,EAAIF,CAAK,EAChBI,EAAOH,EAAID,CAAK,EAChB1C,EAAI+B,EAAKa,EAAIX,CAAK,EAClBpD,EAAImD,EAAKW,EAAIV,CAAK,EAEjB,MAAA,CAACO,EAAKK,EAAO7C,EAAI8C,EAAOjE,EAAG4D,EAAKK,EAAO9C,EAAI6C,EAAOhE,CAAC,CAC5D,EAQMkE,GAAe,CAACC,EAAWC,IAAc,CAC7C,KAAM,CAAE,EAAGC,EAAK,EAAGC,CAAQ,EAAAH,EACrB,CAAE,EAAGI,EAAK,EAAGC,CAAQ,EAAAJ,EACrBxE,EAAIyE,EAAME,EAAMD,EAAME,EACtBtE,EAAI,KAAK,MAAMmE,GAAO,EAAIC,GAAO,IAAMC,GAAO,EAAIC,GAAO,EAAE,EAEjE,OADaH,EAAMG,EAAMF,EAAMC,EAAM,EAAI,GAAK,GAChC,KAAK,KAAK3E,EAAIM,CAAC,CAC/B,EAiBMuE,GAAc,CAClBpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,IAAA+E,EAAK,IAAAjB,EAAK,IAAAC,EAAK,KAAAiB,EAAM,GAAAC,GAAO,KAChC,IAAA/B,EAAK6B,EAAIL,CAAE,EACXvB,EAAK4B,EAAIJ,CAAE,EAET,MAAAO,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KAGzB,GAAA5C,IAAOlB,GAAKmB,IAAOtC,EACd,MAAA,CACL,GAAAkD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,EAAAhC,EAAG,EAAAnB,CAAE,CACjB,EAGE,GAAAkD,IAAO,GAAKC,IAAO,EACd,MAAA,CACL,GAAAD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,GAAIhC,EAAIkB,GAAM,EAAG,GAAIrC,EAAIsC,GAAM,CAAE,CAC7C,EAGI,MAAA6C,GAAM9C,EAAKlB,GAAK,EAChBiE,GAAM9C,EAAKtC,GAAK,EAEhBqF,EAAmB,CACvB,EAAGtB,EAAImB,CAAO,EAAIC,EAAKrB,EAAIoB,CAAO,EAAIE,EACtC,EAAG,CAACtB,EAAIoB,CAAO,EAAIC,EAAKpB,EAAImB,CAAO,EAAIE,CACzC,EAEME,EAAaD,EAAiB,GAAK,EAAInC,GAAM,EACjDmC,EAAiB,GAAK,EAAIlC,GAAM,EAE9BmC,EAAa,IACfpC,GAAM8B,EAAKM,CAAU,EACrBnC,GAAM6B,EAAKM,CAAU,GAGvB,MAAMC,EAAmBrC,GAAM,EAAIC,GAAM,EACvCD,GAAM,EAAImC,EAAiB,GAAK,EAAIlC,GAAM,EAAIkC,EAAiB,GAAK,EAChEG,EAAmBtC,GAAM,EAAImC,EAAiB,GAAK,EACvDlC,GAAM,EAAIkC,EAAiB,GAAK,EAElC,IAAII,EAAYF,EAAmBC,EAEvBC,EAAAA,EAAY,EAAI,EAAIA,EAChC,MAAMC,GAASb,IAAQC,EAAK,EAAI,IAAME,EAAKS,CAAS,EAC9CE,EAAoB,CACxB,EAAGD,GAAUxC,EAAKmC,EAAiB,EAAKlC,GACxC,EAAGuC,GAAS,EAAEvC,EAAKkC,EAAiB,GAAKnC,EAC3C,EAEM0C,EAAS,CACb,EAAG7B,EAAImB,CAAO,EAAIS,EAAkB,EAAI7B,EAAIoB,CAAO,EAAIS,EAAkB,GACtEtD,EAAKlB,GAAK,EACb,EAAG2C,EAAIoB,CAAO,EAAIS,EAAkB,EAAI5B,EAAImB,CAAO,EAAIS,EAAkB,GACtErD,EAAKtC,GAAK,CACf,EAEM6F,EAAc,CAClB,GAAIR,EAAiB,EAAIM,EAAkB,GAAKzC,EAChD,GAAImC,EAAiB,EAAIM,EAAkB,GAAKxC,CAClD,EAEM2C,EAAa5B,GAAa,CAAE,EAAG,EAAG,EAAG,GAAK2B,CAAW,EAErDE,EAAY,CAChB,GAAI,CAACV,EAAiB,EAAIM,EAAkB,GAAKzC,EACjD,GAAI,CAACmC,EAAiB,EAAIM,EAAkB,GAAKxC,CACnD,EAEI,IAAA6C,EAAa9B,GAAa2B,EAAaE,CAAS,EAChD,CAACjB,GAAMkB,EAAa,EACtBA,GAAc,EAAIf,EACTH,GAAMkB,EAAa,IAC5BA,GAAc,EAAIf,GAEpBe,GAAc,EAAIf,EAElB,MAAMgB,EAAWH,EAAaE,EAUvB,MAAA,CACL,OAAAJ,EACA,WAAAE,EACA,SAAAG,EACA,GAAA/C,EACA,GAAAC,CACF,CACF,EAeM+C,GAAe,CACnB7D,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,GAAAkD,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,CAAa,EAAAxB,GACvCpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EACA,OAAOiD,GAAUC,EAAIC,EAAI8C,EAAWH,CAAU,CAChD,EAiBMK,GAAsB,CAC1B9D,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,EACA0C,IACG,CACH,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAC3B,KAAM,CAAE,OAAAsD,EAAQ,GAAA1C,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,GAAaxB,GAC/CpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EAGI,GAAA,OAAO0C,GAAa,SAAU,CAChC,MAAME,EAASK,GAAUC,EAAIC,EAAI8C,EAAWH,CAAU,EACtD,GAAIpD,GAAY,EACdC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,UACdI,GAAYE,EACbD,EAAA,CAAE,EAAAxB,EAAG,EAAAnB,CAAE,MACV,CAED,GAAAqC,IAAOlB,GAAKmB,IAAOtC,EACd,MAAA,CAAE,EAAAmB,EAAG,EAAAnB,CAAE,EAGZ,GAAAkD,IAAO,GAAKC,IAAO,EACrB,OAAOV,GAAqBJ,EAAIC,EAAInB,EAAGnB,EAAG0C,CAAQ,EAEpD,KAAM,CAAE,GAAAuC,EAAI,IAAAlB,EAAK,IAAAD,CAAQ,EAAA,KACnBkC,EAAaC,EAAWH,EAExBZ,GADSN,EAAQ,IAAO,KAAO,KACbK,EAAK,KACvBpB,EAAQiC,EAAaE,GAActD,EAAWE,GAC9CwD,EAAoBlD,EAAKa,EAAIF,CAAK,EAClCwC,EAAoBlD,EAAKW,EAAID,CAAK,EAEhClB,EAAA,CACN,EAAGoB,EAAImB,CAAO,EAAIkB,EAAoBtC,EAAIoB,CAAO,EAAImB,EACnDT,EAAO,EACT,EAAG9B,EAAIoB,CAAO,EAAIkB,EAAoBrC,EAAImB,CAAO,EAAImB,EACnDT,EAAO,CACX,CAAA,CACF,CAGK,OAAAjD,CACT,EAmBM2D,GAAa,CACjBjE,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,IACG,CACH,KAAM,CAAE,OAAA4F,EAAQ,GAAA1C,EAAI,GAAAC,EAAI,WAAA2C,EAAY,SAAAG,GAAaxB,GAC/CpC,EACAC,EACAoC,EACAC,EACAC,EACAC,EACAC,EACA3D,EACAnB,CACF,EACMuG,EAAaN,EAAWH,EACxB,CAAE,IAAAhD,EAAK,IAAAC,EAAK,IAAAyD,EAAK,MAAAC,EAAO,GAAAxB,GAAO,KAG/B,CAAEtB,EAAO,EAAGC,CAAO,EAAAgC,EAGnB/B,EAASe,EAAQK,EAAM,IACvByB,EAAUF,EAAI3C,CAAK,EAMnBT,EAAQqD,EAAM,CAACtD,EAAKuD,EAASxD,CAAE,EAC/ByD,EAASvD,EACTwD,EAASxD,EAAQ6B,EACjB4B,EAASJ,EAAMtD,EAAID,EAAKwD,CAAO,EAC/BI,EAASD,EAAS5B,EAClB8B,EAAS,CAAC5F,CAAC,EACX6F,EAAS,CAAChH,CAAC,EAGb,IAAAiH,EAAOnE,EAAIT,EAAIlB,CAAC,EAChB+F,EAAOnE,EAAIV,EAAIlB,CAAC,EAChBgG,EAAOrE,EAAIR,EAAItC,CAAC,EAChBoH,EAAOrE,EAAIT,EAAItC,CAAC,EAGd,MAAAqH,GAAkBpB,EAAWM,EAAa,KAC1Ce,EAAM5D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOwD,EAAe,EAGrDE,EAAiBtB,EAAWM,EAAa,OACzCiB,EAAM9D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO0D,CAAc,EAU1D,GAAID,EAAI,CAAC,EAAIJ,GAAQM,EAAI,CAAC,EAAIN,EAAM,CAElC,MAAMO,EAAK/D,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO8C,CAAM,EAC1CI,EAAA,KAAKU,EAAG,CAAC,CAAC,EACVT,EAAA,KAAKS,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIH,EAAI,CAAC,EAAIL,GAAQO,EAAI,CAAC,EAAIP,EAAM,CAElC,MAAMS,EAAKhE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAO+C,CAAM,EAC1CG,EAAA,KAAKW,EAAG,CAAC,CAAC,EACVV,EAAA,KAAKU,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIJ,EAAI,CAAC,EAAIH,GAAQK,EAAI,CAAC,EAAIL,EAAM,CAElC,MAAMQ,EAAKjE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOiD,CAAM,EAC1CC,EAAA,KAAKY,EAAG,CAAC,CAAC,EACVX,EAAA,KAAKW,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIL,EAAI,CAAC,EAAIF,GAAQI,EAAI,CAAC,EAAIJ,EAAM,CAElC,MAAMQ,EAAKlE,EAASC,EAAIC,EAAIV,EAAIC,EAAIU,EAAOgD,CAAM,EAC1CE,EAAA,KAAKa,EAAG,CAAC,CAAC,EACVZ,EAAA,KAAKY,EAAG,CAAC,CAAC,CAAA,CAGnB,OAAAX,EAAOnE,EAAI,MAAM,CAAA,EAAIiE,CAAM,EAC3BI,EAAOrE,EAAI,MAAM,CAAA,EAAIkE,CAAM,EAC3BE,EAAOnE,EAAI,MAAM,CAAA,EAAIgE,CAAM,EAC3BK,EAAOrE,EAAI,MAAM,CAAA,EAAIiE,CAAM,EAEpB,CAACC,EAAME,EAAMD,EAAME,CAAI,CAChC,EAEMS,GAAW,CACf,aAAA3D,GACA,UAAAjB,GACA,SAAAS,EACA,WAAA4C,GACA,aAAAJ,GACA,YAAAzB,GACA,oBAAA0B,EACF,ECpaM2B,GAAU,CACd,oBACA,mBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,kBACA,iBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,iBACF,EAEMC,GAAU,CACd,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,oBACA,oBACA,kBACA,iBACF,EAMMC,GAAgBC,GAAqC,CACzD,MAAMC,EAAU,CAAC,EACjB,QAAStI,EAAIqI,EAAQpH,EAAIjB,EAAE,OAAQa,EAAII,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAGJ,GAAK,EAAG,CACnE,MAAM0H,EAAO,CAAC,EACd,QAASC,EAAI,EAAGA,EAAI3H,EAAG2H,GAAK,EAC1BD,EAAK,KAAK,CACR,EAAG1H,GAAKb,EAAEwI,EAAI,CAAC,EAAE,EAAIxI,EAAEwI,CAAC,EAAE,GAC1B,EAAG3H,GAAKb,EAAEwI,EAAI,CAAC,EAAE,EAAIxI,EAAEwI,CAAC,EAAE,GAC1B,EAAG,CAAA,CACJ,EAEHF,EAAQ,KAAKC,CAAI,EACbvI,EAAAuI,CAAA,CAEC,OAAAD,CACT,EAMMG,GAAgB,CACpBJ,EACA,IACG,CAGH,GAAI,IAAM,EACD,OAAAA,EAAA,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAGX,MAAAK,EAAQL,EAAO,OAAS,EAG9B,GAAI,IAAM,EACD,OAAAA,EAAAK,CAAK,EAAE,EAAI,EACXL,EAAOK,CAAK,EAGrB,MAAMC,EAAK,EAAI,EACf,IAAI3I,EAAIqI,EASR,GAAIK,IAAU,EACL,OAAAL,EAAA,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAKjB,GAAIK,IAAU,EACL,MAAA,CACL,EAAGC,EAAK3I,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAC1B,EAAG2I,EAAK3I,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAC1B,CACF,EAIF,MAAM4I,EAAMD,EAAKA,EACXE,EAAK,EAAI,EACf,IAAI,EAAI,EACJzH,EAAI,EACJP,EAAI,EACJI,EAAI,EAER,OAAIyH,IAAU,GACZ1I,EAAI,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAE,EAAG,EAAG,EAAG,EAAmB,EACjD,EAAA4I,EACJxH,EAAIuH,EAAK,EAAI,EACT9H,EAAAgI,GACKH,IAAU,IACnB,EAAIE,EAAMD,EACVvH,EAAIwH,EAAM,EAAI,EACd/H,EAAI8H,EAAKE,EAAK,EACd5H,EAAI,EAAI4H,GAEH,CACL,EAAG,EAAI7I,EAAE,CAAC,EAAE,EAAIoB,EAAIpB,EAAE,CAAC,EAAE,EAAIa,EAAIb,EAAE,CAAC,EAAE,EAAIiB,EAAIjB,EAAE,CAAC,EAAE,EACnD,EAAG,EAAIA,EAAE,CAAC,EAAE,EAAIoB,EAAIpB,EAAE,CAAC,EAAE,EAAIa,EAAIb,EAAE,CAAC,EAAE,EAAIiB,EAAIjB,EAAE,CAAC,EAAE,EACnD,CACF,CACF,EAEM8I,GAAkB,CAACC,EAA8B,IAAc,CAC7D,MAAA9H,EAAI8H,EAAa,CAAC,EAClBrI,EAAIO,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAEvB,OAAA,KAAK,KAAKP,CAAC,CACpB,EAEMsI,GAAgBD,GAAiC,CAErD,MAAME,EAAMf,GAAQ,OAEpB,IAAIgB,EAAM,EAEV,QAAS3I,EAAI,EAAG2B,EAAG3B,EAAI0I,EAAK1I,IACtB2B,EAAA,GAAIgG,GAAQ3H,CAAC,EAAI,GACrB2I,GAAOf,GAAQ5H,CAAC,EAAIuI,GAAgBC,EAAc7G,CAAC,EAErD,MAAO,IAAIgH,CACb,EAMMC,GAAmBC,GAA8C,CACrE,MAAMf,EAAS,CAAC,EACP,QAAAgB,EAAM,EAAGJ,EAAMG,EAAM,OAAQE,EAAO,EAAGD,EAAMJ,EAAKI,GAAOC,EAChEjB,EAAO,KAAK,CACV,EAAGe,EAAMC,CAAG,EACZ,EAAGD,EAAMC,EAAM,CAAC,CAAA,CACjB,EAEG,MAAAf,EAAUF,GAAaC,CAAM,EAC5B,OAAAW,GAAc9G,GACZuG,GAAcH,EAAQ,CAAC,EAAGpG,CAAC,CACnC,CACH,EAGMqH,GAAyB,KAOzBC,GAAU,CAAC,CAAChF,EAAIiF,EAAIC,CAAE,IAAgC,CAC1D,MAAMxG,EAAM,KAAK,IAAIsB,EAAIkF,CAAE,EACrBvG,EAAM,KAAK,IAAIqB,EAAIkF,CAAE,EAG3B,GAAID,GAAMjF,EAAKkF,GAAMD,EAAKC,GAAMD,EAEvB,MAAA,CAACvG,EAAKC,CAAG,EAIlB,MAAMjD,GAAKsE,EAAKkF,EAAKD,EAAKA,IAAOjF,EAAK,EAAIiF,EAAKC,GACvC,OAAAxJ,EAAIgD,EAAM,CAAChD,EAAGiD,CAAG,EAAI,CAACD,EAAKhD,CAAC,CACtC,EAOMyJ,GAAU,CAAC,CAACnF,EAAIoF,EAAKC,EAAKH,CAAE,IAAwC,CACxE,MAAMI,EAAItF,EAAK,EAAIoF,EAAM,EAAIC,EAAMH,EAInC,GAAI,KAAK,IAAII,CAAC,EAAIP,GACZ,OAAA/E,IAAOkF,GAAMlF,IAAOoF,EAEf,CAACpF,EAAIkF,CAAE,EAGTF,GAAQ,CAAChF,EAAI,IAAOA,EAAK,IAAMoF,EAAKpF,EAAK,EAAIoF,EAAM,EAAIC,CAAG,CAAC,EAIpE,MAAMnI,EAAI,CAAC8C,EAAKqF,EAAMrF,EAAKkF,EAAKE,EAAMC,EAAMD,EAAMF,EAAKE,EAAMA,EAAMC,EAAMA,EAGzE,GAAInI,GAAK,EACA,MAAA,CAAC,KAAK,IAAI8C,EAAIkF,CAAE,EAAG,KAAK,IAAIlF,EAAIkF,CAAE,CAAC,EAEtC,MAAAK,EAAI,KAAK,KAAKrI,CAAC,EAGrB,IAAIwB,EAAM,KAAK,IAAIsB,EAAIkF,CAAE,EACrBvG,EAAM,KAAK,IAAIqB,EAAIkF,CAAE,EAEnB,MAAAM,EAAIxF,EAAK,EAAIoF,EAAMC,EAEzB,QAAS/H,GAAKkI,EAAID,GAAKD,EAAGvJ,EAAI,EAAGA,GAAK,EAAGuB,GAAKkI,EAAID,GAAKD,EAAGvJ,IAEpD,GAAAuB,EAAI,GAAKA,EAAI,EAAG,CAEZ,MAAAmI,EAAIzF,GAAM,EAAI1C,IAAM,EAAIA,IAAM,EAAIA,GACtC8H,EAAM,GAAK,EAAI9H,IAAM,EAAIA,GAAKA,EAAI+H,EAAM,GAAK,EAAI/H,GAAKA,EAAIA,EAC1D4H,EAAK5H,EAAIA,EAAIA,EACXmI,EAAI/G,IACAA,EAAA+G,GAEJA,EAAI9G,IACAA,EAAA8G,EACR,CAIG,MAAA,CAAC/G,EAAKC,CAAG,CAClB,EACM+G,GAAc,CAClB,aAAAlB,GACA,gBAAAF,GACA,uBAAAS,GACA,cAAAd,GACA,QAAAN,GACA,aAAAC,GACA,gBAAAe,GACA,QAAAQ,GACA,QAAAH,GACA,QAAAtB,EACF,ECjRMiC,GAA+B,CACnC,CAAC1H,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,EACnCV,IACG,CACH,MAAMsI,EAAK,EAAItI,EACR,MAAA,CACL,EAAGsI,GAAM,EAAI/H,EAAK,EAAI+H,GAAM,EAAItI,EAAIkI,EAAM,EAAII,EAAKtI,GAAK,EAAIoI,EAC1DpI,GAAK,EAAIS,EACX,EAAG6H,GAAM,EAAI9H,EAAK,EAAI8H,GAAM,EAAItI,EAAImI,EAAM,EAAIG,EAAKtI,GAAK,EAAIqI,EAC1DrI,GAAK,EAAIU,CACb,CACF,EAeM6H,GAAiB,CACrBhI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IAEOuG,GAAgB,CAAC1G,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,CAAC,EAiBvD8H,GAAwB,CAC5BjI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,EACAE,IACG,CACG,MAAA6H,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAE3B,GAAIiI,EAAkB,CACd,MAAAC,EAAgBzB,GAAgB,CAAC1G,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,CAAC,EACtEE,GAAY,IAELA,GAAY8H,EACrB7H,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,EAEfG,EAAAoH,GACN,CAAC1H,EAAIC,EAAI0H,EAAKC,EAAKC,EAAKC,EAAK5H,EAAIC,CAAE,EACnCE,EAAW8H,CACb,EACF,CAEK,OAAA7H,CACT,EAgBM8H,GAAe,CACnBpI,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IACG,CACH,MAAMkI,EAAWnB,GAAQ,CAAClH,EAAI2H,EAAKE,EAAK3H,CAAE,CAAC,EACrCoI,EAAWpB,GAAQ,CAACjH,EAAI2H,EAAKE,EAAK3H,CAAE,CAAC,EAE3C,MAAO,CAACkI,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,EAEMC,GAAa,CACjB,aAAAH,GACA,eAAAJ,GACA,sBAAAC,GACA,6BAAAP,EACF,EC1HMc,GAA8B,CAClC,CAACxI,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,EACvBV,IACG,CACH,MAAMsI,EAAK,EAAItI,EACR,MAAA,CACL,EAAGsI,GAAM,EAAI/H,EAAK,EAAI+H,EAAKtI,EAAI6B,EAAK7B,GAAK,EAAIS,EAC7C,EAAG6H,GAAM,EAAI9H,EAAK,EAAI8H,EAAKtI,EAAI8B,EAAK9B,GAAK,EAAIU,CAC/C,CACF,EAaMsI,GAAgB,CACpBzI,EACAC,EACAqB,EACAC,EACArB,EACAC,IAEOuG,GAAgB,CAAC1G,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,CAAC,EAe3CuI,GAAuB,CAC3B1I,EACAC,EACAqB,EACAC,EACArB,EACAC,EACAE,IACG,CACG,MAAA6H,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGN,EAAI,EAAGC,CAAG,EAG3B,GAAIiI,EAAkB,CACd,MAAAC,EAAgBzB,GAAgB,CAAC1G,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,CAAC,EAC1DE,GAAY,IAELA,GAAY8H,EACrB7H,EAAQ,CAAE,EAAGJ,EAAI,EAAGC,CAAG,EAEfG,EAAAkI,GACN,CAACxI,EAAIC,EAAIqB,EAAIC,EAAIrB,EAAIC,CAAE,EACvBE,EAAW8H,CACb,EACF,CAEK,OAAA7H,CACT,EAcMqI,GAAc,CAClB3I,EACAC,EACAqB,EACAC,EACArB,EACAC,IACG,CACH,MAAMkI,EAAWtB,GAAQ,CAAC/G,EAAIsB,EAAIpB,CAAE,CAAC,EAC/BoI,EAAWvB,GAAQ,CAAC9G,EAAIsB,EAAIpB,CAAE,CAAC,EACrC,MAAO,CAACkI,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,EACMM,GAAY,CAChB,qBAAAF,GACA,4BAAAF,GACA,YAAAG,GACA,cAAAF,EACF,EChFMI,GAAe,CACnB,YAnCmBC,GAA0B,CAC7C,MAAMjL,EAAIiL,EAAQ,OAClB,IAAIhL,EAAI,GACJE,EACAW,EAAImK,EAAQjL,EAAI,CAAC,EACjBkL,EAAO,EAGJ,KAAA,EAAEjL,EAAID,GACPG,EAAAW,EACJA,EAAImK,EAAQhL,CAAC,EACLiL,GAAA/K,EAAE,CAAC,EAAIW,EAAE,CAAC,EAAIX,EAAE,CAAC,EAAIW,EAAE,CAAC,EAGlC,OAAOoK,EAAO,CAChB,EAqBE,cAVqBD,GACdA,EAAQ,OAAO,CAACvI,EAAQD,EAAOxC,IAChCA,EACKyC,EAAST,GAAmBgJ,EAAQhL,EAAI,CAAC,EAAGwC,CAAK,EAEnD,EACN,CAAC,CAKN,ECxCM0I,GAAe,CACnBlK,EACAnB,EACAsL,IAC6B,CACvB,KAAA,CAAE,IAAAxH,EAAK,IAAAC,CAAA,EAAQ,KACf9C,EAAIE,EAAI4C,EAAIuH,CAAG,EAAItL,EAAI8D,EAAIwH,CAAG,EAC9BlK,EAAID,EAAI2C,EAAIwH,CAAG,EAAItL,EAAI+D,EAAIuH,CAAG,EACpC,MAAO,CAAE,EAAGrK,EAAG,EAAGG,CAAE,CACtB,EClBMmK,EAAU,CAACrL,EAAWsL,IAAkB,CAC5C,MAAMC,EAAMD,GAAS,EAAI,IAAMA,EAAQ,EAEhC,OAAAA,EAAQ,EAAI,KAAK,MAAMtL,EAAIuL,CAAG,EAAIA,EAAM,KAAK,MAAMvL,CAAC,CAC7D,ECDMwL,EAA0B,CAC9B,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,MAAO,CACT,ECLMC,EAAc,CAClB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACL,ECJMC,GAAmBC,GAAqB,CAC5C,IAAIC,EAAcD,EAAK,UAAUA,EAAK,YAAY,EAC9CE,EAAkBD,EAAY,YAAY,EACxC,KAAA,CAAE,KAAAE,GAASH,EAEjB,KAAOG,EAAK,QAAUL,EAAYI,CAAe,IAG3CA,IAAoB,KAAOC,EAAK,OAAS,GAC3CH,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAG,CAAC,CAAA,CAEpB,EACkBD,EAAA,IACJD,EAAAA,IAAgB,IAAM,IAAM,KAE1CD,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAGL,EAAYI,CAAe,CAAC,CAAA,CAE/C,EAGE,EAACJ,EAAYI,CAAe,IAA5B,CAIR,ECrCME,EAAQ,yBCSRC,GAAYL,GAAqB,CAC/B,KAAA,CAAE,MAAAM,EAAO,UAAAC,CAAA,EAAcP,EACvBQ,EAAOD,EAAU,WAAWD,CAAK,EAEvC,GAAIE,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGF,GAAIQ,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGGA,EAAA,IAAM,GAAGI,CAAK,uBACjBG,EAAUD,CAAK,CACjB,gCAAgCA,CAAK,EACvC,ECpBMG,EAAWD,GACRA,GAAQ,IAAMA,GAAQ,GCTzBE,EAAmB,qBCWnBC,GAAaX,GAAqB,CACtC,KAAM,CAAE,IAAA9I,EAAK,UAAAqJ,EAAW,MAAOK,CAAU,EAAAZ,EACzC,IAAIM,EAAQM,EACRC,EAAY,GACZC,EAAa,GACbC,EAAa,GACbC,EAAS,GACTC,EAEJ,GAAIX,GAASpJ,EAAK,CAChB8I,EAAK,IACH,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,iCACjD,MAAA,CAYF,GAVKW,EAAAV,EAAU,WAAWD,CAAK,GAE3BW,IAAO,IAAgBA,IAAO,MACvBX,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,GAK7B,CAACG,EAAQQ,CAAE,GAAKA,IAAO,GAAc,CAElCjB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,oBACA,MAAA,CAGF,GAAIW,IAAO,GAAc,CAMnB,GALJJ,EAAYI,IAAO,GACVX,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,EAE3BO,GAAaP,EAAQpJ,GAEnB+J,GAAMR,EAAQQ,CAAE,EAAG,CAGhBjB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaE,CAAK,MACxDL,EAAUK,CAAK,CACjB,mBACA,MAAA,CAIJ,KAAON,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,EACIQ,EAAA,GAGVG,EAAAV,EAAU,WAAWD,CAAK,CAAA,CAGjC,GAAIW,IAAO,GAAc,CAGvB,IAFSD,EAAA,GACAV,GAAA,EACFG,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC/BA,GAAA,EACIS,EAAA,GAGVE,EAAAV,EAAU,WAAWD,CAAK,CAAA,CAG7B,GAAAW,IAAO,KAAgBA,IAAO,GAAc,CAC9C,GAAID,GAAU,CAACF,GAAc,CAACC,EAAY,CACnCf,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,2BACA,MAAA,CAUF,GAPSA,GAAA,EAEJW,EAAAV,EAAU,WAAWD,CAAK,GAE3BW,IAAO,IAAgBA,IAAO,MACvBX,GAAA,GAEPA,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,EACpD,KAAOA,EAAQpJ,GAAOuJ,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,MAEN,CACAN,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,6BACA,MAAA,CACF,CAGFN,EAAK,MAAQM,EACbN,EAAK,MAAQ,CAACA,EAAK,UAAU,MAAMY,EAAON,CAAK,CACjD,ECpGMY,GAAWD,GACG,CAEhB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MAEA,GACA,GACA,KACA,KAEA,GACA,EACA,GACA,GACA,GACF,EAEiB,SAASA,CAAE,EChCxBE,EAAcnB,GAAqB,CACjC,KAAA,CAAE,UAAAO,EAAW,IAAArJ,CAAA,EAAQ8I,EACpB,KAAAA,EAAK,MAAQ9I,GAAOgK,GAAQX,EAAU,WAAWP,EAAK,KAAK,CAAC,GACjEA,EAAK,OAAS,CAElB,ECPMoB,GAAiBZ,GAA4C,CAEjE,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IAEI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,EChBMa,GACJb,GAEOC,EAAQD,CAAI,GAAgBA,IAAS,IAC1CA,IAAS,IAAgBA,IAAS,GCRhCc,GAAgBd,IAEZA,EAAO,MAAU,GCFrBe,GAAiBf,GAAsC,CAE3D,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,IACI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,ECMMgB,GAAexB,GAAqB,OACxC,KAAM,CAAE,IAAA9I,EAAK,UAAAqJ,EAAW,MAAAD,EAAO,SAAAmB,CAAa,EAAAzB,EACtC0B,EAAUnB,EAAU,WAAWD,CAAK,EACpCqB,EACJC,EAAYrB,EAAUD,CAAK,EAAE,aAAgC,EAK3D,GAHJN,EAAK,aAAeM,EAGhB,CAACc,GAAcM,CAAO,EAAG,CACtB1B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,oCAAoCA,CAAK,GACzC,MAAA,CAIF,MAAMuB,EAAcJ,EAASA,EAAS,OAAS,CAAC,EAE9C,GAAA,CAACF,GAAcG,CAAO,KAAKI,EAAAD,GAAA,YAAAA,EAAc,KAAd,YAAAC,EAAkB,uBAAwB,IACrE,CACK9B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,2CAA2CA,CAAK,GAChD,MAAA,CAQF,GALAN,EAAK,OAAS,EACdmB,EAAWnB,CAAI,EAEfA,EAAK,KAAO,CAAC,EAET,CAAC2B,EAAW,CAEd5B,GAAgBC,CAAI,EACpB,MAAA,CAGO,OAAA,CACP,QAAS1L,EAAIqN,EAAWrN,EAAI,EAAGA,GAAK,EAAG,CAIjC,GAHAgN,GAAaI,CAAO,IAAMpN,IAAM,GAAKA,IAAM,MAAa0L,CAAI,KACjDA,CAAI,EAEfA,EAAK,IAAI,OACX,OAEGA,EAAA,KAAK,KAAKA,EAAK,KAAK,EAEzBmB,EAAWnB,CAAI,EAIbA,EAAK,MAAQ9I,GAAOqJ,EAAU,WAAWP,EAAK,KAAK,IAAM,KAEzDA,EAAK,OAAS,EACdmB,EAAWnB,CAAI,EACjB,CAQF,GALIA,EAAK,OAASA,EAAK,KAKnB,CAACqB,GAAad,EAAU,WAAWP,EAAK,KAAK,CAAC,EAChD,KACF,CAGFD,GAAgBC,CAAI,CACtB,ECnFA,MAAqB+B,EAAW,CAU9B,YAAYC,EAAoB,CAC9B,KAAK,SAAW,CAAC,EACjB,KAAK,UAAYA,EACjB,KAAK,IAAMA,EAAW,OACtB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,aAAe,EACpB,KAAK,KAAO,CAAC,EACb,KAAK,IAAM,EAAA,CAEf,CChBA,MAAMC,EAAwCC,GAA0B,CAClE,GAAA,OAAOA,GAAc,SAChB,OAAAA,EAAU,MAAM,CAAC,EAGpB,MAAAlC,EAAO,IAAI+B,GAAWG,CAAS,EAIrC,IAFAf,EAAWnB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCwB,GAAYxB,CAAI,EAKd,GAAA,CAACA,EAAK,IAAI,OACRA,EAAK,SAAS,SAMhBA,EAAK,SAAS,CAAC,EAAE,CAAC,EAAI,SAGlB,OAAA,UAAUA,EAAK,GAAG,EAG1B,OAAOA,EAAK,QACd,ECjBMmC,GAAoB,CACxBC,EACA9B,EACA+B,EACAC,IACG,CACG,KAAA,CAACrC,CAAW,EAAImC,EAChBG,EAAatC,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKiC,IAAetC,EAGI,OAAAmC,EAEtC,GAAIG,IAAe,IACV,MAAA,CACLA,EACAH,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWE,IAAe,IACjB,MAAA,CACLA,EACCH,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAME,EAAY,CAAC,EACbC,EAASL,EAAQ,OACvB,QAAS7F,EAAI,EAAGA,EAAIkG,EAAQlG,GAAK,EAC/BiG,EAAU,KAAMJ,EAAQ7F,CAAC,GAAgBA,EAAI,EAAI8F,EAAQC,EAAM,EAGjE,MAAO,CAACC,CAAwC,EAAE,OAAOC,CAAS,CAAA,CAOtE,ECjEME,EAAU,CACd1C,EACA2C,IACG,CACH,IAAIC,EAAU5C,EAAK,OACfoC,EACAnC,EAAc,IACdsC,EAAa,IACbM,EAAa,GACbvN,EAAI,EACJnB,EAAI,EACJ2O,EAAK,EACLC,EAAK,EACLC,EAAS,EAEb,QAAS1O,EAAI,EAAGA,EAAIsO,EAAStO,GAAK,EAAG,CACnC8N,EAAUpC,EAAK1L,CAAC,EAChB,CAAC2L,CAAW,EAAImC,EAChBY,EAASZ,EAAQ,OACjBG,EAAatC,EAAY,YAAY,EACrC4C,EAAaN,IAAetC,EAE5B,MAAMgD,EAAiBN,EAASP,EAAS9N,EAAGgB,EAAGnB,CAAC,EAGhD,GAAI8O,IAAmB,GACrB,MAIEV,IAAe,KACbjN,EAAAwN,EACA3O,EAAA4O,GACKR,IAAe,IACxBjN,EAAK8M,EAAQ,CAAC,GAAgBS,EAAavN,EAAI,GACtCiN,IAAe,IACxBpO,EAAKiO,EAAQ,CAAC,GAAgBS,EAAa1O,EAAI,IAE/CmB,EAAK8M,EAAQY,EAAS,CAAC,GAAgBH,EAAavN,EAAI,GACxDnB,EAAKiO,EAAQY,EAAS,CAAC,GAAgBH,EAAa1O,EAAI,GAEpDoO,IAAe,MACZO,EAAAxN,EACAyN,EAAA5O,IAIL8O,IACFjD,EAAK1L,CAAC,EAAI2O,EACNA,EAAe,CAAC,IAAM,MACxBL,EAAU5C,EAAK,QAEnB,CAEK,OAAAA,CACT,ECpDMkD,GAAkBhB,GAAkC,CAClD,MAAAlC,EAAOiC,EAAgBC,CAAS,EAE/B,OAAAQ,EAAuB1C,EAAMmC,EAAiB,CACvD,ECQMgB,GAAoB,CACxBf,EACA9B,EACA+B,EACAC,IACG,CACG,KAAA,CAACrC,CAAW,EAAImC,EAChBgB,EAAanD,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKL,IAAgBmD,EAGG,OAAAhB,EAEtC,GAAIgB,IAAe,IACV,MAAA,CACLA,EACAhB,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWc,IAAe,IACxB,MAAO,CAACA,EAAahB,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWc,IAAe,IACxB,MAAO,CAACA,EAAahB,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWe,IAAe,IACjB,MAAA,CACLA,EACChB,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAMe,EAAY,CAAC,EACbZ,EAASL,EAAQ,OACvB,QAAS7F,EAAI,EAAGA,EAAIkG,EAAQlG,GAAK,EAC/B8G,EAAU,KAAMjB,EAAQ7F,CAAC,GAAgBA,EAAI,EAAI8F,EAAQC,EAAM,EAGjE,MAAO,CAACc,CAAsC,EAAE,OAAOC,CAAS,CAAA,CAMpE,EC7DMC,GAAkBpB,GAAiD,CACjE,MAAAlC,EAAOiC,EAAgBC,CAAS,EAE/B,OAAAQ,EAAuB1C,EAAMmD,EAAiB,CACvD,ECIMI,GAAa,CACjBC,EACAC,EACA5K,EACAC,EACAC,EACAC,EACAC,EACAyK,EACAC,EACAC,IACa,CACb,IAAIpN,EAAKgN,EACL/M,EAAKgN,EACLpM,EAAKwB,EACLvB,EAAKwB,EACLpC,EAAKgN,EACL/M,EAAKgN,EAGH,MAAAE,EAAQ,KAAK,GAAK,IAAO,IAEzBpE,EAAO,KAAK,GAAK,KAAQ,CAAC1G,GAAS,GACzC,IAAI+K,EAAM,CAAC,EACPC,EACAC,EACAC,EACAnM,EACAC,EAEJ,GAAK6L,EA4CH,CAACI,EAAIC,EAAInM,EAAIC,CAAE,EAAI6L,MA5CL,CACdG,EAAKvE,GAAahJ,EAAIC,EAAI,CAACgJ,CAAG,EAC9BjJ,EAAKuN,EAAG,EACRtN,EAAKsN,EAAG,EACRA,EAAKvE,GAAa9I,EAAIC,EAAI,CAAC8I,CAAG,EAC9B/I,EAAKqN,EAAG,EACRpN,EAAKoN,EAAG,EAEF,MAAAzO,GAAKkB,EAAKE,GAAM,EAChBvC,GAAKsC,EAAKE,GAAM,EACtB,IAAIhC,EAAKW,EAAIA,GAAM+B,EAAKA,GAAOlD,EAAIA,GAAMmD,EAAKA,GAC1C3C,EAAI,IACFA,EAAA,KAAK,KAAKA,CAAC,EACT0C,GAAA1C,EACA2C,GAAA3C,GAER,MAAMuP,GAAM7M,EAAKA,EACX8M,GAAM7M,EAAKA,EAEX5B,IAAKsD,IAAQC,EAAK,GAAK,GAC3B,KAAK,KACH,KAAK,KACFiL,GAAMC,GAAMD,GAAM/P,EAAIA,EAAIgQ,GAAM7O,EAAIA,IAAM4O,GAAM/P,EAAIA,EAAIgQ,GAAM7O,EAAIA,EAAA,CAEvE,EAEFwC,EAAMpC,GAAI2B,EAAKlD,EAAKmD,GAAMd,EAAKE,GAAM,EACrCqB,EAAMrC,GAAI,CAAC4B,EAAKhC,EAAK+B,GAAMZ,EAAKE,GAAM,EAEjCqN,EAAA,KAAK,OAASvN,EAAKsB,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAEvD2M,EAAA,KAAK,OAAStN,EAAKoB,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAE5D0M,EAAKxN,EAAKsB,EAAK,KAAK,GAAKkM,EAAKA,EAC9BC,EAAKvN,EAAKoB,EAAK,KAAK,GAAKmM,EAAKA,EAC1BD,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3BC,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3BhL,GAAM+K,EAAKC,IACbD,GAAM,KAAK,GAAK,GAEd,CAAC/K,GAAMgL,EAAKD,IACdC,GAAM,KAAK,GAAK,EAClB,CAIF,IAAIG,EAAKH,EAAKD,EACd,GAAI,KAAK,IAAII,CAAE,EAAIP,EAAM,CACvB,MAAMQ,EAAQJ,EACRK,EAAQ5N,EACR6N,EAAQ5N,EACdsN,EAAKD,EAAKH,GAAQ5K,GAAMgL,EAAKD,EAAK,EAAI,IACtCtN,EAAKoB,EAAKT,EAAK,KAAK,IAAI4M,CAAE,EAC1BtN,EAAKoB,EAAKT,EAAK,KAAK,IAAI2M,CAAE,EACpBH,EAAAP,GAAW7M,EAAIC,EAAIU,EAAIC,EAAIyB,EAAO,EAAGE,EAAIqL,EAAOC,EAAO,CAC3DN,EACAI,EACAvM,EACAC,CAAA,CACD,CAAA,CAEHqM,EAAKH,EAAKD,EACJ,MAAAQ,EAAK,KAAK,IAAIR,CAAE,EAChBS,EAAK,KAAK,IAAIT,CAAE,EAChBU,EAAK,KAAK,IAAIT,CAAE,EAChBU,EAAK,KAAK,IAAIV,CAAE,EAChBhO,EAAI,KAAK,IAAImO,EAAK,CAAC,EACnBQ,EAAM,EAAI,EAAKvN,EAAKpB,EACpB4O,EAAM,EAAI,EAAKvN,EAAKrB,EACpB6O,EAAK,CAACtO,EAAIC,CAAE,EACZsO,EAAK,CAACvO,EAAKoO,EAAKH,EAAIhO,EAAKoO,EAAKL,CAAE,EAChCQ,EAAK,CAACtO,EAAKkO,EAAKD,EAAIhO,EAAKkO,EAAKH,CAAE,EAChCO,GAAK,CAACvO,EAAIC,CAAE,EAGlB,GAFAoO,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACxBA,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACpBnB,EACK,MAAA,CAACmB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOnB,CAAG,EAExDA,EAAA,CAACiB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOnB,CAAG,EAC3D,MAAMoB,EAAS,CAAC,EACP,QAAA5Q,EAAI,EAAG6Q,EAAKrB,EAAI,OAAQxP,EAAI6Q,EAAI7Q,GAAK,EACrC4Q,EAAA5Q,CAAC,EAAIA,EAAI,EACZkL,GAAasE,EAAIxP,EAAI,CAAC,EAAGwP,EAAIxP,CAAC,EAAGmL,CAAG,EAAE,EACtCD,GAAasE,EAAIxP,CAAC,EAAGwP,EAAIxP,EAAI,CAAC,EAAGmL,CAAG,EAAE,EAErC,OAAAyF,CACT,EC7HME,GAAc,CAClB5O,EACAC,EACA4O,EACAC,EACA5O,EACAC,IACqD,CACrD,MAAM4O,EAAM,kBACNC,EAAM,EAAI,EACT,MAAA,CACLD,EAAM/O,EAAKgP,EAAMH,EACjBE,EAAM9O,EAAK+O,EAAMF,EACjBC,EAAM7O,EAAK8O,EAAMH,EACjBE,EAAM5O,EAAK6O,EAAMF,EACjB5O,EACAC,CACF,CACF,EClBM8O,GAAc,CAACjP,EAAYC,EAAYC,EAAYC,IAAe,CAChE,MAAA6N,EAAKxO,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,iBAAS,EAC3C+N,EAAK1O,EAAS,CAACQ,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,EAAG,EAAM,CAAG,EACjD,MAAO,CAAC6N,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGhO,EAAIC,CAAE,CAC5C,ECFM+O,GAAiB,CAACtD,EAAsBuD,IAAyB,CAC/D,KAAA,CAAC1F,CAAW,EAAImC,EAChBwD,EAASxD,EAAQ,MAAM,CAAC,EAAE,IAAI,MAAM,EACpC,CAAC9M,EAAGnB,CAAC,EAAIyR,EAET,CAAE,GAAIC,EAAK,GAAIC,EAAK,EAAGC,EAAI,EAAGC,CAAA,EAAOL,EAO3C,MALK,KAAK,SAAS1F,CAAW,IAC5B0F,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV1F,IAAgB,KAClB0F,EAAO,EAAIrQ,EACXqQ,EAAO,EAAIxR,EACJiO,GACEnC,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BsD,GACEsC,EACAC,EACAF,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,CAAA,CAEZ,EACS3F,IAAgB,KACzB0F,EAAO,GAAKrQ,EACZqQ,EAAO,GAAKxR,EACL,CAAC,GAAsB,EAAE,OAC9BiR,GAAYS,EAAKC,EAAKF,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAClE,GACS3F,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BwF,GAAYI,EAAKC,EAAKxQ,EAAGnB,CAAC,CAC5B,EACS8L,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BwF,GAAYI,EAAKC,EAAKC,EAAIC,CAAE,CAC9B,EAGK5D,CACT,ECtCM6D,GAAmB,CAAC7D,EAAsBuD,IAAyB,CACjE,KAAA,CAAC1F,CAAW,EAAImC,EAChBG,EAAatC,EAAY,YAAY,EACrC4C,EAAa5C,IAAgBsC,EAC7B,CAAE,GAAIsD,EAAK,GAAIC,EAAK,GAAII,EAAK,GAAIC,EAAK,EAAA7Q,EAAG,EAAAnB,CAAM,EAAAwR,EAC/CC,EAASxD,EAAQ,MAAM,CAAC,EAC9B,IAAII,EAAYoD,EAAO,IAAI,CAACvR,EAAGkI,IAAMlI,GAAKwO,EAActG,EAAI,EAAIpI,EAAImB,EAAK,EAAE,EAS3E,GAPK,KAAK,SAASiN,CAAU,IAE3BoD,EAAO,GAAK,KACZA,EAAO,GAAK,MAIVpD,IAAe,IACjB,OAAAC,EAAYoD,EAAO,MAAM,EAAG,EAAE,EAAE,OAC9BA,EAAO,CAAC,GAAK/C,EAAavN,EAAI,GAC9BsQ,EAAO,CAAC,GAAK/C,EAAa1O,EAAI,EAChC,EAEO,CAAC,GAA2B,EAAE,OAAOqO,CAAS,EACvD,GAAWD,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC7CwQ,CACF,EACF,GAAWvD,IAAe,IACjB,MAAA,CACL,IACAsD,EACCzD,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC5C8M,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKS,EAAavN,EAAI,GAC5C8M,EAAqB,CAAC,GAAKS,EAAa1O,EAAI,EAC/C,EACF,GAAWoO,IAAe,IACxB,MAAO,CAAC,GAA2B,EAAE,OAAOC,CAAS,EACvD,GAAWD,IAAe,IAAK,CACvB,MAAA/L,EAAKqP,EAAM,EAAIK,EACfzP,EAAKqP,EAAM,EAAIK,EACrB,OAAAR,EAAO,GAAKnP,EACZmP,EAAO,GAAKlP,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAO+L,CAAS,CAAA,SAC5BD,IAAe,IAAK,CAC7B,MAAM8C,EAAKQ,EAAM,GAAKF,EAAO,GAAKA,EAAO,GAAgC,GACnEL,EAAKQ,EAAM,GAAKH,EAAO,GAAKA,EAAO,GAAgC,GACzE,OAAAA,EAAO,GAAKN,EACZM,EAAO,GAAKL,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAO9C,CAAS,CAAA,SAC5BD,IAAe,IAAK,CACvB,KAAA,CAAC6D,EAAKC,CAAG,EAAI7D,EACnB,OAAAmD,EAAO,GAAKS,EACZT,EAAO,GAAKU,EACL,CAAC,GAA2B,EAAE,OAAO7D,CAAS,CAAA,SAC5CD,IAAe,IACxB,MAAO,CAAC,GAAG,EAIN,OAAAH,CACT,EC3FMkE,GAA6B,CACjC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,EAAG,EACH,GAAI,KACJ,GAAI,IACN,ECMMC,GAAerE,GAA8C,CAC3D,MAAAyD,EAAS,CAAE,GAAGW,EAAa,EAC3BtG,EAAOiC,EAAgBC,CAAS,EAEtC,OAAOQ,EAAoB1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC7DqD,EAAO,EAAItD,EACXsD,EAAO,EAAIrD,EACL,MAAAmE,EAAgBR,GAAiBO,EAAKb,CAAM,EAC9C,IAAAe,EAAShB,GAAee,EAAed,CAAM,EAC/Be,EAAO,CAAC,IAAM,KAAOA,EAAO,OAAS,IAGhD1G,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAA+B,EAAE,OAAOoG,EAAO,MAAM,CAAC,CAAC,CAC1D,EACSA,EAAAA,EAAO,MAAM,EAAG,CAAC,GAG5B,MAAMjE,EAASiE,EAAO,OACtB,OAAAf,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAC1CA,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAEnCe,CAAA,CACR,CACH,ECjCMC,GAAe,CACnB3G,EACA4G,IACW,CACX,MAAMhE,EAAU5C,EAAK,OACjB,GAAA,CAAE,MAAAL,GAAUE,EACZuC,EAAUpC,EAAK,CAAC,EAChB0G,EAAS,GAGb/G,EAAQiH,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOjH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAEzC,QAASrL,EAAI,EAAGA,EAAIsO,EAAStO,GAAK,EAAG,CACnC8N,EAAUpC,EAAK1L,CAAC,EACV,KAAA,CAAC2L,CAAW,EAAImC,EAChBwD,EAASxD,EAAQ,MAAM,CAAC,EAE9B,GADUsE,GAAAzG,EACNN,IAAU,MACF+G,GAAAd,EAAO,KAAK,GAAG,MACpB,CACL,IAAIrJ,EAAI,EACR,MAAMsK,EAASjB,EAAO,OACtB,KAAOrJ,EAAIsK,GACTH,GAAUhH,EAAQkG,EAAOrJ,CAAC,EAAGoD,CAAK,EAC9BpD,IAAMsK,EAAS,IAAaH,GAAA,KAC3BnK,GAAA,CACP,CACF,CAGK,OAAAmK,CACT,ECvCMI,GAAe5E,GAAkC,CACrD,GAAI,CAACA,EACI,MAAA,CACL,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACN,EAGI,MAAAlC,EAAOiC,EAAgBC,CAAS,EACtC,IAAIjC,EAAc,IACd6C,EAAK,EACLC,EAAK,EACH,KAAA,CAAE,IAAA7L,EAAK,IAAAD,CAAA,EAAQ,KACrB,IAAImE,EAAO,IACPE,EAAO,IACPD,EAAO,KACPE,EAAO,KACPwL,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EAEd9E,EAAQ1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC1C,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEVC,EAAgBlE,IAAe,IAChC,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAYJ,GAVA,CAACxH,CAAW,EAAIwG,EAEX,KAAK,SAASlE,CAAU,IAEjBgF,EAAA,EACAC,EAAA,GAKRvH,IAAgB,IACjB,EAAE6C,EAAIC,CAAE,EAAI0D,EACNM,EAAAjE,EACAkE,EAAAjE,EACAkE,EAAAnE,EACAoE,EAAAnE,UACE9C,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIlQ,GACzBqL,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIzM,GACzB4H,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IAAK,CACxB,MAAAyH,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAE3B,CAACP,EAAMC,EAAMC,EAAMC,CAAI,EAAItI,GACzByD,EACAC,EACAoF,EACAC,EACAlB,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACSxG,IAAgB,IACzB,CAAC8G,EAAMC,EAAMC,EAAMC,CAAI,EAAItI,GACzByD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACSxG,IAAgB,KACzBsH,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACxB,CAACT,EAAMC,EAAMC,EAAMC,CAAI,EAAI/H,GACzBkD,EACAC,EACAiF,EACAC,EACAf,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,KACzBsH,EAAUd,EAAc,CAAC,EACzBe,EAAUf,EAAc,CAAC,EACzB,CAACM,EAAMC,EAAMC,EAAMC,CAAI,EAAI/H,GACzBkD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,MACxB,CAAA8G,EAAMC,EAAMC,EAAMC,CAAI,EAAIlQ,GAAYqL,EAAOC,EAAOQ,EAAIC,CAAE,GAEtD3H,EAAAnE,EAAI8P,EAAM3L,CAAI,EACdE,EAAArE,EAAI+P,EAAM1L,CAAI,EACdD,EAAAnE,EAAI+P,EAAM5L,CAAI,EACdE,EAAArE,EAAIgQ,EAAM3L,CAAI,EAGpB,CAAA4L,EAASC,CAAO,EAAInH,IAAgB,IACjC,CAAC6C,EAAIC,CAAE,EACN0D,EAAc,MAAM,EAAE,EAC1B,CAAAY,EAASC,CAAO,EAAIrH,IAAgB,IAChC,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpCxG,IAAgB,IACf,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAACU,EAASC,CAAO,CAAA,CACtB,EAED,MAAMQ,EAAQvM,EAAOD,EACfyM,EAAStM,EAAOD,EAEf,MAAA,CACL,MAAAsM,EACA,OAAAC,EACA,EAAGzM,EACH,EAAGE,EACH,GAAID,EACJ,GAAIE,EACJ,GAAIH,EAAOwM,EAAQ,EACnB,GAAItM,EAAOuM,EAAS,EAEpB,GAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,CAC1D,CACF,EChKMC,EAAkB5F,GAAkC,CAClD,MAAAlC,EAAOiC,EAAgBC,CAAS,EACtC,IAAIiF,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVvH,EAAc,IACd6C,EAAK,EACLC,EAAK,EACLgF,EAAc,EAElB,OAAArF,EAAQ1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAC1C,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEVC,EAAgBlE,IAAe,IAChC,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAWJ,GAVA,CAACxH,CAAW,EAAIwG,EAEX,KAAK,SAASlE,CAAU,IAEjBgF,EAAA,EACAC,EAAA,GAKRvH,IAAgB,IAEjB,EAAE6C,EAAIC,CAAE,EAAI0D,UACJxG,IAAgB,IACV8H,GAAAxR,GACb8L,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IACV8H,GAAA1N,GACbgI,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACSxG,IAAgB,IAAK,CACxB,MAAAyH,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAEZS,GAAAvJ,GACb6D,EACAC,EACAoF,EACAC,EACAlB,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACSxG,IAAgB,IACV8H,GAAAvJ,GACb6D,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACSxG,IAAgB,KACzBsH,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACTO,GAAA9I,GACboD,EACAC,EACAiF,EACAC,EACAf,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,KACzBsH,EAAUd,EAAc,CAAC,EACzBe,EAAUf,EAAc,CAAC,EACVsB,GAAA9I,GACboD,EACAC,EACAmE,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACSxG,IAAgB,MACzB8H,GAAexR,GAAc8L,EAAOC,EAAOQ,EAAIC,CAAE,GAIlD,CAAAoE,EAASC,CAAO,EAAInH,IAAgB,IACjC,CAAC6C,EAAIC,CAAE,EACN0D,EAAc,MAAM,EAAE,EAC1B,CAAAY,EAASC,CAAO,EAAIrH,IAAgB,IAChC,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpCxG,IAAgB,IACf,CAACwG,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAACU,EAASC,CAAO,CAAA,CACtB,EAEMW,CACT,ECxIMC,GAAmB,KCcnBC,GAAiB/F,GAAkC,CACjD,MAAAlC,EAAOiC,EAAgBC,CAAS,EAChCyD,EAAS,CAAE,GAAGW,EAAa,EAEjC,OAAO5D,EAAqB1C,EAAM,CAACwG,EAAK0B,EAAG7F,EAAOC,IAAU,CAC1DqD,EAAO,EAAItD,EACXsD,EAAO,EAAIrD,EACL,MAAAoE,EAAST,GAAiBO,EAAKb,CAAM,EAErClD,EAASiE,EAAO,OACtB,OAAAf,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,EAC9BkD,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAC1CA,EAAO,GAAK,CAACe,EAAOjE,EAAS,CAAC,GAAKkD,EAAO,GAEnCe,CAAA,CACR,CACH,ECfMyB,GAAmB,CAACjG,EAA+BrL,IAAsB,CACvE,MAAAmJ,EAAOiI,GAAc/F,CAAS,EACpC,IAAIkG,EAAM,GACNjI,EAAO,CAAC,EACRF,EAAc,IACd3K,EAAI,EACJnB,EAAI,EACJ,CAAC2O,EAAIC,CAAE,EAAI/C,EAAK,CAAC,EAAE,MAAM,CAAC,EACxB,MAAAtB,EAAmB,OAAO7H,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EACvBhM,EAAS,EACTsR,EAAQvR,EACRiR,EAAc,EAElB,MAAI,CAACrJ,GAAoB7H,EAAWmR,GAAyBlR,GAG7D4L,EAAQ1C,EAAM,CAACwG,EAAK0B,EAAG7F,EAAOC,IAAU,CA8FtC,GA7FA,CAACrC,CAAW,EAAIuG,EAChB4B,EAAMnI,IAAgB,IACfE,EAACiI,EAAwDjI,EAAlD,CAACkC,EAAOC,CAAK,EAAE,OAAOkE,EAAI,MAAM,CAAC,CAAa,EAIxD4B,GAED,EAAEtF,EAAIC,CAAE,EAAIyD,EACb1P,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EACdhM,EAAA,GACAkJ,IAAgB,KACjBnJ,EAAAF,GACNuJ,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACAhR,EAASR,GAAc4J,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAChDF,IAAgB,KACjBnJ,EAAAwD,GACN6F,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAsD,GACP8F,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBnJ,EAAA2H,GACN0B,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAyH,GACP2B,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBnJ,EAAAoI,GACNiB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNtJ,EAAWkR,CACb,EACShR,EAAAkI,GACPkB,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,MACzBE,EAAO,CAACkC,EAAOC,EAAOQ,EAAIC,CAAE,EAC5BjM,EAAQ,CAAE,EAAGgM,EAAI,EAAGC,CAAG,EAEvBhM,EAASR,GAAc4J,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAG3D,CAAC7K,EAAGnB,CAAC,EAAIgM,EAAK,MAAM,EAAE,EAElB4H,EAAclR,EACRwR,EAAAvR,MAKD,OAAA,GAGMiR,GAAAhR,CACf,CACD,EAIGF,EAAWkR,EAAcC,GACpB,CAAE,EAAA1S,EAAG,EAAAnB,CAAE,EAGTkU,EACT,ECtIMC,GAAwB,CAC5BpG,EACArL,IACsB,CAChB,MAAA0R,EAAYtG,EAAgBC,CAAS,EAEvC,IAAAsG,EAAWD,EAAU,MAAM,CAAC,EAC5BE,EAAaX,EAAeU,CAAQ,EACpClI,EAAQkI,EAAS,OAAS,EAC1BE,EAAkB,EAClB3R,EAAS,EACTqL,EAAUmG,EAAU,CAAC,EAGrB,GAAAjI,GAAS,GAAK,CAACzJ,GAAY,CAAC,OAAO,SAASA,CAAQ,EAC/C,MAAA,CACL,QAAAuL,EACA,MAAO,EACP,OAAArL,EACA,gBAAA2R,CACF,EAGF,GAAI7R,GAAY4R,EACH,OAAAD,EAAAD,EAAU,MAAM,EAAG,EAAE,EAChCG,EAAkBZ,EAAeU,CAAQ,EACzCzR,EAAS0R,EAAaC,EACtBtG,EAAUmG,EAAUjI,CAAK,EAClB,CACL,QAAA8B,EACA,MAAA9B,EACA,OAAAvJ,EACA,gBAAA2R,CACF,EAGF,MAAMjH,EAAW,CAAC,EAClB,KAAOnB,EAAQ,GACb8B,EAAUoG,EAASlI,CAAK,EACbkI,EAAAA,EAAS,MAAM,EAAG,EAAE,EAC/BE,EAAkBZ,EAAeU,CAAQ,EACzCzR,EAAS0R,EAAaC,EACTD,EAAAC,EAEbjH,EAAS,KAAK,CACZ,QAAAW,EACA,MAAA9B,EACA,OAAAvJ,EACA,gBAAA2R,CAAA,CACD,EACQpI,GAAA,EAGX,OAAOmB,EAAS,KAAK,CAAC,CAAE,gBAAiBhN,KACvCA,GAAKoC,CACP,CACF,ECnDM8R,GAAuB,CAC3BzG,EACApL,IACoB,CACd,MAAAkJ,EAAOiC,EAAgBC,CAAS,EAChC0G,EAAaX,GAAcjI,CAAI,EAC/ByI,EAAaX,EAAec,CAAU,EACtCC,EAAc9U,GAAa,CACzB,MAAAuF,EAAKvF,EAAE,EAAI+C,EAAM,EACjByC,EAAKxF,EAAE,EAAI+C,EAAM,EAChB,OAAAwC,EAAKA,EAAKC,EAAKA,CACxB,EACA,IAAIuP,EAAY,EACZC,EACAC,EAAU,CAAE,EAAG,EAAG,EAAG,CAAE,EACvBC,EAAe,EACfC,EAAa,EACbC,EAAe,IAGnB,QAASC,EAAa,EAAGA,GAAcX,EAAYW,GAAcN,EACxDC,EAAAZ,GAAiBS,EAAYQ,CAAU,EAC9CH,EAAeJ,EAAWE,CAAI,EAE1BE,EAAeE,IACPH,EAAAD,EACGG,EAAAE,EACED,EAAAF,GAKNH,GAAA,EACT,IAAAO,EACAC,EACAC,EAAe,EACfC,EAAc,EACdC,EAAiB,EACjBC,EAAgB,EAEpB,KAAOZ,EAAY,OACjBS,EAAeL,EAAaJ,EACnBO,EAAAlB,GAAiBS,EAAYW,CAAY,EAClDE,EAAiBZ,EAAWQ,CAAM,EAClCG,EAAcN,EAAaJ,EACnBQ,EAAAnB,GAAiBS,EAAYY,CAAW,EAChDE,EAAgBb,EAAWS,CAAK,EAE5BC,GAAgB,GAAKE,EAAiBN,GAC9BH,EAAAK,EACGH,EAAAK,EACEJ,EAAAM,GACND,GAAef,GAAciB,EAAgBP,GAC5CH,EAAAM,EACGJ,EAAAM,EACEL,EAAAO,GAEFZ,GAAA,EAEX,EAAAA,EAAY,QAAhB,CAGI,MAAA1G,EAAUkG,GAAsBtI,EAAMkJ,CAAU,EAChDrS,EAAW,KAAK,KAAKsS,CAAY,EAEhC,MAAA,CAAE,QAAAH,EAAS,SAAAnS,EAAU,QAAAuL,CAAQ,CACtC,EC1EMuH,GAAkB,CACtBzH,EACApL,IAEO6R,GAAqBzG,EAAWpL,CAAK,EAAE,QCI1C8S,GAAkB,CACtBpT,EACAC,EACA0H,EACAC,EACAC,EACAC,EACA5H,EACAC,IAGG,IACGA,EAAKF,IAAO0H,EAAME,IACjB3H,EAAKF,IAAO4H,EAAME,GACnBF,GAAO5H,EAAK6H,GACZF,GAAO1H,EAAK6H,GACZ3H,GAAM0H,EAAM7H,EAAK,GACjBE,GAAM4H,EAAM7H,EAAK,IACrB,GAcEoT,GAAe7J,GAAoB,CACvC,IAAI1K,EAAI,EACJnB,EAAI,EACJ6I,EAAM,EAEV,OAAOuJ,GAAYvG,CAAI,EACpB,IAAKwG,GAAQ,CACJ,OAAAA,EAAI,CAAC,EAAG,CACd,IAAK,IACF,QAAElR,EAAGnB,CAAC,EAAIqS,EACJ,EACT,QACQ,OAAAxJ,EAAA4M,GACJtU,EACAnB,EACAqS,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,CACP,EACA,CAAClR,EAAGnB,CAAC,EAAIqS,EAAI,MAAM,EAAE,EACdxJ,CAAA,CACX,CACD,EACA,OAAO,CAACxI,EAAGW,IAAMX,EAAIW,EAAG,CAAC,CAC9B,EClEM2U,GAAoB9J,GACjB6J,GAAYtD,GAAYvG,CAAI,CAAC,GAAK,ECFrC+J,GAAqB,CACzB7H,EACArL,IAEOyR,GAAsBpG,EAAWrL,CAAQ,EAAE,QCH9CmT,GAAoB,CACxBhK,EACAlJ,IAEO6R,GAAqB3I,EAAMlJ,CAAK,EAAE,QCNrCmT,GAAejK,GAEjB,MAAM,QAAQA,CAAI,GAClBA,EAAK,MAAOwG,GAAqB,CAC/B,MAAM0D,EAAK1D,EAAI,CAAC,EAAE,YAAY,EAC9B,OACE1G,EAAYoK,CAAE,IAAM1D,EAAI,OAAS,GACjC,aAAa,SAAS0D,CAAE,GACvB1D,EAAI,MAAM,CAAC,EAAgB,MAAM,OAAO,QAAQ,CAAA,CAEpD,GACDxG,EAAK,OAAS,ECVZmK,GAAmBnK,GAErBiK,GAAYjK,CAAI,GAEhBA,EAAK,MAAM,CAAC,CAAC1K,CAAC,IAAMA,IAAMA,EAAE,aAAa,ECHvC8U,GAAqBpK,GAElBmK,GAAgBnK,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACqK,CAAE,IAAM,SAAS,SAASA,CAAE,CAAC,ECHtEC,GAAgBtK,GAEboK,GAAkBpK,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACqK,CAAE,IAAM,KAAK,SAASA,CAAE,CAAC,ECDpEE,GAAkB,CACtBrI,EACApL,IACG,CACH,KAAM,CAAE,SAAAD,CAAa,EAAA8R,GAAqBzG,EAAWpL,CAAK,EACnD,OAAA,KAAK,IAAID,CAAQ,EAAImR,EAC9B,ECPMwC,GAAmBxK,GAErBiK,GAAYjK,CAAI,GAEhBA,EAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAACqK,CAAE,IAAMA,IAAOA,EAAG,aAAa,ECHnDI,GAAezI,GAAuB,CAC1C,GAAI,OAAOA,GAAe,UAAY,CAACA,EAAW,OACzC,MAAA,GAGH,MAAAhC,EAAO,IAAI+B,GAAWC,CAAU,EAItC,IAFAb,EAAWnB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCwB,GAAYxB,CAAI,EAGX,MAAA,CAACA,EAAK,IAAI,QAAU,KAAK,SAASA,EAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAC9D,ECpBM0K,GAA2B,CAC/B,KAAM,CAAC,KAAM,KAAM,KAAM,IAAI,EAC7B,OAAQ,CAAC,KAAM,KAAM,GAAG,EACxB,QAAS,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,KAAM,CAAC,QAAS,SAAU,IAAK,IAAK,KAAM,IAAI,EAC9C,QAAS,CAAC,QAAQ,EAClB,SAAU,CAAC,QAAQ,EACnB,MAAO,CAAC,GAAG,CACb,ECbMC,GAAaC,GACKA,GAAS,MAC/B,OAAOA,GAAS,UACfA,EAAc,WAAa,ECmBjBC,GAAeC,GAA8B,CACxD,GAAI,CAAE,GAAAtU,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAO,EAAAmU,EACzB,OAACtU,EAAIC,EAAIC,EAAIC,CAAE,EAAI,CAACH,EAAIC,EAAIC,EAAIC,CAAE,EAAE,IAAKnC,GAAM,CAACA,CAAC,EAC1C,CACL,CAAC,IAAKgC,EAAIC,CAAE,EACZ,CAAC,IAAKC,EAAIC,CAAE,CACd,CACF,EAQaoU,GAAeD,GAA8B,CACxD,MAAMvC,EAAY,CAAC,EACbnM,GAAU0O,EAAK,QAAU,IAC5B,KAAK,EACL,MAAM,QAAQ,EACd,IAAKtW,GAAM,CAACA,CAAC,EAEhB,IAAI8L,EAAQ,EACL,KAAAA,EAAQlE,EAAO,QACpBmM,EAAU,KAAK,CAACjI,EAAQ,IAAM,IAAKlE,EAAOkE,CAAK,EAAGlE,EAAOkE,EAAQ,CAAC,CAAC,CAAC,EAC3DA,GAAA,EAGH,OAAAwK,EAAK,OAAS,UAClB,CAAC,GAAGvC,EAAW,CAAC,GAAG,CAAC,EACpBA,CACN,EAQayC,GAAiBF,GAAgC,CAC5D,GAAI,CAAE,GAAAhT,EAAI,GAAAC,EAAI,EAAAxD,CAAM,EAAAuW,EACpB,OAAChT,EAAIC,EAAIxD,CAAC,EAAI,CAACuD,EAAIC,EAAIxD,CAAC,EAAE,IAAKC,GAAM,CAACA,CAAC,EAEhC,CACL,CAAC,IAAKsD,EAAKvD,EAAGwD,CAAE,EAChB,CAAC,IAAKxD,EAAGA,EAAG,EAAG,EAAG,EAAG,EAAIA,EAAG,CAAC,EAC7B,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAG,GAAKA,EAAG,CAAC,CAChC,CACF,EAQa0W,GAAkBH,GAAiC,CAC1D,GAAA,CAAE,GAAAhT,EAAI,GAAAC,CAAA,EAAO+S,EACbzT,EAAKyT,EAAK,IAAM,EAChBxT,EAAKwT,EAAK,IAAMzT,EACpB,OAACS,EAAIC,EAAIV,EAAIC,CAAE,EAAI,CAACQ,EAAIC,EAAIV,EAAIC,CAAE,EAAE,IAAK9C,GAAM,CAACA,CAAC,EAE1C,CACL,CAAC,IAAKsD,EAAKT,EAAIU,CAAE,EACjB,CAAC,IAAKV,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAID,EAAI,CAAC,EAChC,CAAC,IAAKA,EAAIC,EAAI,EAAG,EAAG,EAAG,GAAKD,EAAI,CAAC,CACnC,CACF,EAQa6T,GAAoBJ,GAA8B,CACvD,MAAAxV,EAAI,CAACwV,EAAK,GAAK,EACf3W,EAAI,CAAC2W,EAAK,GAAK,EACfhW,EAAI,CAACgW,EAAK,MACVnW,EAAI,CAACmW,EAAK,OACZ,IAAAzT,EAAK,EAAEyT,EAAK,IAAM,GAClBxT,EAAK,EAAEwT,EAAK,IAAMzT,GAGtB,OAAIA,GAAMC,GAKJD,EAAK,EAAIvC,IAAUuC,IAAAA,EAAK,EAAIvC,GAAK,GAEjCwC,EAAK,EAAI3C,IAAU2C,IAAAA,EAAK,EAAI3C,GAAK,GAE9B,CACL,CAAC,IAAKW,EAAI+B,EAAIlD,CAAC,EACf,CAAC,IAAKW,EAAIuC,EAAK,CAAC,EAChB,CAAC,IAAKA,EAAI,EAAGA,EAAIC,CAAE,EACnB,CAAC,IAAK3C,EAAI2C,EAAK,CAAC,EAChB,CAAC,IAAK,EAAGA,EAAI,CAACD,EAAIC,CAAE,EACpB,CAAC,IAAK,CAACxC,EAAIuC,EAAK,CAAC,EACjB,CAAC,IAAK,CAACA,EAAI,EAAG,CAACA,EAAI,CAACC,CAAE,EACtB,CAAC,IAAK,CAAC3C,EAAI2C,EAAK,CAAC,EACjB,CAAC,IAAK,EAAG,CAACA,EAAID,EAAI,CAACC,CAAE,CACvB,GAGK,CAAC,CAAC,IAAKhC,EAAGnB,CAAC,EAAG,CAAC,IAAKW,CAAC,EAAG,CAAC,IAAKH,CAAC,EAAG,CAAC,IAAKW,CAAC,EAAG,CAAC,GAAG,CAAC,CAC1D,EAYM6V,GACJC,GACG,CACG,MAAAC,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEhD,GAAAG,GAAW,CAAC,GAAGF,EAAiB,MAAM,EAAE,MAAOxX,GAAM0X,IAAY1X,CAAC,EACpE,MAAM,UAAU,GAAGuM,CAAK,MAAMmL,CAAO,qBAAqB,EAGtD,MAAAC,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAElBF,EACSG,EAAA,QAAS1X,GAAM,CACxB2X,EAAO3X,CAAC,EAAIqX,EAAQ,aAAarX,CAAC,CAAA,CACnC,EAEM,OAAA,OAAO2X,EAAQN,CAAO,EAI/B,IAAI7C,EAAY,CAAC,EAsBjB,OAnBIiD,IAAS,SACXjD,EAAYyC,GAAcU,CAA+B,EAChDF,IAAS,UAClBjD,EAAY0C,GAAeS,CAAgC,EAClD,CAAC,WAAY,SAAS,EAAE,SAASF,CAAI,EAC9CjD,EAAYwC,GAAYW,CAA6B,EAC5CF,IAAS,OAClBjD,EAAY2C,GAAiBQ,CAA6B,EACjDF,IAAS,OAClBjD,EAAYsC,GAAYa,CAA6B,EAC5C,CAAC,QAAS,MAAM,EAAE,SAASF,CAAI,IAC5BjD,EAAAtG,EACVqJ,EACIF,EAAQ,aAAa,GAAG,GAA0C,GACjEA,EAAsB,GAAK,EAClC,GAIEnB,GAAY1B,CAAS,GAAKA,EAAU,OAC/BA,EAEF,EACT,ECtKMoD,GAAc,CAClBP,EACAQ,EACAC,IAC2B,CAC3B,MAAMC,EAAMD,GAAiB,SACvBR,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEpD,GAAIG,IAAY,OACd,MAAM,UAAU,GAAGnL,CAAK,MAAMmL,CAAO,6BAA6B,EAEpE,GAAIA,GAAWF,EAAgB,MAAOxX,GAAM0X,IAAY1X,CAAC,EACvD,MAAM,UAAU,GAAGuM,CAAK,MAAMmL,CAAO,qBAAqB,EAG5D,MAAMvL,EAAO8L,EAAI,gBAAgB,6BAA8B,MAAM,EAC/DN,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAGhB7L,EAAQE,EAAe,MACvB0I,EAAY4C,GAAiBC,CAAO,EACpCW,EAAcxD,GAAaA,EAAU,OACvC5B,GAAa4B,EAAW5I,CAAK,EAC7B,GAwBA,OAtBA2L,GACSG,EAAA,QAAS1X,GAAM,CACxB2X,EAAO3X,CAAC,EAAIqX,EAAQ,aAAarX,CAAC,CAAA,CACnC,EAEM,OAAA,OAAOqX,EAAQ,UAAU,EAAE,QAAQ,CAAC,CAAE,KAAAY,EAAM,MAAAC,KAAY,CACxDR,EAAW,SAASO,CAAI,GAAQhM,EAAA,aAAagM,EAAMC,CAAK,CAAA,CAC9D,IAEM,OAAA,OAAOP,EAAQN,CAAO,EAE7B,OAAO,KAAKM,CAAM,EAAE,QAAShW,GAAM,CAC7B,CAAC+V,EAAW,SAAS/V,CAAC,GAAKA,IAAM,QAC9BsK,EAAA,aACHtK,EAAE,QAAQ,SAAWhB,GAAM,IAAIA,EAAE,YAAa,CAAA,EAAE,EAChDgX,EAAOhW,CAAC,CACV,CACF,CACD,GAIC+U,GAAYsB,CAAW,GACpB/L,EAAA,aAAa,IAAK+L,CAAW,EAC9BH,GAAWN,IACLF,EAAA,OAAOpL,EAAMoL,CAAO,EAC5BA,EAAQ,OAAO,GAEVpL,GAEF,EACT,ECtEMkM,GAAiB,CACrB9J,EACAqE,EACAd,EACAwG,IACiB,CACX,KAAA,CAAClM,CAAW,EAAImC,EAChB,CAAE,MAAOgK,CAAA,EAAiBvM,EAC1BF,EACFyM,EAEEC,EAAe5F,EAAc,MAAM,CAAC,EACpC,CAAE,GAAAjQ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,EAAArB,EAAG,EAAAnB,GAAMwR,EAC3B,CAAC2G,EAAIC,CAAE,EAAIF,EAAa,MAAM,EAAE,EAChC3F,EAAStE,EAQf,GANK,KAAK,SAASnC,CAAW,IAE5B0F,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV1F,IAAgB,IAAK,CACvB,GAAIP,EAAQpK,EAAGqK,CAAK,IAAMD,EAAQ4M,EAAI3M,CAAK,EAClC,MAAA,CAAC,IAAK4M,CAAE,EACjB,GAAW7M,EAAQvL,EAAGwL,CAAK,IAAMD,EAAQ6M,EAAI5M,CAAK,EACzC,MAAA,CAAC,IAAK2M,CAAE,CACjB,SACSrM,IAAgB,IAAK,CACxB,KAAA,CAACuM,EAAKC,CAAG,EAAIJ,EAInB,GAHA1G,EAAO,GAAK6G,EACZ7G,EAAO,GAAK8G,EAGV,KAAK,SAASN,CAAW,IACvBzM,EAAQ8M,EAAK7M,CAAK,IAAMD,EAAQlJ,EAAK,EAAIE,EAAIiJ,CAAK,GAClDD,EAAQ+M,EAAK9M,CAAK,IAAMD,EAAQjJ,EAAK,EAAIE,EAAIgJ,CAAK,GACjDD,EAAQlJ,EAAImJ,CAAK,IAAMD,EAAQhJ,EAAK,EAAIpB,EAAGqK,CAAK,GAC/CD,EAAQjJ,EAAIkJ,CAAK,IAAMD,EAAQ/I,EAAK,EAAIxC,EAAGwL,CAAK,GAE7C,MAAA,CACL,IACA0M,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,CAChB,CACF,SACSpM,IAAgB,IAAK,CACxB,KAAA,CAACoF,EAAIC,CAAE,EAAI+G,EAKf,GAJF1G,EAAO,GAAKN,EACZM,EAAO,GAAKL,EAGV,KAAK,SAAS6G,CAAW,GACzBzM,EAAQ2F,EAAI1F,CAAK,IAAMD,EAAQlJ,EAAK,EAAIE,EAAIiJ,CAAK,GACjDD,EAAQ4F,EAAI3F,CAAK,IAAMD,EAAQjJ,EAAK,EAAIE,EAAIgJ,CAAK,EAEjD,MAAO,CAAC,IAAK0M,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,CAC/C,CAIK,OAAA3F,CACT,EClFMgG,GAAe,CACnBtK,EACAwE,IACG,CACH,MAAMhB,EAAUxD,EAAQ,MAAM,CAAC,EAAe,IAAK/N,GACjDqL,EAAQrL,EAAGuS,CAAW,CACxB,EACA,MAAO,CAACxE,EAAQ,CAAC,CAAyB,EAAE,OAAOwD,CAAM,CAC3D,ECOM+G,GAAe,CAACzK,EAAsB0E,IAAyB,CAC7D,MAAA5G,EAAOkD,GAAehB,CAAS,EAE/BvC,EAAQ,OAAOiH,GAAgB,UAAYA,GAAe,EAC5DA,EACqC,EAEnCgG,EAAc,CAAE,GAAGtG,EAAa,EAEhCuG,EAAkB,CAAC,EACzB,IAAI5M,EAAc,IACdkM,EAAc,IAElB,OAAOzJ,EAAQ1C,EAAM,CAACwG,EAAKlS,EAAG+N,EAAOC,IAAU,CAC7CsK,EAAY,EAAIvK,EAChBuK,EAAY,EAAItK,EACV,MAAAwK,EAAoB7G,GAAiBO,EAAKoG,CAAW,EAC3D,IAAIlG,EAASF,EAKb,GAJA,CAACvG,CAAW,EAAIuG,EAGhBqG,EAAgBvY,CAAC,EAAI2L,EACjB3L,EAAG,CAES6X,EAAAU,EAAgBvY,EAAI,CAAC,EACnC,MAAMyY,EAAeb,GACnB1F,EACAsG,EACAF,EACAT,CACF,EACMa,EAAaN,GAAaK,EAAcpN,CAAK,EAC7CsN,EAAYD,EAAW,KAAK,EAAE,EAC9BE,EAAkB/J,GAAkB4J,EAAczY,EAAG+N,EAAOC,CAAK,EACjE6K,EAAaT,GAAaQ,EAAiBvN,CAAK,EAChDyN,EAAYD,EAAW,KAAK,EAAE,EACpCzG,EAASuG,EAAU,OAASG,EAAU,OAASJ,EAAaG,CAAA,CAG9D,MAAM1K,EAASqK,EAAkB,OACjC,OAAAF,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,EAC9CmK,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,EAC9CmK,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,GAAKmK,EAAY,GAC/DA,EAAY,GAAK,CAACE,EAAkBrK,EAAS,CAAC,GAAKmK,EAAY,GAExDlG,CAAA,CACR,CACH,ECzCM2G,GAAenL,GAAyB,CACtC,MAAAoL,EAAepK,GAAehB,CAAS,EACvCqL,EAAiBtF,GAAcqF,CAAY,EAC3CE,EAAOF,EAAa,OACpBG,EAAWH,EAAaE,EAAO,CAAC,EAAE,CAAC,IAAM,IAEzCE,EAAehL,EAAQ4K,EAAc,CAAClL,EAAS9N,IAAM,CACnD,MAAAwY,EAAoBS,EAAejZ,CAAC,EACpCqZ,EAAUrZ,GAAKgZ,EAAahZ,EAAI,CAAC,EACjC6X,EAAcwB,GAAWA,EAAQ,CAAC,EAClCC,EAAUN,EAAahZ,EAAI,CAAC,EAC5BuZ,EAAcD,GAAWA,EAAQ,CAAC,EAClC,CAAC3N,CAAW,EAAImC,EAChB,CAAC9M,EAAG,CAAC,EAAIiY,EAAejZ,EAAIA,EAAI,EAAIkZ,EAAO,CAAC,EAAE,MAAM,EAAE,EAC5D,IAAI9G,EAAStE,EAEb,OAAQnC,EAAa,CACnB,IAAK,IACHyG,EAAU+G,EAAW,CAAC,GAAG,EAAI,CAACxN,EAAa3K,EAAG,CAAC,EAC/C,MACF,IAAK,IACMoR,EAAA,CACPzG,EACAmC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,IAAM,EAAI,EAAI,EACvB9M,EACA,CACF,EACA,MACF,IAAK,IACCsY,GAAWC,IAAgB,IACpBnH,EAAA,CAAC,IAAKtE,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG9M,EAAG,CAAC,EAElCoR,EAAA,CACPzG,EACAmC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACT9M,EACA,CACF,EAEF,MACF,IAAK,IAED6W,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpBnH,EAAA,CACP,IACAoG,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAESoR,EAAA,CACPzG,EACA6M,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAEF,MACF,IAAK,IACCsY,GAAWC,IAAgB,IACpBnH,EAAA,CAAC,IAAKpR,EAAG,CAAC,EAEVoR,EAAA,CAACzG,EAAamC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG9M,EAAG,CAAC,EAErD,MACF,IAAK,IAED6W,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpBnH,EAAA,CACP,IACAoG,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBxX,EACA,CACF,EAESoR,EAAA,CAACzG,EAAa3K,EAAG,CAAC,EAE7B,MACF,IAAK,IACMoR,EAAA,CAAC,IAAKpR,EAAG,CAAC,EACnB,MACF,IAAK,IACMoR,EAAA,CAACzG,EAAa3K,CAAC,EACxB,MACF,IAAK,IACMoR,EAAA,CAACzG,EAAa,CAAC,EACxB,MACF,QACWyG,EAAA,CAACzG,CAA0C,EAAE,OACpDmC,EAAQ,MAAM,EAAG,EAAE,EACnB9M,EACA,CACF,CAAA,CAGG,OAAAoR,CAAA,CACR,EAED,OACE+G,EACIC,EAAa,QAAQ,EACrB,CAACA,EAAa,CAAC,CAAgB,EAAE,OAAOA,EAAa,MAAM,CAAC,EAAE,SAAS,CAE/E,EC3HMI,GAAa5L,GAAsC,CACvD,MAAM6L,EAAY,CAAC,EACf,IAAA/N,EACAgO,EAAK,GACL1Y,EAAI,EACJnB,EAAI,EACJ2O,EAAK,EACLC,EAAK,EACH,MAAA4C,EAAS,CAAE,GAAGW,EAAa,EAEvB,OAAApE,EAAA,QAASsE,GAAQ,CACnB,KAAA,CAACvG,CAAW,EAAIuG,EAChBjE,EAAatC,EAAY,YAAY,EACrCmD,EAAanD,EAAY,YAAY,EACrC4C,EAAa5C,IAAgBmD,EAC7BwC,EAASY,EAAI,MAAM,CAAC,EAEtBjE,IAAe,KACXyL,GAAA,EACL,CAAA1Y,EAAGnB,CAAC,EAAIyR,EACJtQ,GAAAuN,EAAa8C,EAAO,EAAI,EACxBxR,GAAA0O,EAAa8C,EAAO,EAAI,EACxB7C,EAAAxN,EACAyN,EAAA5O,EACL6L,EAAO,CAAE6C,EAAa,CAACN,EAAYO,EAAIC,CAAE,EAAIyD,CAAgB,IAEzDjE,IAAe,KACbjN,EAAAwN,EACA3O,EAAA4O,GACKR,IAAe,KACvB,CAAE,CAAAjN,CAAC,EAAIkR,EACRlR,GAAKuN,EAAa8C,EAAO,EAAyC,GACzDpD,IAAe,KACvB,CAAE,CAAApO,CAAC,EAAIqS,EACRrS,GAAK0O,EAAa8C,EAAO,EAAyC,IAElE,CAACrQ,EAAGnB,CAAC,EAAIqS,EAAI,MAAM,EAAE,EAChBlR,GAAAuN,EAAa8C,EAAO,EAAI,EACxBxR,GAAA0O,EAAa8C,EAAO,EAAI,GAE/B3F,EAAK,KAAKwG,CAAG,GAGfb,EAAO,EAAIrQ,EACXqQ,EAAO,EAAIxR,EACX4Z,EAAUC,CAAE,EAAIhO,CAAA,CACjB,EAEM+N,CACT,ECzDME,GAAgBC,GAAgD,CAChE,IAAAC,EAAS,IAAIC,EACX,KAAA,CAAE,OAAAC,GAAWH,EACb,CAACI,EAASC,CAAO,EAAIF,EACrB,CAAE,UAAAG,GAAcN,EAChB,CAAE,OAAAO,GAAWP,EACb,CAAE,KAAAQ,GAASR,EACX,CAAE,MAAAS,GAAUT,EAIhB,OAAA,MAAM,QAAQM,CAAS,GACvBA,EAAU,QAAU,GACpBA,EAAU,MAAOlZ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACxCkZ,EAAU,KAAMlZ,GAAMA,IAAM,CAAC,EAEpB6Y,EAAAA,EAAO,UAAU,GAAIK,CAAuC,EAC5D,OAAOA,GAAc,UAAY,CAAC,OAAO,MAAMA,CAAS,IACxDL,EAAAA,EAAO,UAAUK,CAAS,IAGjCC,GAAUC,GAAQC,KAEXR,EAAAA,EAAO,UAAUG,EAASC,CAAO,EAIxC,MAAM,QAAQE,CAAM,GACpBA,EAAO,QAAU,GACjBA,EAAO,MAAOnZ,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACrCmZ,EAAO,KAAMnZ,GAAMA,IAAM,CAAC,EAEjB6Y,EAAAA,EAAO,OAAO,GAAIM,CAAoC,EACtD,OAAOA,GAAW,UAAY,CAAC,OAAO,MAAMA,CAAM,IAClDN,EAAAA,EAAO,OAAOM,CAAM,GAK7B,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAW,GAAKA,EAAK,MAAOpZ,GACtD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACboZ,EAAK,KAAMpZ,GAAMA,IAAM,CAAC,GAEpB6Y,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,EAClCA,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,GAClC,OAAOO,GAAS,UAAY,CAAC,OAAO,MAAMA,CAAI,IAC9CP,EAAAA,EAAO,MAAMO,CAAI,GAK1B,MAAM,QAAQC,CAAK,GAAKA,EAAM,QAAU,GAAKA,EAAM,MAAOrZ,GACxD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACbqZ,EAAM,KAAMrZ,GAAMA,IAAM,CAAC,EAErB6Y,EAAAA,EAAO,MAAM,GAAIQ,CAAmC,EACpD,OAAOA,GAAU,UAAY,CAAC,OAAO,MAAMA,CAAK,IAChDR,EAAAA,EAAO,MAAMQ,CAAK,GAG7BR,EAASA,EAAO,UAAU,CAACG,EAAS,CAACC,CAAO,GAGvCJ,CACT,EC9DMS,GAAiB,CACrBC,EACAjZ,IACqC,CACjC,IAAAlB,EAAI0Z,EAAU,UAAUxY,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE5C,UAAOlB,EAAE,GAAG,EAAIkB,EACZlB,EAAAma,EAAK,SAASna,CAAC,EAEZ,CAACA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,GAAG,CACpC,EAgBMoa,GAAe,CACnBpa,EACAqa,EACAV,IACe,CACf,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAC9B,CAAC/Y,EAAGnB,EAAGP,CAAC,EAAIgb,GAAela,EAAG,CAACqa,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG,EAAG,CAAC,CAAC,EAE5DE,EAAoB3Z,EAAIgZ,EACxBY,EAAoB/a,EAAIoa,EACxBY,EAAoBvb,EAAIob,EAEvB,MAAA,CAELC,GAAqB,KAAK,IAAID,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEb,EACAY,GAAqB,KAAK,IAAIF,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEZ,CACF,CACF,EChCMa,GAAgB,CACpBlN,EACAgM,IACG,CAEH,IAAI5Y,EAAI,EACJnB,EAAI,EAEJkb,EAAK,EACLC,EAAK,EAEL/S,EAAI,EACJgT,EAAK,EACLtP,EAAc,IAEZ,MAAAD,EAAOiC,EAAgBC,CAAS,EAChCsN,EAAiBtB,GAAa,OAAO,KAAKA,CAAS,EAGzD,GAAI,CAACA,GAAcsB,GAAkB,CAACA,EAAe,OAC5C,OAAAxP,EAAK,MAAM,CAAC,EAIhBkO,EAAU,QACb,OAAO,OAAOA,EAAW,CAAE,OAAQrO,EAAe,OAAQ,EAE5D,MAAMwO,EAASH,EAAU,OACnBuB,EAAiBxB,GAAaC,CAAkC,EAEtE,OAAIuB,EAAe,WAAmBzP,EAAK,MAAM,CAAC,EAE3C0C,EAAuB1C,EAAM,CAACwG,EAAKlG,EAAO+B,EAAOC,IAAU,CAChE,CAACrC,CAAW,EAAIuG,EACV,MAAAjE,EAAatC,EAAY,YAAY,EAErCwH,EADalF,IAAetC,EAE9BkC,GAAkBqE,EAAKlG,EAAO+B,EAAOC,CAAK,EACzCkE,EAAI,MAAM,CAAC,EAEhB,IAAIE,EAASnE,IAAe,IAEvB,CAAC,GAAsB,EAAE,OAC1BgB,GACElB,EACAC,EACAmF,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,CAAA,CACnB,EAEAlF,IAAe,IACd,CAAC,IAAKF,EAAOoF,EAAgB,CAAC,CAAC,EAChClF,IAAe,IACd,CAAC,IAAKkF,EAAgB,CAAC,EAAGnF,CAAK,EAChCmF,EAGJxH,EAAcyG,EAAO,CAAC,EACtB,MAAMgJ,EAAYzP,IAAgB,KAAOyG,EAAO,OAAS,EACnDiJ,EACHD,EAAYhJ,EAAO,MAAM,EAAG,CAAC,EAAIA,EAAO,MAAM,CAAC,EAalD,GAXIgJ,IACG1P,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAAkC,EAAE,OACnCoG,EAAO,MAAM,CAAC,CAAA,CAElB,EACSA,EAAAiJ,GAGP1P,IAAgB,IAClB,CAACoP,EAAIC,CAAE,EAAIR,GAAaW,EAAgB,CACrC/I,EAAoB,CAAC,EACrBA,EAAoB,CAAC,GACrB2H,CAAM,EAGL/Y,IAAM+Z,GAAMlb,IAAMmb,EACX5I,EAAA,CAAC,IAAK2I,EAAIC,CAAE,EACZnb,IAAMmb,EACN5I,EAAA,CAAC,IAAK2I,CAAE,EACR/Z,IAAM+Z,IACN3I,EAAA,CAAC,IAAK4I,CAAE,OAGd,KAAA/S,EAAI,EAAGgT,EAAK7I,EAAO,OAAQnK,EAAIgT,EAAIhT,GAAK,EAC1C,CAAA8S,EAAIC,CAAE,EAAIR,GACTW,EACA,CAAC,CAAC/I,EAAOnK,CAAC,EAAG,CAACmK,EAAOnK,EAAI,CAAC,CAAC,EAC3B8R,CACF,EACA3H,EAAOnK,CAAC,EAAI8S,EACL3I,EAAAnK,EAAI,CAAC,EAAI+S,EAIhB,OAAAha,EAAA+Z,EACAlb,EAAAmb,EAEG5I,CAAA,CACR,CACH,EC/HMkJ,GAAgB5P,GAAqB,CACzC,MAAM6P,EAAe7P,EAClB,MAAM,CAAC,EACP,IAAI,CAAC1K,EAAGhB,EAAGwb,IACTxb,EAEGwb,EAAUxb,EAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAOgB,EAAE,MAAM,CAAC,CAAC,EAD5C0K,EAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO1K,EAAE,MAAM,CAAC,CAAa,CACF,EAEjD,IAAKA,GAAMA,EAAE,IAAI,CAAC4S,EAAG5T,IAAMgB,EAAEA,EAAE,OAAShB,EAAI,GAAK,EAAKA,EAAI,EAAG,CAAC,CAAC,EAC/D,QAAQ,EAEX,MAAO,CAAC,CAAC,GAA2B,EAAE,OAAOub,EAAa,CAAC,EAAE,MAAM,EAAG,CAAC,CAAC,CAAC,EACtE,OACCA,EAAa,IAAKva,GAAM,CAAC,GAA2B,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,CAC1E,CACJ,ECXMya,GAAY,CAAC/P,EAAiB4G,IAAiC,CAC/D,GAAA,CAAE,MAAAjH,GAAUE,EAWhB,OATAF,EAAQiH,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOjH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAGrCA,IAAU,MAAcK,EAAK,MAAM,CAAC,EAEjC0C,EAAqB1C,EAAOoC,GAC1BsK,GAAatK,EAASzC,CAAK,CACnC,CACH,ECpBMqQ,GAAa,CACjBC,EACAC,EAAQ,KACyB,CACjC,MAAMja,EAAIia,EACJC,EAAKF,EAAI,MAAM,EAAG,CAAC,EACnBrU,EAAKqU,EAAI,MAAM,EAAG,CAAC,EACnBpU,EAAKoU,EAAI,MAAM,EAAG,CAAC,EACnBlU,EAAKkU,EAAI,MAAM,EAAG,CAAC,EACnBnU,EAAK9F,EAASma,EAAIvU,EAAI3F,CAAC,EACvBma,EAAKpa,EAAS4F,EAAIC,EAAI5F,CAAC,EACvBoa,EAAKra,EAAS6F,EAAIE,EAAI9F,CAAC,EACvBqa,EAAKta,EAAS8F,EAAIsU,EAAIna,CAAC,EACvBsa,EAAKva,EAASoa,EAAIC,EAAIpa,CAAC,EACvBua,EAAKxa,EAASsa,EAAIC,EAAIta,CAAC,EAEtB,MAAA,CACL,CAAC,IAAK6F,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGwU,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,EAC9C,CAAC,IAAKD,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGF,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGtU,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAChD,CACF,EC6DA,MAAM0U,EAAiB,CAWrB,YAAYlQ,EAAmBmL,EAA2B,CAClD,MAAAgF,EAAkBhF,GAAU,CAAC,EAC7BiF,EAAY,OAAOpQ,EAAc,IAEnC,GAAAoQ,GAAa,CAACpQ,EAAU,OACpB,MAAA,UACJ,GAAGH,CAAK,oBAAoBuQ,EAAY,YAAc,OAAO,EAC/D,EAGG,KAAA,SAAW1O,EAAgB1B,CAAS,EAGzC,KAAM,CAAE,MAAOqG,EAAa,OAAQgK,CAAiB,EAAAF,EACjD,IAAA/Q,EAEA,OAAO,UAAUiH,CAAW,GAAKA,IAAgB,MAC3CjH,EAAAiH,EAERjH,EAAQE,EAAe,MAKzB,IAAIwO,EAASxO,EAAe,OAE5B,GAAI,MAAM,QAAQ+Q,CAAY,GAAKA,EAAa,QAAU,EAAG,CAC3D,KAAM,CAACtC,EAASC,EAASS,CAAO,EAAI4B,EAAa,IAAI,MAAM,EAClDvC,EAAA,CACN,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMS,CAAO,EAAc,EAAVA,CAC3B,CAAA,CAGF,YAAK,MAAQrP,EACb,KAAK,OAAS0O,EAEP,IAAA,CAET,IAAI,MAAO,CACF,OAAAvH,GAAY,KAAK,QAAQ,CAAA,CAElC,IAAI,QAAS,CACJ,OAAAgB,EAAe,KAAK,QAAQ,CAAA,CASrC,SAAU,CACR,OAAO,KAAK,IAAA,CASd,gBAAiB,CACf,OAAO,KAAK,MAAA,CAWd,iBAAiB/Q,EAAgB,CACxB,OAAAoR,GAAiB,KAAK,SAAUpR,CAAM,CAAA,CAQ/C,YAAa,CACL,KAAA,CAAE,SAAA0K,GAAa,KAChB,YAAA,SAAWyB,GAAezB,CAAQ,EAChC,IAAA,CAQT,YAAa,CACL,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAW6B,GAAe7B,CAAQ,EAChC,IAAA,CAST,SAAU,CACF,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAW8E,GAAY9E,CAAQ,EAC7B,IAAA,CAST,QAAQoP,EAAuB,CACvB,KAAA,CAAE,SAAApP,GAAa,KACfqP,EAAQhD,GAAUrM,CAAQ,EAC1BsP,EAAUD,EAAM,OAAS,EAAIA,EAAQ,GAErCE,EAAoBD,EACtBA,EAAQ,IAAI,CAACzb,EAAGhB,IACVuc,EACKvc,EAAI+Y,GAAY/X,CAAC,EAAIA,EAAE,MAAM,CAAC,EAEhC+X,GAAY/X,CAAC,CACrB,EACDmM,EAAS,MAAM,CAAC,EAEpB,IAAIzB,EAAO,CAAC,EACZ,OAAI+Q,EACK/Q,EAAAgR,EAAkB,KAAK,CAAC,EAExBhR,EAAA6Q,EAAcpP,EAAW4L,GAAY5L,CAAQ,EAGjD,KAAA,SAAWzB,EAAK,MAAM,CAAC,EACrB,IAAA,CAUT,WAAY,CACJ,KAAA,CAAE,SAAAyB,GAAa,KAChB,YAAA,SAAWwG,GAAcxG,CAAQ,EAC/B,IAAA,CAWT,UAAW,CACH,KAAA,CAAE,SAAAA,GAAa,KACf9B,EAAQ,KAAK,QAAU,MAAQ,EAAI,KAAK,MAEzC,YAAA,SAAWgN,GAAalL,EAAU9B,CAAK,EACrC,IAAA,CAWT,UAAUsR,EAAmC,CAEzC,GAAA,CAACA,GACD,OAAOA,GAAW,UACjB,OAAOA,GAAW,UACjB,CAAC,CAAC,YAAa,SAAU,OAAQ,OAAO,EAAE,KAAM3b,GAAMA,KAAK2b,CAAM,EAE5D,OAAA,KAGH,KAAA,CACJ,SAAAxP,EACA,OAAQ,CAAC3J,EAAIC,EAAImZ,CAAE,CAAA,EACjB,KACEhD,EAAY,CAAC,EACnB,SAAW,CAACxY,EAAGE,CAAC,IAAK,OAAO,QAAQqb,CAAM,EAEpCvb,IAAM,QAAU,MAAM,QAAQE,CAAC,IAGhCF,IAAM,UACLA,IAAM,aACNA,IAAM,UACNA,IAAM,UACR,MAAM,QAAQE,CAAC,EANfsY,EAAUxY,CAAC,EAAIE,EAAE,IAAI,MAAM,EASlBF,IAAM,UAAY,OAAO,OAAOE,CAAC,GAAM,WACtCsY,EAAAxY,CAAC,EAAI,OAAOE,CAAC,GAMrB,KAAA,CAAE,OAAAyY,GAAWH,EAEnB,GAAI,MAAM,QAAQG,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAAO,IAAI,MAAM,EACrDH,EAAU,OAAS,CAChB,OAAO,MAAMI,CAAO,EAAcxW,EAAVwW,EACxB,OAAO,MAAMC,CAAO,EAAcxW,EAAVwW,EACzBS,GAAWkC,CACb,CAAA,MAEAhD,EAAU,OAAS,CAACpW,EAAIC,EAAImZ,CAAE,EAG3B,YAAA,SAAW9B,GAAc3N,EAAUyM,CAAS,EAC1C,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAApW,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,EAAG,IAAK,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAAD,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,IAAK,EAAG,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAUT,UAAW,CACT,OAAO4O,GAAa,KAAK,SAAU,KAAK,KAAK,CAAA,CAS/C,SAAU,CACD,OAAA,KAAK,IAAI,EAAE,QAASwK,GAAQ,OAAO,KAAKA,CAAwB,CAAC,CAAA,CAG1E,WAAW,WAAY,CACd,OAAA/C,CAAA,CAET,WAAW,UAAW,CACb,OAAApS,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiC,EAAA,CAGT,WAAW,YAAa,CACf,OAAAc,EAAA,CAET,WAAW,WAAY,CACd,OAAA5H,EAAA,CAET,WAAW,cAAe,CACjB,OAAAkI,EAAA,CAET,WAAW,WAAY,CACd,OAAAD,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAA8D,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAI,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiD,EAAA,CAET,WAAW,cAAe,CACjB,OAAAI,EAAA,CAET,WAAW,oBAAqB,CACvB,OAAArQ,EAAA,CAET,WAAW,UAAW,CACb,OAAAN,CAAA,CAET,WAAW,cAAe,CACjB,OAAAwJ,EAAA,CAET,WAAW,SAAU,CACZ,OAAAE,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAuC,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAlC,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAW,CAAA,CAET,WAAW,cAAe,CACjB,OAAAY,EAAA,CAET,WAAW,SAAU,CACZ,OAAAb,CAAA,CAET,WAAW,cAAe,CACjB,OAAAY,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAE,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAH,EAAA,CAET,WAAW,SAAU,CACZ,OAAAF,EAAA,CAET,WAAW,aAAc,CAChB,OAAApB,CAAA,CAET,WAAW,cAAe,CACjB,OAAAwG,EAAA,CAET,WAAW,YAAa,CACf,OAAA8K,EAAA,CAET,WAAW,UAAW,CACb,OAAA/Q,EAAA,CAET,WAAW,WAAY,CACd,OAAAM,EAAA,CAET,WAAW,aAAc,CAChB,OAAAa,EAAA,CAET,WAAW,YAAa,CACf,OAAAL,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAkQ,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAA1H,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAG,EAAA,CAET,WAAW,aAAc,CAChB,OAAAD,EAAA,CAET,WAAW,aAAc,CAChB,OAAA/C,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAqB,EAAA,CAET,WAAW,uBAAwB,CAC1B,OAAAG,EAAA,CAET,WAAW,sBAAuB,CACzB,OAAAK,EAAA,CAET,WAAW,oBAAqB,CACvB,OAAAoB,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAC,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAlC,CAAA,CAET,WAAW,iBAAkB,CACpB,OAAAqC,EAAA,CAET,WAAW,cAAe,CACjB,OAAAG,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAF,EAAA,CAET,WAAW,aAAc,CAChB,OAAAH,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAAM,EAAA,CAET,WAAW,iBAAkB,CACpB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAC,EAAA,CAET,WAAW,aAAc,CAChB,OAAAiB,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAR,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAhJ,EAAA,CAET,WAAW,YAAa,CACf,OAAAoB,EAAA,CAET,WAAW,cAAe,CACjB,OAAA0K,EAAA,CAET,WAAW,SAAU,CACZ,OAAAvL,CAAA,CAET,WAAW,aAAc,CAChB,OAAA+C,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAwC,EAAA,CAET,WAAW,kBAAmB,CACrB,OAAAhC,EAAA,CAET,WAAW,cAAe,CACjB,OAAA0G,EAAA,CAET,WAAW,cAAe,CACjB,OAAAmC,EAAA,CAET,WAAW,aAAc,CAChB,OAAA1J,EAAA,CAET,WAAW,mBAAoB,CACtB,OAAAjC,EAAA,CAET,WAAW,cAAe,CACjB,OAAAyM,EAAA,CAET,WAAW,aAAc,CAChB,OAAAvC,EAAA,CAET,WAAW,WAAY,CACd,OAAA0C,EAAA,CAET,WAAW,cAAe,CACjB,OAAArD,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAhH,EAAA,CAET,WAAW,gBAAiB,CACnB,OAAAwG,EAAA,CAET,WAAW,YAAa,CACf,OAAA8D,EAAA,CAET,WAAW,WAAY,CACd,OAAAlC,EAAA,CAET,WAAW,eAAgB,CAClB,OAAAsB,EAAA,CAEX","x_google_ignoreList":[0]} +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file