fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 18.4 kB
Source Map (JSON)
{"version":3,"file":"PencilBrush.mjs","sources":["../../../src/brushes/PencilBrush.ts"],"sourcesContent":["import type { ModifierKey, TEvent } from '../EventTypeDefs';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Path } from '../shapes/Path';\nimport { getSmoothPathFromPoints, joinPath } from '../util/path';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { TSimplePathData } from '../util/path/typedefs';\n\n/**\n * @private\n * @param {TSimplePathData} pathData SVG path commands\n * @returns {boolean}\n */\nfunction isEmptySVGPath(pathData: TSimplePathData): boolean {\n return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';\n}\n\nexport class PencilBrush extends BaseBrush {\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate = 0.4;\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine = false;\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {ModifierKey | undefined | null}\n */\n straightLineKey: ModifierKey | undefined | null = 'shiftKey';\n\n protected declare _points: Point[];\n protected declare _hasStraightLine: boolean;\n protected declare oldEnd?: Point;\n\n constructor(canvas: Canvas) {\n super(canvas);\n this._points = [];\n this._hasStraightLine = false;\n }\n\n needsFullRender() {\n return super.needsFullRender() || this._hasStraightLine;\n }\n\n static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {\n const midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n }\n\n /**\n * Invoked on mouse down\n * @param {Point} pointer\n */\n onMouseDown(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._addPoint(pointer);\n this._render();\n }\n\n /**\n * Invoked on mouse move\n * @param {Point} pointer\n */\n onMouseMove(pointer: Point, { e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return;\n }\n this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._addPoint(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n } else {\n const points = this._points,\n length = points.length,\n ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = PencilBrush.drawSegment(\n ctx,\n points[length - 2],\n points[length - 1],\n );\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n\n /**\n * Invoked on mouse up\n */\n onMouseUp({ e }: TEvent) {\n if (!this.canvas._isMainEvent(e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n }\n\n /**\n * @private\n * @param {Point} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing(pointer: Point) {\n this._reset();\n this._addPoint(pointer);\n this.canvas.contextTop.moveTo(pointer.x, pointer.y);\n }\n\n /**\n * @private\n * @param {Point} point Point to be added to points array\n */\n _addPoint(point: Point) {\n if (\n this._points.length > 1 &&\n point.eq(this._points[this._points.length - 1])\n ) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n }\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n }\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {\n let p1 = this._points[0],\n p2 = this._points[1];\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n const width = this.width / 1000;\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (let i = 1; i < this._points.length; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n PencilBrush.drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Converts points to SVG path\n * @param {Point[]} points Array of points\n * @return {TSimplePathData} SVG path commands\n */\n convertPointsToSVGPath(points: Point[]): TSimplePathData {\n const correction = this.width / 1000;\n return getSmoothPathFromPoints(points, correction);\n }\n\n /**\n * Creates a Path object to add on canvas\n * @param {TSimplePathData} pathData Path data\n * @return {Path} Path to add on canvas\n */\n createPath(pathData: TSimplePathData): Path {\n const path = new Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new Shadow(this.shadow);\n }\n\n return path;\n }\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints(points: Point[], distance: number) {\n if (points.length <= 2) {\n return points;\n }\n let lastPoint = points[0],\n cDistance;\n const zoom = this.canvas.getZoom(),\n adjustedDistance = Math.pow(distance / zoom, 2),\n l = points.length - 1,\n newPoints = [lastPoint];\n for (let i = 1; i < l - 1; i++) {\n cDistance =\n Math.pow(lastPoint.x - points[i].x, 2) +\n Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n // Add the last point from the original line to the end of the array.\n // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n newPoints.push(points[l]);\n return newPoints;\n }\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new Path object\n * and add it to the canvas.\n */\n _finalizeAndAddPath() {\n const ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n const pathData = this.convertPointsToSVGPath(this._points);\n if (isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n const path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n}\n"],"names":["isEmptySVGPath","pathData","joinPath","PencilBrush","BaseBrush","constructor","canvas","_defineProperty","_points","_hasStraightLine","needsFullRender","drawSegment","ctx","p1","p2","midPoint","midPointFrom","quadraticCurveTo","x","y","onMouseDown","pointer","_ref","e","_isMainEvent","drawStraightLine","straightLineKey","_prepareForDrawing","_addPoint","_render","onMouseMove","_ref2","limitedToCanvasSize","_isOutSideCanvas","length","clearContext","contextTop","points","_saveAndTransform","oldEnd","beginPath","moveTo","stroke","restore","onMouseUp","_ref3","undefined","_finalizeAndAddPath","_reset","point","eq","pop","push","_setBrushStyles","_setShadow","arguments","width","i","lineTo","convertPointsToSVGPath","correction","getSmoothPathFromPoints","createPath","path","Path","fill","color","strokeWidth","strokeLineCap","strokeMiterLimit","strokeLineJoin","strokeDashArray","shadow","affectStroke","Shadow","decimatePoints","distance","lastPoint","cDistance","zoom","getZoom","adjustedDistance","Math","pow","l","newPoints","closePath","decimate","requestRenderAll","fire","add","setCoords","_resetShadow"],"mappings":";;;;;;AASA;AACA;AACA;AACA;AACA;AACA,SAASA,cAAcA,CAACC,QAAyB,EAAW;AAC1D,EAAA,OAAOC,QAAQ,CAACD,QAAQ,CAAC,KAAK,uBAAuB,CAAA;AACvD,CAAA;AAEO,MAAME,WAAW,SAASC,SAAS,CAAC;EA4BzCC,WAAWA,CAACC,MAAc,EAAE;IAC1B,KAAK,CAACA,MAAM,CAAC,CAAA;AA5Bf;AACF;AACA;AACA;AACA;AAJEC,IAAAA,eAAA,mBAKW,GAAG,CAAA,CAAA;AAEd;AACF;AACA;AACA;AACA;AACA;AACA;AANEA,IAAAA,eAAA,2BAOmB,KAAK,CAAA,CAAA;AAExB;AACF;AACA;AACA;AACA;AAJEA,IAAAA,eAAA,0BAKkD,UAAU,CAAA,CAAA;IAQ1D,IAAI,CAACC,OAAO,GAAG,EAAE,CAAA;IACjB,IAAI,CAACC,gBAAgB,GAAG,KAAK,CAAA;AAC/B,GAAA;AAEAC,EAAAA,eAAeA,GAAG;IAChB,OAAO,KAAK,CAACA,eAAe,EAAE,IAAI,IAAI,CAACD,gBAAgB,CAAA;AACzD,GAAA;AAEA,EAAA,OAAOE,WAAWA,CAACC,GAA6B,EAAEC,EAAS,EAAEC,EAAS,EAAE;AACtE,IAAA,MAAMC,QAAQ,GAAGF,EAAE,CAACG,YAAY,CAACF,EAAE,CAAC,CAAA;AACpCF,IAAAA,GAAG,CAACK,gBAAgB,CAACJ,EAAE,CAACK,CAAC,EAAEL,EAAE,CAACM,CAAC,EAAEJ,QAAQ,CAACG,CAAC,EAAEH,QAAQ,CAACI,CAAC,CAAC,CAAA;AACxD,IAAA,OAAOJ,QAAQ,CAAA;AACjB,GAAA;;AAEA;AACF;AACA;AACA;AACEK,EAAAA,WAAWA,CAACC,OAAc,EAAAC,IAAA,EAAiB;IAAA,IAAf;AAAEC,MAAAA,CAAAA;AAAU,KAAC,GAAAD,IAAA,CAAA;IACvC,IAAI,CAAC,IAAI,CAAChB,MAAM,CAACkB,YAAY,CAACD,CAAC,CAAC,EAAE;AAChC,MAAA,OAAA;AACF,KAAA;AACA,IAAA,IAAI,CAACE,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAACC,eAAe,IAAIH,CAAC,CAAC,IAAI,CAACG,eAAe,CAAC,CAAA;AACzE,IAAA,IAAI,CAACC,kBAAkB,CAACN,OAAO,CAAC,CAAA;AAChC;AACA;AACA,IAAA,IAAI,CAACO,SAAS,CAACP,OAAO,CAAC,CAAA;IACvB,IAAI,CAACQ,OAAO,EAAE,CAAA;AAChB,GAAA;;AAEA;AACF;AACA;AACA;AACEC,EAAAA,WAAWA,CAACT,OAAc,EAAAU,KAAA,EAAiB;IAAA,IAAf;AAAER,MAAAA,CAAAA;AAAU,KAAC,GAAAQ,KAAA,CAAA;IACvC,IAAI,CAAC,IAAI,CAACzB,MAAM,CAACkB,YAAY,CAACD,CAAC,CAAC,EAAE;AAChC,MAAA,OAAA;AACF,KAAA;AACA,IAAA,IAAI,CAACE,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAACC,eAAe,IAAIH,CAAC,CAAC,IAAI,CAACG,eAAe,CAAC,CAAA;AACzE,IAAA,IAAI,IAAI,CAACM,mBAAmB,KAAK,IAAI,IAAI,IAAI,CAACC,gBAAgB,CAACZ,OAAO,CAAC,EAAE;AACvE,MAAA,OAAA;AACF,KAAA;AACA,IAAA,IAAI,IAAI,CAACO,SAAS,CAACP,OAAO,CAAC,IAAI,IAAI,CAACb,OAAO,CAAC0B,MAAM,GAAG,CAAC,EAAE;AACtD,MAAA,IAAI,IAAI,CAACxB,eAAe,EAAE,EAAE;AAC1B;AACA;QACA,IAAI,CAACJ,MAAM,CAAC6B,YAAY,CAAC,IAAI,CAAC7B,MAAM,CAAC8B,UAAU,CAAC,CAAA;QAChD,IAAI,CAACP,OAAO,EAAE,CAAA;AAChB,OAAC,MAAM;AACL,QAAA,MAAMQ,MAAM,GAAG,IAAI,CAAC7B,OAAO;UACzB0B,MAAM,GAAGG,MAAM,CAACH,MAAM;AACtBtB,UAAAA,GAAG,GAAG,IAAI,CAACN,MAAM,CAAC8B,UAAU,CAAA;AAC9B;AACA,QAAA,IAAI,CAACE,iBAAiB,CAAC1B,GAAG,CAAC,CAAA;QAC3B,IAAI,IAAI,CAAC2B,MAAM,EAAE;UACf3B,GAAG,CAAC4B,SAAS,EAAE,CAAA;AACf5B,UAAAA,GAAG,CAAC6B,MAAM,CAAC,IAAI,CAACF,MAAM,CAACrB,CAAC,EAAE,IAAI,CAACqB,MAAM,CAACpB,CAAC,CAAC,CAAA;AAC1C,SAAA;QACA,IAAI,CAACoB,MAAM,GAAGpC,WAAW,CAACQ,WAAW,CACnCC,GAAG,EACHyB,MAAM,CAACH,MAAM,GAAG,CAAC,CAAC,EAClBG,MAAM,CAACH,MAAM,GAAG,CAAC,CACnB,CAAC,CAAA;QACDtB,GAAG,CAAC8B,MAAM,EAAE,CAAA;QACZ9B,GAAG,CAAC+B,OAAO,EAAE,CAAA;AACf,OAAA;AACF,KAAA;AACF,GAAA;;AAEA;AACF;AACA;EACEC,SAASA,CAAAC,KAAA,EAAgB;IAAA,IAAf;AAAEtB,MAAAA,CAAAA;AAAU,KAAC,GAAAsB,KAAA,CAAA;IACrB,IAAI,CAAC,IAAI,CAACvC,MAAM,CAACkB,YAAY,CAACD,CAAC,CAAC,EAAE;AAChC,MAAA,OAAO,IAAI,CAAA;AACb,KAAA;IACA,IAAI,CAACE,gBAAgB,GAAG,KAAK,CAAA;IAC7B,IAAI,CAACc,MAAM,GAAGO,SAAS,CAAA;IACvB,IAAI,CAACC,mBAAmB,EAAE,CAAA;AAC1B,IAAA,OAAO,KAAK,CAAA;AACd,GAAA;;AAEA;AACF;AACA;AACA;EACEpB,kBAAkBA,CAACN,OAAc,EAAE;IACjC,IAAI,CAAC2B,MAAM,EAAE,CAAA;AACb,IAAA,IAAI,CAACpB,SAAS,CAACP,OAAO,CAAC,CAAA;AACvB,IAAA,IAAI,CAACf,MAAM,CAAC8B,UAAU,CAACK,MAAM,CAACpB,OAAO,CAACH,CAAC,EAAEG,OAAO,CAACF,CAAC,CAAC,CAAA;AACrD,GAAA;;AAEA;AACF;AACA;AACA;EACES,SAASA,CAACqB,KAAY,EAAE;IACtB,IACE,IAAI,CAACzC,OAAO,CAAC0B,MAAM,GAAG,CAAC,IACvBe,KAAK,CAACC,EAAE,CAAC,IAAI,CAAC1C,OAAO,CAAC,IAAI,CAACA,OAAO,CAAC0B,MAAM,GAAG,CAAC,CAAC,CAAC,EAC/C;AACA,MAAA,OAAO,KAAK,CAAA;AACd,KAAA;IACA,IAAI,IAAI,CAACT,gBAAgB,IAAI,IAAI,CAACjB,OAAO,CAAC0B,MAAM,GAAG,CAAC,EAAE;MACpD,IAAI,CAACzB,gBAAgB,GAAG,IAAI,CAAA;AAC5B,MAAA,IAAI,CAACD,OAAO,CAAC2C,GAAG,EAAE,CAAA;AACpB,KAAA;AACA,IAAA,IAAI,CAAC3C,OAAO,CAAC4C,IAAI,CAACH,KAAK,CAAC,CAAA;AACxB,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;;AAEA;AACF;AACA;AACA;AACED,EAAAA,MAAMA,GAAG;IACP,IAAI,CAACxC,OAAO,GAAG,EAAE,CAAA;IACjB,IAAI,CAAC6C,eAAe,CAAC,IAAI,CAAC/C,MAAM,CAAC8B,UAAU,CAAC,CAAA;IAC5C,IAAI,CAACkB,UAAU,EAAE,CAAA;IACjB,IAAI,CAAC7C,gBAAgB,GAAG,KAAK,CAAA;AAC/B,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACEoB,EAAAA,OAAOA,GAAyD;AAAA,IAAA,IAAxDjB,GAA6B,GAAA2C,SAAA,CAAArB,MAAA,QAAAqB,SAAA,CAAA,CAAA,CAAA,KAAAT,SAAA,GAAAS,SAAA,CAAG,CAAA,CAAA,GAAA,IAAI,CAACjD,MAAM,CAAC8B,UAAU,CAAA;AAC5D,IAAA,IAAIvB,EAAE,GAAG,IAAI,CAACL,OAAO,CAAC,CAAC,CAAC;AACtBM,MAAAA,EAAE,GAAG,IAAI,CAACN,OAAO,CAAC,CAAC,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC8B,iBAAiB,CAAC1B,GAAG,CAAC,CAAA;IAC3BA,GAAG,CAAC4B,SAAS,EAAE,CAAA;AACf;AACA;AACA;AACA;IACA,IAAI,IAAI,CAAChC,OAAO,CAAC0B,MAAM,KAAK,CAAC,IAAIrB,EAAE,CAACK,CAAC,KAAKJ,EAAE,CAACI,CAAC,IAAIL,EAAE,CAACM,CAAC,KAAKL,EAAE,CAACK,CAAC,EAAE;AAC/D,MAAA,MAAMqC,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG,IAAI,CAAA;MAC/B3C,EAAE,CAACK,CAAC,IAAIsC,KAAK,CAAA;MACb1C,EAAE,CAACI,CAAC,IAAIsC,KAAK,CAAA;AACf,KAAA;IACA5C,GAAG,CAAC6B,MAAM,CAAC5B,EAAE,CAACK,CAAC,EAAEL,EAAE,CAACM,CAAC,CAAC,CAAA;AAEtB,IAAA,KAAK,IAAIsC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACjD,OAAO,CAAC0B,MAAM,EAAEuB,CAAC,EAAE,EAAE;AAC5C;AACA;MACAtD,WAAW,CAACQ,WAAW,CAACC,GAAG,EAAEC,EAAE,EAAEC,EAAE,CAAC,CAAA;AACpCD,MAAAA,EAAE,GAAG,IAAI,CAACL,OAAO,CAACiD,CAAC,CAAC,CAAA;MACpB3C,EAAE,GAAG,IAAI,CAACN,OAAO,CAACiD,CAAC,GAAG,CAAC,CAAC,CAAA;AAC1B,KAAA;AACA;AACA;AACA;IACA7C,GAAG,CAAC8C,MAAM,CAAC7C,EAAE,CAACK,CAAC,EAAEL,EAAE,CAACM,CAAC,CAAC,CAAA;IACtBP,GAAG,CAAC8B,MAAM,EAAE,CAAA;IACZ9B,GAAG,CAAC+B,OAAO,EAAE,CAAA;AACf,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACEgB,sBAAsBA,CAACtB,MAAe,EAAmB;AACvD,IAAA,MAAMuB,UAAU,GAAG,IAAI,CAACJ,KAAK,GAAG,IAAI,CAAA;AACpC,IAAA,OAAOK,uBAAuB,CAACxB,MAAM,EAAEuB,UAAU,CAAC,CAAA;AACpD,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACEE,UAAUA,CAAC7D,QAAyB,EAAQ;AAC1C,IAAA,MAAM8D,IAAI,GAAG,IAAIC,IAAI,CAAC/D,QAAQ,EAAE;AAC9BgE,MAAAA,IAAI,EAAE,IAAI;MACVvB,MAAM,EAAE,IAAI,CAACwB,KAAK;MAClBC,WAAW,EAAE,IAAI,CAACX,KAAK;MACvBY,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCC,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCC,cAAc,EAAE,IAAI,CAACA,cAAc;MACnCC,eAAe,EAAE,IAAI,CAACA,eAAAA;AACxB,KAAC,CAAC,CAAA;IACF,IAAI,IAAI,CAACC,MAAM,EAAE;AACf,MAAA,IAAI,CAACA,MAAM,CAACC,YAAY,GAAG,IAAI,CAAA;MAC/BV,IAAI,CAACS,MAAM,GAAG,IAAIE,MAAM,CAAC,IAAI,CAACF,MAAM,CAAC,CAAA;AACvC,KAAA;AAEA,IAAA,OAAOT,IAAI,CAAA;AACb,GAAA;;AAEA;AACF;AACA;AACEY,EAAAA,cAAcA,CAACtC,MAAe,EAAEuC,QAAgB,EAAE;AAChD,IAAA,IAAIvC,MAAM,CAACH,MAAM,IAAI,CAAC,EAAE;AACtB,MAAA,OAAOG,MAAM,CAAA;AACf,KAAA;AACA,IAAA,IAAIwC,SAAS,GAAGxC,MAAM,CAAC,CAAC,CAAC;MACvByC,SAAS,CAAA;IACX,MAAMC,IAAI,GAAG,IAAI,CAACzE,MAAM,CAAC0E,OAAO,EAAE;MAChCC,gBAAgB,GAAGC,IAAI,CAACC,GAAG,CAACP,QAAQ,GAAGG,IAAI,EAAE,CAAC,CAAC;AAC/CK,MAAAA,CAAC,GAAG/C,MAAM,CAACH,MAAM,GAAG,CAAC;MACrBmD,SAAS,GAAG,CAACR,SAAS,CAAC,CAAA;AACzB,IAAA,KAAK,IAAIpB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2B,CAAC,GAAG,CAAC,EAAE3B,CAAC,EAAE,EAAE;AAC9BqB,MAAAA,SAAS,GACPI,IAAI,CAACC,GAAG,CAACN,SAAS,CAAC3D,CAAC,GAAGmB,MAAM,CAACoB,CAAC,CAAC,CAACvC,CAAC,EAAE,CAAC,CAAC,GACtCgE,IAAI,CAACC,GAAG,CAACN,SAAS,CAAC1D,CAAC,GAAGkB,MAAM,CAACoB,CAAC,CAAC,CAACtC,CAAC,EAAE,CAAC,CAAC,CAAA;MACxC,IAAI2D,SAAS,IAAIG,gBAAgB,EAAE;AACjCJ,QAAAA,SAAS,GAAGxC,MAAM,CAACoB,CAAC,CAAC,CAAA;AACrB4B,QAAAA,SAAS,CAACjC,IAAI,CAACyB,SAAS,CAAC,CAAA;AAC3B,OAAA;AACF,KAAA;AACA;AACA;AACAQ,IAAAA,SAAS,CAACjC,IAAI,CAACf,MAAM,CAAC+C,CAAC,CAAC,CAAC,CAAA;AACzB,IAAA,OAAOC,SAAS,CAAA;AAClB,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACEtC,EAAAA,mBAAmBA,GAAG;AACpB,IAAA,MAAMnC,GAAG,GAAG,IAAI,CAACN,MAAM,CAAC8B,UAAU,CAAA;IAClCxB,GAAG,CAAC0E,SAAS,EAAE,CAAA;IACf,IAAI,IAAI,CAACC,QAAQ,EAAE;AACjB,MAAA,IAAI,CAAC/E,OAAO,GAAG,IAAI,CAACmE,cAAc,CAAC,IAAI,CAACnE,OAAO,EAAE,IAAI,CAAC+E,QAAQ,CAAC,CAAA;AACjE,KAAA;IACA,MAAMtF,QAAQ,GAAG,IAAI,CAAC0D,sBAAsB,CAAC,IAAI,CAACnD,OAAO,CAAC,CAAA;AAC1D,IAAA,IAAIR,cAAc,CAACC,QAAQ,CAAC,EAAE;AAC5B;AACA;AACA;AACA;AACA,MAAA,IAAI,CAACK,MAAM,CAACkF,gBAAgB,EAAE,CAAA;AAC9B,MAAA,OAAA;AACF,KAAA;AAEA,IAAA,MAAMzB,IAAI,GAAG,IAAI,CAACD,UAAU,CAAC7D,QAAQ,CAAC,CAAA;IACtC,IAAI,CAACK,MAAM,CAAC6B,YAAY,CAAC,IAAI,CAAC7B,MAAM,CAAC8B,UAAU,CAAC,CAAA;AAChD,IAAA,IAAI,CAAC9B,MAAM,CAACmF,IAAI,CAAC,qBAAqB,EAAE;AAAE1B,MAAAA,IAAI,EAAEA,IAAAA;AAAK,KAAC,CAAC,CAAA;AACvD,IAAA,IAAI,CAACzD,MAAM,CAACoF,GAAG,CAAC3B,IAAI,CAAC,CAAA;AACrB,IAAA,IAAI,CAACzD,MAAM,CAACkF,gBAAgB,EAAE,CAAA;IAC9BzB,IAAI,CAAC4B,SAAS,EAAE,CAAA;IAChB,IAAI,CAACC,YAAY,EAAE,CAAA;;AAEnB;AACA,IAAA,IAAI,CAACtF,MAAM,CAACmF,IAAI,CAAC,cAAc,EAAE;AAAE1B,MAAAA,IAAI,EAAEA,IAAAA;AAAK,KAAC,CAAC,CAAA;AAClD,GAAA;AACF;;;;"}