@plait/draw 0.50.1 → 0.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +13 -1
  2. package/constants/line.d.ts +1 -0
  3. package/engines/basic-shapes/ellipse.d.ts +1 -10
  4. package/engines/flowchart/terminal.d.ts +1 -0
  5. package/esm2022/constants/line.mjs +2 -1
  6. package/esm2022/engines/basic-shapes/comment.mjs +4 -5
  7. package/esm2022/engines/basic-shapes/ellipse.mjs +5 -29
  8. package/esm2022/engines/basic-shapes/parallelogram.mjs +3 -2
  9. package/esm2022/engines/basic-shapes/pentagon.mjs +3 -3
  10. package/esm2022/engines/basic-shapes/polygon.mjs +20 -4
  11. package/esm2022/engines/basic-shapes/process-arrow.mjs +3 -3
  12. package/esm2022/engines/basic-shapes/rectangle.mjs +4 -4
  13. package/esm2022/engines/basic-shapes/round-comment.mjs +4 -5
  14. package/esm2022/engines/basic-shapes/round-rectangle.mjs +3 -3
  15. package/esm2022/engines/basic-shapes/star.mjs +3 -3
  16. package/esm2022/engines/basic-shapes/trapezoid.mjs +3 -2
  17. package/esm2022/engines/basic-shapes/triangle.mjs +5 -4
  18. package/esm2022/engines/flowchart/delay.mjs +6 -6
  19. package/esm2022/engines/flowchart/manual-input.mjs +5 -4
  20. package/esm2022/engines/flowchart/manual-loop.mjs +3 -2
  21. package/esm2022/engines/flowchart/merge.mjs +4 -4
  22. package/esm2022/engines/flowchart/stored-data.mjs +16 -10
  23. package/esm2022/engines/flowchart/terminal.mjs +37 -27
  24. package/esm2022/generators/geometry-shape.generator.mjs +3 -3
  25. package/esm2022/generators/line-active.generator.mjs +52 -68
  26. package/esm2022/generators/line.generator.mjs +2 -2
  27. package/esm2022/geometry.component.mjs +7 -7
  28. package/esm2022/image.component.mjs +4 -4
  29. package/esm2022/interfaces/geometry.mjs +1 -1
  30. package/esm2022/interfaces/line.mjs +2 -2
  31. package/esm2022/line.component.mjs +42 -12
  32. package/esm2022/plugins/with-draw-fragment.mjs +3 -3
  33. package/esm2022/plugins/with-draw-hotkey.mjs +6 -6
  34. package/esm2022/plugins/with-draw-resize.mjs +149 -0
  35. package/esm2022/plugins/with-draw.mjs +14 -8
  36. package/esm2022/plugins/with-geometry-create.mjs +10 -10
  37. package/esm2022/plugins/with-geometry-resize.mjs +27 -74
  38. package/esm2022/plugins/with-line-auto-complete.mjs +17 -5
  39. package/esm2022/plugins/with-line-bound-reaction.mjs +6 -5
  40. package/esm2022/plugins/with-line-create.mjs +2 -2
  41. package/esm2022/plugins/with-line-resize.mjs +105 -19
  42. package/esm2022/plugins/with-line-text-move.mjs +5 -4
  43. package/esm2022/plugins/with-line-text.mjs +7 -5
  44. package/esm2022/transforms/geometry.mjs +4 -4
  45. package/esm2022/transforms/line.mjs +6 -8
  46. package/esm2022/utils/clipboard.mjs +2 -2
  47. package/esm2022/utils/geometry.mjs +16 -33
  48. package/esm2022/utils/hit.mjs +18 -10
  49. package/esm2022/utils/index.mjs +2 -2
  50. package/esm2022/utils/line/elbow.mjs +101 -0
  51. package/esm2022/utils/line/index.mjs +6 -0
  52. package/esm2022/utils/line/line-arrow.mjs +123 -0
  53. package/esm2022/utils/line/line-basic.mjs +258 -0
  54. package/esm2022/utils/line/line-common.mjs +111 -0
  55. package/esm2022/utils/line/line-resize.mjs +313 -0
  56. package/esm2022/utils/polygon.mjs +30 -0
  57. package/esm2022/utils/position/geometry.mjs +5 -6
  58. package/esm2022/utils/position/line.mjs +38 -15
  59. package/esm2022/utils/resize-align-reaction.mjs +316 -0
  60. package/esm2022/utils/resize-align.mjs +37 -0
  61. package/fesm2022/plait-draw.mjs +2117 -1152
  62. package/fesm2022/plait-draw.mjs.map +1 -1
  63. package/generators/line-active.generator.d.ts +4 -2
  64. package/interfaces/geometry.d.ts +1 -0
  65. package/interfaces/line.d.ts +4 -0
  66. package/package.json +1 -1
  67. package/plugins/with-draw-resize.d.ts +13 -0
  68. package/utils/geometry.d.ts +1 -3
  69. package/utils/hit.d.ts +3 -1
  70. package/utils/index.d.ts +1 -1
  71. package/utils/line/elbow.d.ts +19 -0
  72. package/utils/line/index.d.ts +5 -0
  73. package/utils/{line-arrow.d.ts → line/line-arrow.d.ts} +1 -1
  74. package/utils/line/line-basic.d.ts +13 -0
  75. package/utils/line/line-common.d.ts +35 -0
  76. package/utils/line/line-resize.d.ts +23 -0
  77. package/utils/polygon.d.ts +4 -0
  78. package/utils/position/geometry.d.ts +2 -3
  79. package/utils/position/line.d.ts +4 -2
  80. package/utils/resize-align-reaction.d.ts +42 -0
  81. package/utils/resize-align.d.ts +8 -0
  82. package/esm2022/utils/line-arrow.mjs +0 -123
  83. package/esm2022/utils/line.mjs +0 -392
  84. package/utils/line.d.ts +0 -25
@@ -1,11 +1,13 @@
1
- import { PlaitBoard, Point } from '@plait/core';
1
+ import { Point } from '@plait/core';
2
2
  import { PlaitLine } from '../interfaces';
3
3
  import { Generator } from '@plait/common';
4
4
  export interface ActiveData {
5
5
  selected: boolean;
6
+ linePoints: Point[];
6
7
  }
7
8
  export declare class LineActiveGenerator extends Generator<PlaitLine, ActiveData> {
9
+ onlySelectedCurrentLine: boolean;
8
10
  canDraw(element: PlaitLine, data: ActiveData): boolean;
9
11
  draw(element: PlaitLine, data: ActiveData): SVGGElement;
12
+ needUpdate(): boolean;
10
13
  }
11
- export declare function getMiddlePoints(board: PlaitBoard, element: PlaitLine): Point[];
@@ -64,6 +64,7 @@ export declare const PlaitGeometry: {};
64
64
  export interface ShapeEngine {
65
65
  isHit: (rectangle: RectangleClient, point: Point) => boolean;
66
66
  getNearestPoint: (rectangle: RectangleClient, point: Point) => Point;
67
+ getNearestCrossingPoint?: (rectangle: RectangleClient, point: Point) => Point;
67
68
  getConnectorPoints: (rectangle: RectangleClient) => Point[];
68
69
  getCornerPoints: (rectangle: RectangleClient) => Point[];
69
70
  getEdgeByConnectionPoint?: (rectangle: RectangleClient, point: PointOfRectangle) => [Point, Point] | null;
@@ -41,6 +41,10 @@ export interface LineHandleRef {
41
41
  vector: Vector;
42
42
  boundElement?: PlaitGeometry;
43
43
  }
44
+ export interface LineHandleRefPair {
45
+ source: LineHandleRef;
46
+ target: LineHandleRef;
47
+ }
44
48
  export interface PlaitLine extends PlaitElement {
45
49
  type: 'line';
46
50
  shape: LineShape;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/draw",
3
- "version": "0.50.1",
3
+ "version": "0.51.1",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.0.0",
6
6
  "@angular/core": "^16.0.0",
@@ -0,0 +1,13 @@
1
+ import { ResizeRef, ResizeState } from '@plait/common';
2
+ import { PlaitBoard, Point } from '@plait/core';
3
+ import { PlaitDrawElement } from '../interfaces';
4
+ export declare function withDrawResize(board: PlaitBoard): PlaitBoard;
5
+ export declare const getResizeOriginPointAndHandlePoint: (board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>) => {
6
+ originPoint: Point;
7
+ handlePoint: Point;
8
+ };
9
+ export declare const getResizeZoom: (resizeState: ResizeState, resizeOriginPoint: Point, resizeHandlePoint: Point, isFromCorner: boolean, isAspectRatio: boolean) => {
10
+ xZoom: number;
11
+ yZoom: number;
12
+ };
13
+ export declare const movePointByZoomAndOriginPoint: (p: Point, resizeOriginPoint: Point, xZoom: number, yZoom: number) => Point;
@@ -11,7 +11,6 @@ export type TextProperties = Partial<CustomText> & {
11
11
  textHeight?: number;
12
12
  };
13
13
  export declare const createGeometryElement: (shape: GeometryShapes, points: [Point, Point], text: string | Element, options?: GeometryStyleOptions, textProperties?: TextProperties) => PlaitGeometry;
14
- export declare const getPointsByCenterPoint: (point: Point, width: number, height: number) => [Point, Point];
15
14
  export declare const getTextRectangle: (element: PlaitGeometry) => {
16
15
  height: number;
17
16
  width: number;
@@ -20,9 +19,8 @@ export declare const getTextRectangle: (element: PlaitGeometry) => {
20
19
  };
21
20
  export declare const drawBoundMask: (board: PlaitBoard, element: PlaitGeometry) => SVGGElement;
22
21
  export declare const drawGeometry: (board: PlaitBoard, outerRectangle: RectangleClient, shape: GeometryShapes, options: Options) => SVGGElement;
23
- export declare const getNearestPoint: (element: PlaitShape, point: Point, inflateDelta?: number) => Point;
22
+ export declare const getNearestPoint: (element: PlaitShape, point: Point) => Point;
24
23
  export declare const getCenterPointsOnPolygon: (points: Point[]) => Point[];
25
- export declare const getEdgeOnPolygonByPoint: (corners: Point[], point: Point) => [Point, Point] | null;
26
24
  export declare const getDefaultFlowchartProperty: (symbol: FlowchartSymbols) => {
27
25
  width: number;
28
26
  height: number;
package/utils/hit.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { PlaitElement, Selection, PlaitBoard, Point } from '@plait/core';
2
- import { PlaitGeometry } from '../interfaces';
2
+ import { PlaitGeometry, PlaitLine } from '../interfaces';
3
3
  export declare const isTextExceedingBounds: (geometry: PlaitGeometry) => boolean;
4
+ export declare const isHitLineText: (board: PlaitBoard, element: PlaitLine, point: Point) => boolean;
5
+ export declare const isHitPolyLine: (pathPoints: Point[], point: Point, strokeWidth: number, expand?: number) => boolean;
4
6
  export declare const isRectangleHitDrawElement: (board: PlaitBoard, element: PlaitElement, selection: Selection) => boolean | null;
5
7
  export declare const isHitDrawElement: (board: PlaitBoard, element: PlaitElement, point: Point) => boolean | null;
package/utils/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './line';
1
+ export * from './line/index';
2
2
  export * from './geometry';
3
3
  export * from './selected';
4
4
  export * from './style';
@@ -0,0 +1,19 @@
1
+ import { Point, PlaitBoard } from '@plait/core';
2
+ import { LineHandleRefPair, PlaitLine } from '../../interfaces';
3
+ export declare const getElbowPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
4
+ export declare const getNextSourceAndTargetPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
5
+ export declare const getSourceAndTargetRectangle: (board: PlaitBoard, element: PlaitLine, handleRefPair: LineHandleRefPair) => {
6
+ sourceRectangle: {
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ };
12
+ targetRectangle: {
13
+ x: number;
14
+ y: number;
15
+ width: number;
16
+ height: number;
17
+ };
18
+ };
19
+ export declare function getNextRenderPoints(board: PlaitBoard, element: PlaitLine, renderPoints?: Point[]): Point[];
@@ -0,0 +1,5 @@
1
+ export * from './elbow';
2
+ export * from './line-arrow';
3
+ export * from './line-basic';
4
+ export * from './line-common';
5
+ export * from './line-resize';
@@ -1,4 +1,4 @@
1
1
  import { Point } from '@plait/core';
2
- import { PlaitLine } from '../interfaces';
2
+ import { PlaitLine } from '../../interfaces';
3
3
  import { Options } from 'roughjs/bin/core';
4
4
  export declare const drawLineArrow: (element: PlaitLine, points: Point[], options: Options) => SVGGElement | null;
@@ -0,0 +1,13 @@
1
+ import { Point, PlaitBoard, RectangleClient } from '@plait/core';
2
+ import { LineHandle, LineShape, LineText, PlaitLine, PlaitShape } from '../../interfaces';
3
+ export declare const createLineElement: (shape: LineShape, points: [Point, Point], source: LineHandle, target: LineHandle, texts?: LineText[], options?: Pick<PlaitLine, 'strokeColor' | 'strokeWidth'>) => PlaitLine;
4
+ export declare const getLinePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
5
+ export declare const getCurvePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
6
+ export declare function getMiddlePoints(board: PlaitBoard, element: PlaitLine): Point[];
7
+ export declare const drawLine: (board: PlaitBoard, element: PlaitLine) => SVGGElement;
8
+ export declare const getConnectionByNearestPoint: (board: PlaitBoard, point: Point, hitElement: PlaitShape) => Point;
9
+ export declare const getHitConnectorPoint: (point: Point, hitElement: PlaitShape, rectangle: RectangleClient) => Point | undefined;
10
+ export declare const getLineTextRectangle: (board: PlaitBoard, element: PlaitLine, index: number) => RectangleClient;
11
+ export declare const getLines: (board: PlaitBoard) => PlaitLine[];
12
+ export declare const Q2C: (points: Point[]) => Point[];
13
+ export declare const handleLineCreating: (board: PlaitBoard, lineShape: LineShape, sourcePoint: Point, movingPoint: Point, sourceElement: PlaitShape | null, lineShapeG: SVGGElement) => PlaitLine;
@@ -0,0 +1,35 @@
1
+ import { Point, PlaitBoard, PointOfRectangle, Direction, Vector } from '@plait/core';
2
+ import { LineHandleRefPair, PlaitGeometry, PlaitLine } from '../../interfaces';
3
+ export declare const getLineHandleRefPair: (board: PlaitBoard, element: PlaitLine) => LineHandleRefPair;
4
+ export declare const getConnectionPoint: (geometry: PlaitGeometry, connection: Point, direction?: Direction, delta?: number) => Point;
5
+ export declare const getVectorByConnection: (boundElement: PlaitGeometry, connection: PointOfRectangle) => Vector;
6
+ export declare const getElbowLineRouteOptions: (board: PlaitBoard, element: PlaitLine, handleRefPair?: LineHandleRefPair) => {
7
+ sourcePoint: PointOfRectangle;
8
+ nextSourcePoint: Point;
9
+ sourceRectangle: {
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ height: number;
14
+ };
15
+ sourceOuterRectangle: {
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ };
21
+ targetPoint: PointOfRectangle;
22
+ nextTargetPoint: Point;
23
+ targetRectangle: {
24
+ x: number;
25
+ y: number;
26
+ width: number;
27
+ height: number;
28
+ };
29
+ targetOuterRectangle: {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ };
35
+ };
@@ -0,0 +1,23 @@
1
+ import { ElbowLineRouteOptions, ResizeState } from '@plait/common';
2
+ import { PlaitBoard, Point } from '@plait/core';
3
+ import { PlaitLine } from '../../interfaces';
4
+ export declare const alignPoints: (basePoint: Point, movingPoint: Point) => Point;
5
+ export declare function getResizedPreviousAndNextPoint(nextRenderPoints: Point[], sourcePoint: Point, targetPoint: Point, handleIndex: number): {
6
+ previous: Point | null;
7
+ next: Point | null;
8
+ };
9
+ export declare function alignElbowSegment(startKeyPoint: Point, endKeyPoint: Point, resizeState: ResizeState, resizedPreviousAndNextPoint: {
10
+ previous: Point | null;
11
+ next: Point | null;
12
+ }): Point[];
13
+ export declare function getIndexAndDeleteCountByKeyPoint(board: PlaitBoard, element: PlaitLine, dataPoints: Point[], nextRenderPoints: Point[], handleIndex: number): {
14
+ index: null;
15
+ deleteCount: null;
16
+ } | {
17
+ index: number;
18
+ deleteCount: number | null;
19
+ };
20
+ export declare function getMirrorDataPoints(board: PlaitBoard, nextDataPoints: Point[], nextKeyPoints: Point[], params: ElbowLineRouteOptions): Point[];
21
+ export declare function isUpdatedHandleIndex(board: PlaitBoard, element: PlaitLine, dataPoints: Point[], nextRenderPoints: Point[], handleIndex: number): boolean;
22
+ export declare function getMidKeyPoints(simplifiedNextKeyPoints: Point[], startPoint: Point, endPoint: Point): Point[];
23
+ export declare const hasIllegalElbowPoint: (midDataPoints: Point[]) => boolean;
@@ -0,0 +1,4 @@
1
+ import { Point } from '@plait/core';
2
+ export declare const getCenterPointsOnPolygon: (points: Point[]) => Point[];
3
+ export declare const getCrossingPointBetweenPointAndPolygon: (corners: Point[], point: Point) => Point[];
4
+ export declare const getPolygonEdgeByConnectionPoint: (corners: Point[], point: Point) => [Point, Point] | null;
@@ -1,8 +1,7 @@
1
- import { PlaitBoard, Point } from '@plait/core';
1
+ import { PlaitBoard, Point, RectangleClient } from '@plait/core';
2
2
  import { PlaitGeometry } from '../../interfaces';
3
3
  import { ResizeHandle } from '@plait/common';
4
- import { PlaitImage } from '../../interfaces/image';
5
- export declare const getHitGeometryResizeHandleRef: (board: PlaitBoard, element: PlaitGeometry | PlaitImage, point: Point) => {
4
+ export declare const getHitRectangleResizeHandleRef: (board: PlaitBoard, rectangle: RectangleClient, point: Point) => {
6
5
  rectangle: {
7
6
  x: number;
8
7
  y: number;
@@ -7,8 +7,10 @@ export declare enum LineResizeHandle {
7
7
  }
8
8
  export declare const getHitLineResizeHandleRef: (board: PlaitBoard, element: PlaitLine, point: Point) => {
9
9
  handle: LineResizeHandle;
10
- index: number;
10
+ handleIndex: number;
11
11
  } | {
12
- index: number;
12
+ handleIndex: number;
13
13
  handle?: undefined;
14
14
  } | undefined;
15
+ export declare function getHitPointIndex(points: Point[], movingPoint: Point): number;
16
+ export declare const getHitLineTextIndex: (board: PlaitBoard, element: PlaitLine, point: Point) => number;
@@ -0,0 +1,42 @@
1
+ import { ResizeState } from '@plait/common';
2
+ import { DirectionFactors, PlaitBoard, PlaitElement, Point, RectangleClient } from '@plait/core';
3
+ export interface ResizeAlignDelta {
4
+ deltaX: number;
5
+ deltaY: number;
6
+ }
7
+ export interface AlignLineRef extends ResizeAlignDelta {
8
+ xZoom: number;
9
+ yZoom: number;
10
+ activePoints: Point[];
11
+ }
12
+ export interface ResizeAlignRef extends AlignLineRef {
13
+ alignG: SVGGElement;
14
+ }
15
+ export interface ResizeAlignOptions {
16
+ resizeState: ResizeState;
17
+ resizeOriginPoints: Point[];
18
+ activeRectangle: RectangleClient;
19
+ directionFactors: DirectionFactors;
20
+ originPoint: Point;
21
+ handlePoint: Point;
22
+ isFromCorner: boolean;
23
+ isAspectRatio: boolean;
24
+ }
25
+ type TripleAlignAxis = [number, number, number];
26
+ export declare class ResizeAlignReaction {
27
+ private board;
28
+ private activeElements;
29
+ alignRectangles: RectangleClient[];
30
+ constructor(board: PlaitBoard, activeElements: PlaitElement[]);
31
+ getAlignRectangle(): RectangleClient[];
32
+ getAlignLineRef(resizeAlignDelta: ResizeAlignDelta, resizeAlignOptions: ResizeAlignOptions): AlignLineRef;
33
+ getEqualLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
34
+ drawEqualLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
35
+ getAlignLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
36
+ drawAlignLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
37
+ handleResizeAlign(resizeAlignOptions: ResizeAlignOptions): ResizeAlignRef;
38
+ }
39
+ export declare const getTripleAlignAxis: (rectangle: RectangleClient, isHorizontal: boolean) => TripleAlignAxis;
40
+ export declare const isAlign: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => boolean;
41
+ export declare const getClosestDelta: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => number;
42
+ export {};
@@ -0,0 +1,8 @@
1
+ import { PlaitBoard, Point } from '@plait/core';
2
+ import { ResizeRef, ResizeState } from '@plait/common';
3
+ import { PlaitDrawElement } from '../interfaces';
4
+ import { ResizeAlignRef } from './resize-align-reaction';
5
+ export declare function getResizeAlignRef(board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>, resizeState: ResizeState, resizeOriginPointAndHandlePoint: {
6
+ originPoint: Point;
7
+ handlePoint: Point;
8
+ }, isAspectRatio: boolean, isFromCorner: boolean): ResizeAlignRef;
@@ -1,123 +0,0 @@
1
- import { arrowPoints, createG, createPath, distanceBetweenPointAndPoint, drawLinearPath, rotate } from '@plait/core';
2
- import { LineMarkerType, PlaitLine } from '../interfaces';
3
- import { getFactorByPoints, getExtendPoint } from '@plait/common';
4
- import { getStrokeWidthByElement } from './style';
5
- const ARROW_LENGTH = 20;
6
- export const drawLineArrow = (element, points, options) => {
7
- const arrowG = createG();
8
- if (PlaitLine.isSourceMark(element, LineMarkerType.none) && PlaitLine.isTargetMark(element, LineMarkerType.none)) {
9
- return null;
10
- }
11
- const strokeWidth = getStrokeWidthByElement(element);
12
- const offset = (strokeWidth * strokeWidth) / 3;
13
- if (points.length === 1) {
14
- points = [points[0], [points[0][0] + 0.1, points[0][1]]];
15
- }
16
- if (!PlaitLine.isSourceMark(element, LineMarkerType.none)) {
17
- const source = getExtendPoint(points[0], points[1], ARROW_LENGTH + offset);
18
- const sourceArrow = getArrow(element, { marker: element.source.marker, source, target: points[0], isSource: true }, options);
19
- sourceArrow && arrowG.appendChild(sourceArrow);
20
- }
21
- if (!PlaitLine.isTargetMark(element, LineMarkerType.none)) {
22
- const source = getExtendPoint(points[points.length - 1], points[points.length - 2], ARROW_LENGTH + offset);
23
- const arrow = getArrow(element, { marker: element.target.marker, source, target: points[points.length - 1], isSource: false }, options);
24
- arrow && arrowG.appendChild(arrow);
25
- }
26
- return arrowG;
27
- };
28
- const getArrow = (element, arrowOptions, options) => {
29
- const { marker, target, source, isSource } = arrowOptions;
30
- let targetArrow;
31
- switch (marker) {
32
- case LineMarkerType.openTriangle: {
33
- targetArrow = drawOpenTriangle(element, source, target, options);
34
- break;
35
- }
36
- case LineMarkerType.solidTriangle: {
37
- targetArrow = drawSolidTriangle(source, target, options);
38
- break;
39
- }
40
- case LineMarkerType.arrow: {
41
- targetArrow = drawArrow(element, source, target, options);
42
- break;
43
- }
44
- case LineMarkerType.sharpArrow: {
45
- targetArrow = drawSharpArrow(source, target, options);
46
- break;
47
- }
48
- case LineMarkerType.oneSideUp: {
49
- targetArrow = drawOneSideArrow(source, target, isSource ? 'down' : 'up', options);
50
- break;
51
- }
52
- case LineMarkerType.oneSideDown: {
53
- targetArrow = drawOneSideArrow(source, target, isSource ? 'up' : 'down', options);
54
- break;
55
- }
56
- case LineMarkerType.hollowTriangle: {
57
- targetArrow = drawHollowTriangleArrow(source, target, options);
58
- break;
59
- }
60
- case LineMarkerType.singleSlash: {
61
- targetArrow = drawSingleSlash(source, target, isSource, options);
62
- break;
63
- }
64
- }
65
- return targetArrow;
66
- };
67
- const drawSharpArrow = (source, target, options) => {
68
- const startPoint = target;
69
- const { pointLeft, pointRight } = arrowPoints(source, target, 20);
70
- const g = createG();
71
- const path = createPath();
72
- let polylinePath = `M${pointRight[0]},${pointRight[1]}A25,25,20,0,1,${pointLeft[0]},${pointLeft[1]}L${startPoint[0]},${startPoint[1]}Z`;
73
- path.setAttribute('d', polylinePath);
74
- path.setAttribute('stroke', `${options?.stroke}`);
75
- path.setAttribute('stroke-width', `${options?.strokeWidth}`);
76
- path.setAttribute('fill', `${options?.stroke}`);
77
- g.appendChild(path);
78
- return g;
79
- };
80
- const drawArrow = (element, source, target, options) => {
81
- const directionFactor = getFactorByPoints(source, target);
82
- const strokeWidth = getStrokeWidthByElement(element);
83
- const endPoint = [target[0] + (strokeWidth * directionFactor.x) / 2, target[1] + (strokeWidth * directionFactor.y) / 2];
84
- const distance = distanceBetweenPointAndPoint(...source, ...endPoint);
85
- const middlePoint = [
86
- endPoint[0] - (((distance * 3) / 5 + strokeWidth) / 2) * directionFactor.x,
87
- endPoint[1] - (((distance * 3) / 5 + strokeWidth) / 2) * directionFactor.y
88
- ];
89
- const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
90
- const arrowG = drawLinearPath([pointLeft, endPoint, pointRight, middlePoint], { ...options, fill: options.stroke }, true);
91
- const path = arrowG.querySelector('path');
92
- path.setAttribute('stroke-linejoin', 'round');
93
- return arrowG;
94
- };
95
- const drawSolidTriangle = (source, target, options) => {
96
- const endPoint = target;
97
- const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
98
- return drawLinearPath([pointLeft, endPoint, pointRight], { ...options, fill: options.stroke }, true);
99
- };
100
- const drawOpenTriangle = (element, source, target, options) => {
101
- const directionFactor = getFactorByPoints(source, target);
102
- const strokeWidth = getStrokeWidthByElement(element);
103
- const endPoint = [target[0] + (strokeWidth * directionFactor.x) / 2, target[1] + (strokeWidth * directionFactor.y) / 2];
104
- const { pointLeft, pointRight } = arrowPoints(source, endPoint, 40);
105
- return drawLinearPath([pointLeft, endPoint, pointRight], options);
106
- };
107
- const drawOneSideArrow = (source, target, side, options) => {
108
- const { pointLeft, pointRight } = arrowPoints(source, target, 40);
109
- return drawLinearPath([side === 'up' ? pointRight : pointLeft, target], options);
110
- };
111
- const drawSingleSlash = (source, target, isSource, options) => {
112
- const length = distanceBetweenPointAndPoint(...source, ...target);
113
- const middlePoint = getExtendPoint(target, source, length / 2);
114
- const angle = isSource ? 120 : 60;
115
- const start = rotate(...source, ...middlePoint, (angle * Math.PI) / 180);
116
- const end = rotate(...target, ...middlePoint, (angle * Math.PI) / 180);
117
- return drawLinearPath([start, end], options);
118
- };
119
- const drawHollowTriangleArrow = (source, target, options) => {
120
- const { pointLeft, pointRight } = arrowPoints(source, target, 30);
121
- return drawLinearPath([pointLeft, pointRight, target], { ...options, fill: 'white' }, true);
122
- };
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUtYXJyb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFTLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLDRCQUE0QixFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFRbEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWtCLEVBQUUsTUFBZSxFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUNuRixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN6QixJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDOUcsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBVSxDQUFDO0lBQ2xGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFVLENBQUM7SUFDaEYsT0FBTyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQWEsRUFBRSxNQUFhLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQy9FLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEUsT0FBTyxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50LCBhcnJvd1BvaW50cywgY3JlYXRlRywgY3JlYXRlUGF0aCwgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCwgZHJhd0xpbmVhclBhdGgsIHJvdGF0ZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IExpbmVNYXJrZXJUeXBlLCBQbGFpdExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IGdldEZhY3RvckJ5UG9pbnRzLCBnZXRFeHRlbmRQb2ludCB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuL3N0eWxlJztcblxuaW50ZXJmYWNlIEFycm93T3B0aW9ucyB7XG4gICAgbWFya2VyOiBMaW5lTWFya2VyVHlwZTtcbiAgICBzb3VyY2U6IFBvaW50O1xuICAgIHRhcmdldDogUG9pbnQ7XG4gICAgaXNTb3VyY2U6IGJvb2xlYW47XG59XG5jb25zdCBBUlJPV19MRU5HVEggPSAyMDtcblxuZXhwb3J0IGNvbnN0IGRyYXdMaW5lQXJyb3cgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludHM6IFBvaW50W10sIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBhcnJvd0cgPSBjcmVhdGVHKCk7XG4gICAgaWYgKFBsYWl0TGluZS5pc1NvdXJjZU1hcmsoZWxlbWVudCwgTGluZU1hcmtlclR5cGUubm9uZSkgJiYgUGxhaXRMaW5lLmlzVGFyZ2V0TWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBvZmZzZXQgPSAoc3Ryb2tlV2lkdGggKiBzdHJva2VXaWR0aCkgLyAzO1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHBvaW50cyA9IFtwb2ludHNbMF0sIFtwb2ludHNbMF1bMF0gKyAwLjEsIHBvaW50c1swXVsxXV1dO1xuICAgIH1cblxuICAgIGlmICghUGxhaXRMaW5lLmlzU291cmNlTWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFeHRlbmRQb2ludChwb2ludHNbMF0sIHBvaW50c1sxXSwgQVJST1dfTEVOR1RIICsgb2Zmc2V0KTtcbiAgICAgICAgY29uc3Qgc291cmNlQXJyb3cgPSBnZXRBcnJvdyhlbGVtZW50LCB7IG1hcmtlcjogZWxlbWVudC5zb3VyY2UubWFya2VyLCBzb3VyY2UsIHRhcmdldDogcG9pbnRzWzBdLCBpc1NvdXJjZTogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICAgICAgc291cmNlQXJyb3cgJiYgYXJyb3dHLmFwcGVuZENoaWxkKHNvdXJjZUFycm93KTtcbiAgICB9XG4gICAgaWYgKCFQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEV4dGVuZFBvaW50KHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIEFSUk9XX0xFTkdUSCArIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IGFycm93ID0gZ2V0QXJyb3coXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgeyBtYXJrZXI6IGVsZW1lbnQudGFyZ2V0Lm1hcmtlciwgc291cmNlLCB0YXJnZXQ6IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIGlzU291cmNlOiBmYWxzZSB9LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIGFycm93ICYmIGFycm93Ry5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgfVxuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5jb25zdCBnZXRBcnJvdyA9IChlbGVtZW50OiBQbGFpdExpbmUsIGFycm93T3B0aW9uczogQXJyb3dPcHRpb25zLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBtYXJrZXIsIHRhcmdldCwgc291cmNlLCBpc1NvdXJjZSB9ID0gYXJyb3dPcHRpb25zO1xuICAgIGxldCB0YXJnZXRBcnJvdztcbiAgICBzd2l0Y2ggKG1hcmtlcikge1xuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLm9wZW5UcmlhbmdsZToge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3T3BlblRyaWFuZ2xlKGVsZW1lbnQsIHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUuc29saWRUcmlhbmdsZToge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3U29saWRUcmlhbmdsZShzb3VyY2UsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLmFycm93OiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdBcnJvdyhlbGVtZW50LCBzb3VyY2UsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLnNoYXJwQXJyb3c6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd1NoYXJwQXJyb3coc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5vbmVTaWRlVXA6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd09uZVNpZGVBcnJvdyhzb3VyY2UsIHRhcmdldCwgaXNTb3VyY2UgPyAnZG93bicgOiAndXAnLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUub25lU2lkZURvd246IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd09uZVNpZGVBcnJvdyhzb3VyY2UsIHRhcmdldCwgaXNTb3VyY2UgPyAndXAnIDogJ2Rvd24nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUuaG9sbG93VHJpYW5nbGU6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd0hvbGxvd1RyaWFuZ2xlQXJyb3coc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5zaW5nbGVTbGFzaDoge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3U2luZ2xlU2xhc2goc291cmNlLCB0YXJnZXQsIGlzU291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRBcnJvdztcbn07XG5cbmNvbnN0IGRyYXdTaGFycEFycm93ID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBzdGFydFBvaW50OiBQb2ludCA9IHRhcmdldDtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc291cmNlLCB0YXJnZXQsIDIwKTtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKCk7XG4gICAgbGV0IHBvbHlsaW5lUGF0aCA9IGBNJHtwb2ludFJpZ2h0WzBdfSwke3BvaW50UmlnaHRbMV19QTI1LDI1LDIwLDAsMSwke3BvaW50TGVmdFswXX0sJHtwb2ludExlZnRbMV19TCR7c3RhcnRQb2ludFswXX0sJHtzdGFydFBvaW50WzFdfVpgO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgcG9seWxpbmVQYXRoKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYCR7b3B0aW9ucz8uc3Ryb2tlfWApO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBgJHtvcHRpb25zPy5zdHJva2VXaWR0aH1gKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGAke29wdGlvbnM/LnN0cm9rZX1gKTtcbiAgICBnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIHJldHVybiBnO1xufTtcblxuY29uc3QgZHJhd0Fycm93ID0gKGVsZW1lbnQ6IFBsYWl0TGluZSwgc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldEZhY3RvckJ5UG9pbnRzKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZFBvaW50OiBQb2ludCA9IFt0YXJnZXRbMF0gKyAoc3Ryb2tlV2lkdGggKiBkaXJlY3Rpb25GYWN0b3IueCkgLyAyLCB0YXJnZXRbMV0gKyAoc3Ryb2tlV2lkdGggKiBkaXJlY3Rpb25GYWN0b3IueSkgLyAyXTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLCAuLi5lbmRQb2ludCk7XG4gICAgY29uc3QgbWlkZGxlUG9pbnQ6IFBvaW50ID0gW1xuICAgICAgICBlbmRQb2ludFswXSAtICgoKGRpc3RhbmNlICogMykgLyA1ICsgc3Ryb2tlV2lkdGgpIC8gMikgKiBkaXJlY3Rpb25GYWN0b3IueCxcbiAgICAgICAgZW5kUG9pbnRbMV0gLSAoKChkaXN0YW5jZSAqIDMpIC8gNSArIHN0cm9rZVdpZHRoKSAvIDIpICogZGlyZWN0aW9uRmFjdG9yLnlcbiAgICBdO1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgY29uc3QgYXJyb3dHID0gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgZW5kUG9pbnQsIHBvaW50UmlnaHQsIG1pZGRsZVBvaW50XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbiAgICBjb25zdCBwYXRoID0gYXJyb3dHLnF1ZXJ5U2VsZWN0b3IoJ3BhdGgnKTtcbiAgICBwYXRoIS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpO1xuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5jb25zdCBkcmF3U29saWRUcmlhbmdsZSA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gdGFyZ2V0O1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgcmV0dXJuIGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbn07XG5cbmNvbnN0IGRyYXdPcGVuVHJpYW5nbGUgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZGlyZWN0aW9uRmFjdG9yID0gZ2V0RmFjdG9yQnlQb2ludHMoc291cmNlLCB0YXJnZXQpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gW3RhcmdldFswXSArIChzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci54KSAvIDIsIHRhcmdldFsxXSArIChzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci55KSAvIDJdO1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCA0MCk7XG4gICAgcmV0dXJuIGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCBkcmF3T25lU2lkZUFycm93ID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIHNpZGU6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIHRhcmdldCwgNDApO1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbc2lkZSA9PT0gJ3VwJyA/IHBvaW50UmlnaHQgOiBwb2ludExlZnQsIHRhcmdldF0sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZHJhd1NpbmdsZVNsYXNoID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIGlzU291cmNlOiBib29sZWFuLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zb3VyY2UsIC4uLnRhcmdldCk7XG4gICAgY29uc3QgbWlkZGxlUG9pbnQgPSBnZXRFeHRlbmRQb2ludCh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoIC8gMik7XG4gICAgY29uc3QgYW5nbGUgPSBpc1NvdXJjZSA/IDEyMCA6IDYwO1xuICAgIGNvbnN0IHN0YXJ0ID0gcm90YXRlKC4uLnNvdXJjZSwgLi4ubWlkZGxlUG9pbnQsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKSBhcyBQb2ludDtcbiAgICBjb25zdCBlbmQgPSByb3RhdGUoLi4udGFyZ2V0LCAuLi5taWRkbGVQb2ludCwgKGFuZ2xlICogTWF0aC5QSSkgLyAxODApIGFzIFBvaW50O1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbc3RhcnQsIGVuZF0sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZHJhd0hvbGxvd1RyaWFuZ2xlQXJyb3cgPSAoc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIHRhcmdldCwgMzApO1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbcG9pbnRMZWZ0LCBwb2ludFJpZ2h0LCB0YXJnZXRdLCB7IC4uLm9wdGlvbnMsIGZpbGw6ICd3aGl0ZScgfSwgdHJ1ZSk7XG59O1xuIl19