@plait/draw 0.52.0 → 0.54.0

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 (49) hide show
  1. package/constants/geometry.d.ts +3 -1
  2. package/esm2022/constants/geometry.mjs +4 -2
  3. package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
  4. package/esm2022/interfaces/index.mjs +2 -2
  5. package/esm2022/interfaces/line.mjs +20 -8
  6. package/esm2022/line.component.mjs +5 -17
  7. package/esm2022/plugins/with-draw-fragment.mjs +1 -1
  8. package/esm2022/plugins/with-draw-hotkey.mjs +9 -7
  9. package/esm2022/plugins/with-draw-resize.mjs +114 -13
  10. package/esm2022/plugins/with-draw.mjs +5 -12
  11. package/esm2022/plugins/with-geometry-resize.mjs +8 -5
  12. package/esm2022/plugins/with-line-auto-complete-reaction.mjs +7 -4
  13. package/esm2022/plugins/with-line-auto-complete.mjs +17 -16
  14. package/esm2022/plugins/with-line-bound-reaction.mjs +20 -19
  15. package/esm2022/plugins/with-line-create.mjs +4 -4
  16. package/esm2022/plugins/with-line-resize.mjs +10 -11
  17. package/esm2022/transforms/line.mjs +4 -4
  18. package/esm2022/utils/geometry.mjs +31 -22
  19. package/esm2022/utils/hit.mjs +29 -27
  20. package/esm2022/utils/line/elbow.mjs +22 -9
  21. package/esm2022/utils/line/line-basic.mjs +21 -25
  22. package/esm2022/utils/line/line-common.mjs +27 -15
  23. package/esm2022/utils/line/line-resize.mjs +7 -11
  24. package/esm2022/utils/position/geometry.mjs +52 -20
  25. package/esm2022/utils/resize-snap.mjs +361 -0
  26. package/esm2022/utils/shape.mjs +2 -2
  27. package/fesm2022/plait-draw.mjs +556 -437
  28. package/fesm2022/plait-draw.mjs.map +1 -1
  29. package/generators/line-auto-complete.generator.d.ts +3 -3
  30. package/interfaces/index.d.ts +2 -2
  31. package/package.json +1 -1
  32. package/plugins/with-draw-fragment.d.ts +2 -2
  33. package/plugins/with-draw-resize.d.ts +12 -0
  34. package/utils/geometry.d.ts +7 -4
  35. package/utils/hit.d.ts +3 -1
  36. package/utils/line/elbow.d.ts +6 -13
  37. package/utils/line/line-basic.d.ts +4 -4
  38. package/utils/line/line-common.d.ts +3 -13
  39. package/utils/position/geometry.d.ts +12 -5
  40. package/utils/resize-snap.d.ts +49 -0
  41. package/utils/shape.d.ts +2 -2
  42. package/esm2022/generators/group.generator.mjs +0 -20
  43. package/esm2022/group.component.mjs +0 -47
  44. package/esm2022/utils/resize-align-reaction.mjs +0 -316
  45. package/esm2022/utils/resize-align.mjs +0 -37
  46. package/generators/group.generator.d.ts +0 -6
  47. package/group.component.d.ts +0 -17
  48. package/utils/resize-align-reaction.d.ts +0 -42
  49. package/utils/resize-align.d.ts +0 -8
@@ -1,11 +1,11 @@
1
- import { ACTIVE_STROKE_WIDTH, BoardTransforms, PlaitBoard, PlaitPointerType, RectangleClient, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, Transforms, addSelectedElement, clearSelectedElement, createG, drawCircle, idCreator } from '@plait/core';
1
+ import { ACTIVE_STROKE_WIDTH, BoardTransforms, PlaitBoard, PlaitPointerType, RectangleClient, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SNAPPING_STROKE_WIDTH, Transforms, addSelectedElement, clearSelectedElement, createG, drawCircle, idCreator } from '@plait/core';
2
2
  import { BasicShapes, FlowchartSymbols } from '../interfaces/geometry';
3
3
  import { Alignment, DEFAULT_FONT_SIZE, buildText, getTextSize } from '@plait/text';
4
4
  import { DefaultBasicShapeProperty, DefaultFlowchartPropertyMap, DefaultTextProperty, DrawThemeColors, ShapeDefaultSpace, getFlowchartPointers } from '../constants';
5
5
  import { RESIZE_HANDLE_DIAMETER } from '@plait/common';
6
6
  import { getStrokeWidthByElement } from './style/stroke';
7
7
  import { getEngine } from '../engines';
8
- import { getShape } from './shape';
8
+ import { getElementShape } from './shape';
9
9
  import { createLineElement } from './line/line-basic';
10
10
  import { LineMarkerType, LineShape } from '../interfaces';
11
11
  import { DefaultLineStyle } from '../constants/line';
@@ -48,36 +48,45 @@ export const getTextRectangle = (element) => {
48
48
  y: elementRectangle.y + (elementRectangle.height - height) / 2
49
49
  };
50
50
  };
51
- export const drawBoundMask = (board, element) => {
52
- const G = createG();
51
+ export const drawBoundReaction = (board, element, options = { hasMask: true, hasConnector: true }) => {
52
+ const g = createG();
53
53
  const rectangle = RectangleClient.getRectangleByPoints(element.points);
54
- const activeRectangle = RectangleClient.inflate(rectangle, ACTIVE_STROKE_WIDTH);
55
- const shape = getShape(element);
56
- const maskG = drawGeometry(board, activeRectangle, shape, {
54
+ const activeRectangle = RectangleClient.inflate(rectangle, SNAPPING_STROKE_WIDTH);
55
+ const shape = getElementShape(element);
56
+ const strokeG = drawGeometry(board, activeRectangle, shape, {
57
57
  stroke: SELECTION_BORDER_COLOR,
58
- strokeWidth: 1,
59
- fill: SELECTION_FILL_COLOR,
60
- fillStyle: 'solid'
58
+ strokeWidth: SNAPPING_STROKE_WIDTH
61
59
  });
62
- G.appendChild(maskG);
63
- const connectorPoints = getEngine(shape).getConnectorPoints(activeRectangle);
64
- connectorPoints.forEach(point => {
65
- const circleG = drawCircle(PlaitBoard.getRoughSVG(board), point, 6, {
66
- stroke: '#999999',
67
- strokeWidth: 1,
68
- fill: '#FFF',
60
+ g.appendChild(strokeG);
61
+ if (options.hasMask) {
62
+ const maskG = drawGeometry(board, activeRectangle, shape, {
63
+ stroke: SELECTION_BORDER_COLOR,
64
+ strokeWidth: 0,
65
+ fill: SELECTION_FILL_COLOR,
69
66
  fillStyle: 'solid'
70
67
  });
71
- G.appendChild(circleG);
72
- });
73
- return G;
68
+ g.appendChild(maskG);
69
+ }
70
+ if (options.hasConnector) {
71
+ const connectorPoints = getEngine(shape).getConnectorPoints(rectangle);
72
+ connectorPoints.forEach(point => {
73
+ const circleG = drawCircle(PlaitBoard.getRoughSVG(board), point, 8, {
74
+ stroke: SELECTION_BORDER_COLOR,
75
+ strokeWidth: ACTIVE_STROKE_WIDTH,
76
+ fill: '#FFF',
77
+ fillStyle: 'solid'
78
+ });
79
+ g.appendChild(circleG);
80
+ });
81
+ }
82
+ return g;
74
83
  };
75
84
  export const drawGeometry = (board, outerRectangle, shape, options) => {
76
85
  return getEngine(shape).draw(board, outerRectangle, options);
77
86
  };
78
87
  export const getNearestPoint = (element, point) => {
79
88
  const rectangle = RectangleClient.getRectangleByPoints(element.points);
80
- const shape = getShape(element);
89
+ const shape = getElementShape(element);
81
90
  return getEngine(shape).getNearestPoint(rectangle, point);
82
91
  };
83
92
  export const getCenterPointsOnPolygon = (points) => {
@@ -214,4 +223,4 @@ export const createDefaultGeometry = (board, points, shape) => {
214
223
  ...memorizedLatest.geometryProperties
215
224
  }, { ...memorizedLatest.textProperties, textHeight });
216
225
  };
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixVQUFVLEVBQ1YsZ0JBQWdCLEVBRWhCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBRXBCLFVBQVUsRUFFVixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxVQUFVLEVBQ1YsU0FBUyxFQUNaLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBa0IsV0FBVyxFQUFpQixnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQWMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvRixPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQkFBbUIsRUFFbkIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDdkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUs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O0lBQ3RFLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzRixPQUFPLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsa0JBQTBDLEVBQUU7UUFDckgsR0FBRyxlQUFlLENBQUMsY0FBYztRQUNqQyxVQUFVO0tBQ2IsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE1BQXNCLEVBQUUsS0FBcUIsRUFBRSxFQUFFO0lBQ3RHLE1BQU0sZUFBZSxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3SCxPQUFPLHFCQUFxQixDQUN4QixLQUFLLEVBQ0wsTUFBTSxFQUNOLEVBQUUsRUFDRjtRQUNJLFdBQVcsRUFBRSx5QkFBeUIsQ0FBQyxXQUFXO1FBQ2xELEdBQUksZUFBZSxDQUFDLGtCQUEyQztLQUNsRSxFQUNELEVBQUUsR0FBRyxlQUFlLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUNwRCxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBQ1RJVkVfU1RST0tFX1dJRFRILFxuICAgIEJvYXJkVHJhbnNmb3JtcyxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0UG9pbnRlclR5cGUsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgU0VMRUNUSU9OX0ZJTExfQ09MT1IsXG4gICAgVGhlbWVDb2xvck1vZGUsXG4gICAgVHJhbnNmb3JtcyxcbiAgICBWZWN0b3IsXG4gICAgYWRkU2VsZWN0ZWRFbGVtZW50LFxuICAgIGNsZWFyU2VsZWN0ZWRFbGVtZW50LFxuICAgIGNyZWF0ZUcsXG4gICAgZHJhd0NpcmNsZSxcbiAgICBpZENyZWF0b3Jcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgR2VvbWV0cnlTaGFwZXMsIEJhc2ljU2hhcGVzLCBQbGFpdEdlb21ldHJ5LCBGbG93Y2hhcnRTeW1ib2xzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBBbGlnbm1lbnQsIEN1c3RvbVRleHQsIERFRkFVTFRfRk9OVF9TSVpFLCBidWlsZFRleHQsIGdldFRleHRTaXplIH0gZnJvbSAnQHBsYWl0L3RleHQnO1xuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7XG4gICAgRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eSxcbiAgICBEZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHlNYXAsXG4gICAgRGVmYXVsdFRleHRQcm9wZXJ0eSxcbiAgICBEcmF3UG9pbnRlclR5cGUsXG4gICAgRHJhd1RoZW1lQ29sb3JzLFxuICAgIFNoYXBlRGVmYXVsdFNwYWNlLFxuICAgIGdldEZsb3djaGFydFBvaW50ZXJzXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4vc3R5bGUvc3Ryb2tlJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZXMnO1xuaW1wb3J0IHsgZ2V0U2hhcGUgfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IGNyZWF0ZUxpbmVFbGVtZW50IH0gZnJvbSAnLi9saW5lL2xpbmUtYmFzaWMnO1xuaW1wb3J0IHsgTGluZU1hcmtlclR5cGUsIExpbmVTaGFwZSwgUGxhaXRTaGFwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGVmYXVsdExpbmVTdHlsZSB9IGZyb20gJy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IGdldE1lbW9yaXplZExhdGVzdEJ5UG9pbnRlciwgbWVtb3JpemVMYXRlc3RTaGFwZSB9IGZyb20gJy4vbWVtb3JpemUnO1xuXG5leHBvcnQgdHlwZSBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IFBpY2s8UGxhaXRHZW9tZXRyeSwgJ2ZpbGwnIHwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+O1xuXG5leHBvcnQgdHlwZSBUZXh0UHJvcGVydGllcyA9IFBhcnRpYWw8Q3VzdG9tVGV4dD4gJiB7IGFsaWduPzogQWxpZ25tZW50OyB0ZXh0SGVpZ2h0PzogbnVtYmVyIH07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHZW9tZXRyeUVsZW1lbnQgPSAoXG4gICAgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgdGV4dDogc3RyaW5nIHwgRWxlbWVudCxcbiAgICBvcHRpb25zOiBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IHt9LFxuICAgIHRleHRQcm9wZXJ0aWVzOiBUZXh0UHJvcGVydGllcyA9IHt9XG4pOiBQbGFpdEdlb21ldHJ5ID0+IHtcbiAgICBsZXQgdGV4dE9wdGlvbnMgPSB7fTtcbiAgICBsZXQgYWxpZ25tZW50OiB1bmRlZmluZWQgfCBBbGlnbm1lbnQgPSBBbGlnbm1lbnQuY2VudGVyO1xuICAgIGxldCB0ZXh0SGVpZ2h0ID0gRGVmYXVsdFRleHRQcm9wZXJ0eS5oZWlnaHQ7XG4gICAgaWYgKHNoYXBlID09PSBCYXNpY1NoYXBlcy50ZXh0KSB7XG4gICAgICAgIHRleHRPcHRpb25zID0geyBhdXRvU2l6ZTogdHJ1ZSB9O1xuICAgICAgICBhbGlnbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHRQcm9wZXJ0aWVzID0geyAuLi50ZXh0UHJvcGVydGllcyB9O1xuICAgIHRleHRQcm9wZXJ0aWVzPy5hbGlnbiAmJiAoYWxpZ25tZW50ID0gdGV4dFByb3BlcnRpZXM/LmFsaWduKTtcbiAgICB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodCAmJiAodGV4dEhlaWdodCA9IHRleHRQcm9wZXJ0aWVzPy50ZXh0SGVpZ2h0KTtcbiAgICBkZWxldGUgdGV4dFByb3BlcnRpZXM/LmFsaWduO1xuICAgIGRlbGV0ZSB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgIHR5cGU6ICdnZW9tZXRyeScsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgdGV4dEhlaWdodCxcbiAgICAgICAgdGV4dDogYnVpbGRUZXh0KHRleHQsIGFsaWdubWVudCwgdGV4dFByb3BlcnRpZXMpLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIC4uLnRleHRPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0UmVjdGFuZ2xlID0gKGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpID0+IHtcbiAgICBjb25zdCBlbGVtZW50UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGVsZW1lbnQucG9pbnRzISk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50LnRleHRIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBlbGVtZW50UmVjdGFuZ2xlLndpZHRoIC0gU2hhcGVEZWZhdWx0U3BhY2UucmVjdGFuZ2xlQW5kVGV4dCAqIDIgLSBzdHJva2VXaWR0aCAqIDI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aDogd2lkdGggPiAwID8gd2lkdGggOiAwLFxuICAgICAgICB4OiBlbGVtZW50UmVjdGFuZ2xlLnggKyBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICsgc3Ryb2tlV2lkdGgsXG4gICAgICAgIHk6IGVsZW1lbnRSZWN0YW5nbGUueSArIChlbGVtZW50UmVjdGFuZ2xlLmhlaWdodCAtIGhlaWdodCkgLyAyXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3Qm91bmRNYXNrID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEdlb21ldHJ5KSA9PiB7XG4gICAgY29uc3QgRyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgQUNUSVZFX1NUUk9LRV9XSURUSCk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZShlbGVtZW50KTtcbiAgICBjb25zdCBtYXNrRyA9IGRyYXdHZW9tZXRyeShib2FyZCwgYWN0aXZlUmVjdGFuZ2xlLCBzaGFwZSwge1xuICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICBmaWxsOiBTRUxFQ1RJT05fRklMTF9DT0xPUixcbiAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgfSk7XG4gICAgRy5hcHBlbmRDaGlsZChtYXNrRyk7XG4gICAgY29uc3QgY29ubmVjdG9yUG9pbnRzID0gZ2V0RW5naW5lKHNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMoYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICBjb25uZWN0b3JQb2ludHMuZm9yRWFjaChwb2ludCA9PiB7XG4gICAgICAgIGNvbnN0IGNpcmNsZUcgPSBkcmF3Q2lyY2xlKFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLCBwb2ludCwgNiwge1xuICAgICAgICAgICAgc3Ryb2tlOiAnIzk5OTk5OScsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgICAgICAgIGZpbGw6ICcjRkZGJyxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICB9KTtcbiAgICAgICAgRy5hcHBlbmRDaGlsZChjaXJjbGVHKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBHO1xufTtcblxuZXhwb3J0IGNvbnN0IGRyYXdHZW9tZXRyeSA9IChib2FyZDogUGxhaXRCb2FyZCwgb3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIGdldEVuZ2luZShzaGFwZSkuZHJhdyhib2FyZCwgb3V0ZXJSZWN0YW5nbGUsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RQb2ludCA9IChlbGVtZW50OiBQbGFpdFNoYXBlLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGUoZWxlbWVudCk7XG4gICAgcmV0dXJuIGdldEVuZ2luZShzaGFwZSkuZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZSwgcG9pbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENlbnRlclBvaW50c09uUG9seWdvbiA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBjZW50ZXJQb2ludDogUG9pbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBqID0gaSA9PSBwb2ludHMubGVuZ3RoIC0gMSA/IDAgOiBpICsgMTtcbiAgICAgICAgY2VudGVyUG9pbnQucHVzaChbKHBvaW50c1tpXVswXSArIHBvaW50c1tqXVswXSkgLyAyLCAocG9pbnRzW2ldWzFdICsgcG9pbnRzW2pdWzFdKSAvIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbnRlclBvaW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGbG93Y2hhcnRQcm9wZXJ0eSA9IChzeW1ib2w6IEZsb3djaGFydFN5bWJvbHMpID0+IHtcbiAgICByZXR1cm4gRGVmYXVsdEZsb3djaGFydFByb3BlcnR5TWFwW3N5bWJvbF07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdEZsb3djaGFydCA9IChwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBkZWNpc2lvblByb3BlcnR5ID0gZ2V0RGVmYXVsdEZsb3djaGFydFByb3BlcnR5KEZsb3djaGFydFN5bWJvbHMuZGVjaXNpb24pO1xuICAgIGNvbnN0IHByb2Nlc3NQcm9wZXJ0eSA9IGdldERlZmF1bHRGbG93Y2hhcnRQcm9wZXJ0eShGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MpO1xuICAgIGNvbnN0IHRlcm1pbmFsUHJvcGVydHkgPSBnZXREZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHkoRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCk7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBzdHJva2VXaWR0aDogRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eS5zdHJva2VXaWR0aFxuICAgIH07XG5cbiAgICBjb25zdCBsaW5lT3B0aW9ucyA9IHtcbiAgICAgICAgc3Ryb2tlV2lkdGg6IERlZmF1bHRMaW5lU3R5bGUuc3Ryb2tlV2lkdGhcbiAgICB9O1xuICAgIGNvbnN0IHN0YXJ0RWxlbWVudCA9IGNyZWF0ZUdlb21ldHJ5RWxlbWVudChcbiAgICAgICAgRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCxcbiAgICAgICAgZ2V0RGVmYXVsdEdlb21ldHJ5UG9pbnRzKEZsb3djaGFydFN5bWJvbHMudGVybWluYWwsIHBvaW50KSxcbiAgICAgICAgJ+W8gOWniycsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgcHJvY2Vzc1BvaW50MTogUG9pbnQgPSBbcG9pbnRbMF0sIHBvaW50WzFdICsgdGVybWluYWxQcm9wZXJ0eS5oZWlnaHQgLyAyICsgNTUgKyBwcm9jZXNzUHJvcGVydHkuaGVpZ2h0IC8gMl07XG4gICAgY29uc3QgcHJvY2Vzc0VsZW1lbnQxID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsXG4gICAgICAgIGdldERlZmF1bHRHZW9tZXRyeVBvaW50cyhGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsIHByb2Nlc3NQb2ludDEpLFxuICAgICAgICAn6L+H56iLJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNpc2lvblBvaW50OiBQb2ludCA9IFtwcm9jZXNzUG9pbnQxWzBdLCBwcm9jZXNzUG9pbnQxWzFdICsgcHJvY2Vzc1Byb3BlcnR5LmhlaWdodCAvIDIgKyA1NSArIGRlY2lzaW9uUHJvcGVydHkuaGVpZ2h0IC8gMl07XG4gICAgY29uc3QgZGVjaXNpb25FbGVtZW50ID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLmRlY2lzaW9uLFxuICAgICAgICBnZXREZWZhdWx0R2VvbWV0cnlQb2ludHMoRmxvd2NoYXJ0U3ltYm9scy5kZWNpc2lvbiwgZGVjaXNpb25Qb2ludCksXG4gICAgICAgICfov4fnqIsnLFxuICAgICAgICBvcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHByb2Nlc3NQb2ludDI6IFBvaW50ID0gW2RlY2lzaW9uUG9pbnRbMF0gKyBkZWNpc2lvblByb3BlcnR5LndpZHRoIC8gMiArIDc1ICsgcHJvY2Vzc1Byb3BlcnR5LndpZHRoIC8gMiwgZGVjaXNpb25Qb2ludFsxXV07XG4gICAgY29uc3QgcHJvY2Vzc0VsZW1lbnQyID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsXG4gICAgICAgIGdldERlZmF1bHRHZW9tZXRyeVBvaW50cyhGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsIHByb2Nlc3NQb2ludDIpLFxuICAgICAgICAn6L+H56iLJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBlbmRQb2ludDogUG9pbnQgPSBbZGVjaXNpb25Qb2ludFswXSwgZGVjaXNpb25Qb2ludFsxXSArIGRlY2lzaW9uUHJvcGVydHkuaGVpZ2h0IC8gMiArIDk1ICsgdGVybWluYWxQcm9wZXJ0eS5oZWlnaHQgLyAyXTtcbiAgICBjb25zdCBlbmRFbGVtZW50ID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnRlcm1pbmFsLFxuICAgICAgICBnZXREZWZhdWx0R2VvbWV0cnlQb2ludHMoRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCwgZW5kUG9pbnQpLFxuICAgICAgICAn57uT5p2fJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBsaW5lMSA9IGNyZWF0ZUxpbmVFbGVtZW50KFxuICAgICAgICBMaW5lU2hhcGUuZWxib3csXG4gICAgICAgIFtcbiAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgIFswLCAwXVxuICAgICAgICBdLFxuICAgICAgICB7IG1hcmtlcjogTGluZU1hcmtlclR5cGUubm9uZSwgY29ubmVjdGlvbjogWzAuNSwgMV0sIGJvdW5kSWQ6IHN0YXJ0RWxlbWVudC5pZCB9LFxuICAgICAgICB7IG1hcmtlcjogTGluZU1hcmtlclR5cGUuYXJyb3csIGNvbm5lY3Rpb246IFswLjUsIDBdLCBib3VuZElkOiBwcm9jZXNzRWxlbWVudDEuaWQgfSxcbiAgICAgICAgW10sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmUyID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMC41LCAxXSwgYm91bmRJZDogcHJvY2Vzc0VsZW1lbnQxLmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzAuNSwgMF0sIGJvdW5kSWQ6IGRlY2lzaW9uRWxlbWVudC5pZCB9LFxuICAgICAgICBbXSxcbiAgICAgICAgbGluZU9wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgbGluZTMgPSBjcmVhdGVMaW5lRWxlbWVudChcbiAgICAgICAgTGluZVNoYXBlLmVsYm93LFxuICAgICAgICBbXG4gICAgICAgICAgICBbMCwgMF0sXG4gICAgICAgICAgICBbMCwgMF1cbiAgICAgICAgXSxcbiAgICAgICAgeyBtYXJrZXI6IExpbmVNYXJrZXJUeXBlLm5vbmUsIGNvbm5lY3Rpb246IFswLjUsIDFdLCBib3VuZElkOiBkZWNpc2lvbkVsZW1lbnQuaWQgfSxcbiAgICAgICAgeyBtYXJrZXI6IExpbmVNYXJrZXJUeXBlLmFycm93LCBjb25uZWN0aW9uOiBbMC41LCAwXSwgYm91bmRJZDogZW5kRWxlbWVudC5pZCB9LFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogYnVpbGRUZXh0KCfmmK8nKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogMC41LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmU0ID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMSwgMC41XSwgYm91bmRJZDogZGVjaXNpb25FbGVtZW50LmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzAsIDAuNV0sIGJvdW5kSWQ6IHByb2Nlc3NFbGVtZW50Mi5pZCB9LFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogYnVpbGRUZXh0KCflkKYnKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogMC41LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmU1ID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMC41LCAxXSwgYm91bmRJZDogcHJvY2Vzc0VsZW1lbnQyLmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzEsIDAuNV0sIGJvdW5kSWQ6IGVuZEVsZW1lbnQuaWQgfSxcbiAgICAgICAgW10sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiBbc3RhcnRFbGVtZW50LCBwcm9jZXNzRWxlbWVudDEsIGRlY2lzaW9uRWxlbWVudCwgcHJvY2Vzc0VsZW1lbnQyLCBlbmRFbGVtZW50LCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTVdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEF1dG9Db21wbGV0ZVBvaW50cyA9IChlbGVtZW50OiBQbGFpdFNoYXBlKSA9PiB7XG4gICAgY29uc3QgQXV0b0NvbXBsZXRlTWFyZ2luID0gKDEyICsgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiAvIDIpICogMjtcbiAgICBsZXQgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGVsZW1lbnQucG9pbnRzKTtcbiAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShyZWN0YW5nbGUsIEF1dG9Db21wbGV0ZU1hcmdpbik7XG4gICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRFZGdlQ2VudGVyUG9pbnRzKHJlY3RhbmdsZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0SW5kZXhPZkF1dG9Db21wbGV0ZVBvaW50ID0gKG1vdmluZ1BvaW50OiBQb2ludCwgcG9pbnRzOiBQb2ludFtdKSA9PiB7XG4gICAgcmV0dXJuIHBvaW50cy5maW5kSW5kZXgocG9pbnQgPT4ge1xuICAgICAgICBjb25zdCBtb3ZpbmdSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW21vdmluZ1BvaW50XSk7XG4gICAgICAgIGxldCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3BvaW50XSk7XG4gICAgICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUik7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQobW92aW5nUmVjdGFuZ2xlLCByZWN0YW5nbGUpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERyYXdEZWZhdWx0U3Ryb2tlQ29sb3IgPSAodGhlbWU6IFRoZW1lQ29sb3JNb2RlKSA9PiB7XG4gICAgcmV0dXJuIERyYXdUaGVtZUNvbG9yc1t0aGVtZV0uc3Ryb2tlQ29sb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmxvd2NoYXJ0RGVmYXVsdEZpbGwgPSAodGhlbWU6IFRoZW1lQ29sb3JNb2RlKSA9PiB7XG4gICAgcmV0dXJuIERyYXdUaGVtZUNvbG9yc1t0aGVtZV0uZmlsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0U2hhcGVQcm9wZXJ0eSA9IChib2FyZDogUGxhaXRCb2FyZCwgdGV4dDogc3RyaW5nIHwgRWxlbWVudCA9IERlZmF1bHRUZXh0UHJvcGVydHkudGV4dCwgZm9udFNpemU/OiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBmb250U2l6ZSA9IGZvbnRTaXplID8gTnVtYmVyKGZvbnRTaXplKSA6IERFRkFVTFRfRk9OVF9TSVpFO1xuICAgIGNvbnN0IHRleHRTaXplID0gZ2V0VGV4dFNpemUoYm9hcmQsIHRleHQsIEluZmluaXR5LCB7IGZvbnRTaXplIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB0ZXh0U2l6ZS53aWR0aCArIFNoYXBlRGVmYXVsdFNwYWNlLnJlY3RhbmdsZUFuZFRleHQgKiAyLFxuICAgICAgICBoZWlnaHQ6IHRleHRTaXplLmhlaWdodFxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEdlb21ldHJ5UG9pbnRzID0gKHBvaW50ZXI6IERyYXdQb2ludGVyVHlwZSwgY2VudGVyUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBnZXREZWZhdWx0R2VvbWV0cnlQcm9wZXJ0eShwb2ludGVyKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhcbiAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5Q2VudGVyUG9pbnQoY2VudGVyUG9pbnQsIHByb3BlcnR5LndpZHRoLCBwcm9wZXJ0eS5oZWlnaHQpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0R2VvbWV0cnlQcm9wZXJ0eSA9IChwb2ludGVyOiBEcmF3UG9pbnRlclR5cGUpID0+IHtcbiAgICBjb25zdCBpc0Zsb3dDaGFydCA9IGdldEZsb3djaGFydFBvaW50ZXJzKCkuaW5jbHVkZXMocG9pbnRlcik7XG4gICAgaWYgKGlzRmxvd0NoYXJ0KSB7XG4gICAgICAgIHJldHVybiBnZXREZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHkocG9pbnRlciBhcyBGbG93Y2hhcnRTeW1ib2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFRleHRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGNlbnRlclBvaW50OiBQb2ludCwgZm9udFNpemU/OiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGdldFRleHRTaGFwZVByb3BlcnR5KGJvYXJkLCBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIGZvbnRTaXplKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhcbiAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5Q2VudGVyUG9pbnQoY2VudGVyUG9pbnQsIHByb3BlcnR5LndpZHRoLCBwcm9wZXJ0eS5oZWlnaHQpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEdlb21ldHJ5KSA9PiB7XG4gICAgbWVtb3JpemVMYXRlc3RTaGFwZShib2FyZCwgZWxlbWVudC5zaGFwZSk7XG4gICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlKGJvYXJkLCBlbGVtZW50LCBbYm9hcmQuY2hpbGRyZW4ubGVuZ3RoXSk7XG4gICAgY2xlYXJTZWxlY3RlZEVsZW1lbnQoYm9hcmQpO1xuICAgIGFkZFNlbGVjdGVkRWxlbWVudChib2FyZCwgZWxlbWVudCk7XG4gICAgQm9hcmRUcmFuc2Zvcm1zLnVwZGF0ZVBvaW50ZXJUeXBlKGJvYXJkLCBQbGFpdFBvaW50ZXJUeXBlLnNlbGVjdGlvbik7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlVGV4dEVsZW1lbnQgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgcG9pbnRzOiBbUG9pbnQsIFBvaW50XSxcbiAgICB0ZXh0OiBzdHJpbmcgfCBFbGVtZW50ID0gRGVmYXVsdFRleHRQcm9wZXJ0eS50ZXh0LFxuICAgIHRleHRIZWlnaHQ/OiBudW1iZXJcbikgPT4ge1xuICAgIGNvbnN0IG1lbW9yaXplZExhdGVzdCA9IGdldE1lbW9yaXplZExhdGVzdEJ5UG9pbnRlcihCYXNpY1NoYXBlcy50ZXh0KTtcbiAgICB0ZXh0SGVpZ2h0ID0gdGV4dEhlaWdodCA/IHRleHRIZWlnaHQgOiBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKS5oZWlnaHQ7XG4gICAgcmV0dXJuIGNyZWF0ZUdlb21ldHJ5RWxlbWVudChCYXNpY1NoYXBlcy50ZXh0LCBwb2ludHMsIHRleHQsIG1lbW9yaXplZExhdGVzdC5nZW9tZXRyeVByb3BlcnRpZXMgYXMgR2VvbWV0cnlTdHlsZU9wdGlvbnMsIHtcbiAgICAgICAgLi4ubWVtb3JpemVkTGF0ZXN0LnRleHRQcm9wZXJ0aWVzLFxuICAgICAgICB0ZXh0SGVpZ2h0XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdEdlb21ldHJ5ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludHM6IFtQb2ludCwgUG9pbnRdLCBzaGFwZTogR2VvbWV0cnlTaGFwZXMpID0+IHtcbiAgICBjb25zdCBtZW1vcml6ZWRMYXRlc3QgPSBnZXRNZW1vcml6ZWRMYXRlc3RCeVBvaW50ZXIoc2hhcGUpO1xuICAgIGNvbnN0IHRleHRIZWlnaHQgPSBnZXRUZXh0U2hhcGVQcm9wZXJ0eShib2FyZCwgRGVmYXVsdFRleHRQcm9wZXJ0eS50ZXh0LCBtZW1vcml6ZWRMYXRlc3QudGV4dFByb3BlcnRpZXNbJ2ZvbnQtc2l6ZSddKS5oZWlnaHQ7XG4gICAgcmV0dXJuIGNyZWF0ZUdlb21ldHJ5RWxlbWVudChcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgJycsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBEZWZhdWx0QmFzaWNTaGFwZVByb3BlcnR5LnN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgLi4uKG1lbW9yaXplZExhdGVzdC5nZW9tZXRyeVByb3BlcnRpZXMgYXMgR2VvbWV0cnlTdHlsZU9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIHsgLi4ubWVtb3JpemVkTGF0ZXN0LnRleHRQcm9wZXJ0aWVzLCB0ZXh0SGVpZ2h0IH1cbiAgICApO1xufTtcbiJdfQ==
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixVQUFVLEVBQ1YsZ0JBQWdCLEVBRWhCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUVyQixVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixPQUFPLEVBQ1AsVUFBVSxFQUNWLFNBQVMsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQWtCLFdBQVcsRUFBaUIsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FBUyxFQUFjLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFL0YsT0FBTyxFQUNILHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsbUJBQW1CLEVBRW5CLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3ZCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFB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eUJBQXlCLENBQUMsV0FBVztRQUNsRCxHQUFJLGVBQWUsQ0FBQyxrQkFBMkM7S0FDbEUsRUFDRCxFQUFFLEdBQUcsZUFBZSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsQ0FDcEQsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICBCb2FyZFRyYW5zZm9ybXMsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdFBvaW50ZXJUeXBlLFxuICAgIFBvaW50LFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgIFNFTEVDVElPTl9GSUxMX0NPTE9SLFxuICAgIFNOQVBQSU5HX1NUUk9LRV9XSURUSCxcbiAgICBUaGVtZUNvbG9yTW9kZSxcbiAgICBUcmFuc2Zvcm1zLFxuICAgIGFkZFNlbGVjdGVkRWxlbWVudCxcbiAgICBjbGVhclNlbGVjdGVkRWxlbWVudCxcbiAgICBjcmVhdGVHLFxuICAgIGRyYXdDaXJjbGUsXG4gICAgaWRDcmVhdG9yXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IEdlb21ldHJ5U2hhcGVzLCBCYXNpY1NoYXBlcywgUGxhaXRHZW9tZXRyeSwgRmxvd2NoYXJ0U3ltYm9scyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgQWxpZ25tZW50LCBDdXN0b21UZXh0LCBERUZBVUxUX0ZPTlRfU0laRSwgYnVpbGRUZXh0LCBnZXRUZXh0U2l6ZSB9IGZyb20gJ0BwbGFpdC90ZXh0JztcbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQge1xuICAgIERlZmF1bHRCYXNpY1NoYXBlUHJvcGVydHksXG4gICAgRGVmYXVsdEZsb3djaGFydFByb3BlcnR5TWFwLFxuICAgIERlZmF1bHRUZXh0UHJvcGVydHksXG4gICAgRHJhd1BvaW50ZXJUeXBlLFxuICAgIERyYXdUaGVtZUNvbG9ycyxcbiAgICBTaGFwZURlZmF1bHRTcGFjZSxcbiAgICBnZXRGbG93Y2hhcnRQb2ludGVyc1xufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldEVsZW1lbnRTaGFwZSB9IGZyb20gJy4vc2hhcGUnO1xuaW1wb3J0IHsgY3JlYXRlTGluZUVsZW1lbnQgfSBmcm9tICcuL2xpbmUvbGluZS1iYXNpYyc7XG5pbXBvcnQgeyBMaW5lTWFya2VyVHlwZSwgTGluZVNoYXBlLCBQbGFpdFNoYXBlRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGVmYXVsdExpbmVTdHlsZSB9IGZyb20gJy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IGdldE1lbW9yaXplZExhdGVzdEJ5UG9pbnRlciwgbWVtb3JpemVMYXRlc3RTaGFwZSB9IGZyb20gJy4vbWVtb3JpemUnO1xuXG5leHBvcnQgdHlwZSBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IFBpY2s8UGxhaXRHZW9tZXRyeSwgJ2ZpbGwnIHwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+O1xuXG5leHBvcnQgdHlwZSBUZXh0UHJvcGVydGllcyA9IFBhcnRpYWw8Q3VzdG9tVGV4dD4gJiB7IGFsaWduPzogQWxpZ25tZW50OyB0ZXh0SGVpZ2h0PzogbnVtYmVyIH07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHZW9tZXRyeUVsZW1lbnQgPSAoXG4gICAgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgdGV4dDogc3RyaW5nIHwgRWxlbWVudCxcbiAgICBvcHRpb25zOiBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IHt9LFxuICAgIHRleHRQcm9wZXJ0aWVzOiBUZXh0UHJvcGVydGllcyA9IHt9XG4pOiBQbGFpdEdlb21ldHJ5ID0+IHtcbiAgICBsZXQgdGV4dE9wdGlvbnMgPSB7fTtcbiAgICBsZXQgYWxpZ25tZW50OiB1bmRlZmluZWQgfCBBbGlnbm1lbnQgPSBBbGlnbm1lbnQuY2VudGVyO1xuICAgIGxldCB0ZXh0SGVpZ2h0ID0gRGVmYXVsdFRleHRQcm9wZXJ0eS5oZWlnaHQ7XG4gICAgaWYgKHNoYXBlID09PSBCYXNpY1NoYXBlcy50ZXh0KSB7XG4gICAgICAgIHRleHRPcHRpb25zID0geyBhdXRvU2l6ZTogdHJ1ZSB9O1xuICAgICAgICBhbGlnbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHRQcm9wZXJ0aWVzID0geyAuLi50ZXh0UHJvcGVydGllcyB9O1xuICAgIHRleHRQcm9wZXJ0aWVzPy5hbGlnbiAmJiAoYWxpZ25tZW50ID0gdGV4dFByb3BlcnRpZXM/LmFsaWduKTtcbiAgICB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodCAmJiAodGV4dEhlaWdodCA9IHRleHRQcm9wZXJ0aWVzPy50ZXh0SGVpZ2h0KTtcbiAgICBkZWxldGUgdGV4dFByb3BlcnRpZXM/LmFsaWduO1xuICAgIGRlbGV0ZSB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgIHR5cGU6ICdnZW9tZXRyeScsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgdGV4dEhlaWdodCxcbiAgICAgICAgdGV4dDogYnVpbGRUZXh0KHRleHQsIGFsaWdubWVudCwgdGV4dFByb3BlcnRpZXMpLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIC4uLnRleHRPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0UmVjdGFuZ2xlID0gKGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpID0+IHtcbiAgICBjb25zdCBlbGVtZW50UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGVsZW1lbnQucG9pbnRzISk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50LnRleHRIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBlbGVtZW50UmVjdGFuZ2xlLndpZHRoIC0gU2hhcGVEZWZhdWx0U3BhY2UucmVjdGFuZ2xlQW5kVGV4dCAqIDIgLSBzdHJva2VXaWR0aCAqIDI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aDogd2lkdGggPiAwID8gd2lkdGggOiAwLFxuICAgICAgICB4OiBlbGVtZW50UmVjdGFuZ2xlLnggKyBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICsgc3Ryb2tlV2lkdGgsXG4gICAgICAgIHk6IGVsZW1lbnRSZWN0YW5nbGUueSArIChlbGVtZW50UmVjdGFuZ2xlLmhlaWdodCAtIGhlaWdodCkgLyAyXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3Qm91bmRSZWFjdGlvbiA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBlbGVtZW50OiBQbGFpdEdlb21ldHJ5LFxuICAgIG9wdGlvbnM6IHsgaGFzTWFzazogYm9vbGVhbjsgaGFzQ29ubmVjdG9yOiBib29sZWFuIH0gPSB7IGhhc01hc2s6IHRydWUsIGhhc0Nvbm5lY3RvcjogdHJ1ZSB9XG4pID0+IHtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUocmVjdGFuZ2xlLCBTTkFQUElOR19TVFJPS0VfV0lEVEgpO1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0RWxlbWVudFNoYXBlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHN0cm9rZUcgPSBkcmF3R2VvbWV0cnkoYm9hcmQsIGFjdGl2ZVJlY3RhbmdsZSwgc2hhcGUsIHtcbiAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICBzdHJva2VXaWR0aDogU05BUFBJTkdfU1RST0tFX1dJRFRIXG4gICAgfSk7XG4gICAgZy5hcHBlbmRDaGlsZChzdHJva2VHKTtcbiAgICBpZiAob3B0aW9ucy5oYXNNYXNrKSB7XG4gICAgICAgIGNvbnN0IG1hc2tHID0gZHJhd0dlb21ldHJ5KGJvYXJkLCBhY3RpdmVSZWN0YW5nbGUsIHNoYXBlLCB7XG4gICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMCxcbiAgICAgICAgICAgIGZpbGw6IFNFTEVDVElPTl9GSUxMX0NPTE9SLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH0pO1xuICAgICAgICBnLmFwcGVuZENoaWxkKG1hc2tHKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzQ29ubmVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RvclBvaW50cyA9IGdldEVuZ2luZShzaGFwZSkuZ2V0Q29ubmVjdG9yUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIGNvbm5lY3RvclBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUcgPSBkcmF3Q2lyY2xlKFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLCBwb2ludCwgOCwge1xuICAgICAgICAgICAgICAgIHN0cm9rZTogU0VMRUNUSU9OX0JPUkRFUl9DT0xPUixcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICAgICAgICAgICAgICBmaWxsOiAnI0ZGRicsXG4gICAgICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuYXBwZW5kQ2hpbGQoY2lyY2xlRyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZztcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3R2VvbWV0cnkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIG91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHNoYXBlOiBHZW9tZXRyeVNoYXBlcywgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIHJldHVybiBnZXRFbmdpbmUoc2hhcGUpLmRyYXcoYm9hcmQsIG91dGVyUmVjdGFuZ2xlLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXROZWFyZXN0UG9pbnQgPSAoZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRFbGVtZW50U2hhcGUoZWxlbWVudCk7XG4gICAgcmV0dXJuIGdldEVuZ2luZShzaGFwZSkuZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZSwgcG9pbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENlbnRlclBvaW50c09uUG9seWdvbiA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBjZW50ZXJQb2ludDogUG9pbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBqID0gaSA9PSBwb2ludHMubGVuZ3RoIC0gMSA/IDAgOiBpICsgMTtcbiAgICAgICAgY2VudGVyUG9pbnQucHVzaChbKHBvaW50c1tpXVswXSArIHBvaW50c1tqXVswXSkgLyAyLCAocG9pbnRzW2ldWzFdICsgcG9pbnRzW2pdWzFdKSAvIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbnRlclBvaW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGbG93Y2hhcnRQcm9wZXJ0eSA9IChzeW1ib2w6IEZsb3djaGFydFN5bWJvbHMpID0+IHtcbiAgICByZXR1cm4gRGVmYXVsdEZsb3djaGFydFByb3BlcnR5TWFwW3N5bWJvbF07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdEZsb3djaGFydCA9IChwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBkZWNpc2lvblByb3BlcnR5ID0gZ2V0RGVmYXVsdEZsb3djaGFydFByb3BlcnR5KEZsb3djaGFydFN5bWJvbHMuZGVjaXNpb24pO1xuICAgIGNvbnN0IHByb2Nlc3NQcm9wZXJ0eSA9IGdldERlZmF1bHRGbG93Y2hhcnRQcm9wZXJ0eShGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MpO1xuICAgIGNvbnN0IHRlcm1pbmFsUHJvcGVydHkgPSBnZXREZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHkoRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCk7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBzdHJva2VXaWR0aDogRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eS5zdHJva2VXaWR0aFxuICAgIH07XG5cbiAgICBjb25zdCBsaW5lT3B0aW9ucyA9IHtcbiAgICAgICAgc3Ryb2tlV2lkdGg6IERlZmF1bHRMaW5lU3R5bGUuc3Ryb2tlV2lkdGhcbiAgICB9O1xuICAgIGNvbnN0IHN0YXJ0RWxlbWVudCA9IGNyZWF0ZUdlb21ldHJ5RWxlbWVudChcbiAgICAgICAgRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCxcbiAgICAgICAgZ2V0RGVmYXVsdEdlb21ldHJ5UG9pbnRzKEZsb3djaGFydFN5bWJvbHMudGVybWluYWwsIHBvaW50KSxcbiAgICAgICAgJ+W8gOWniycsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgcHJvY2Vzc1BvaW50MTogUG9pbnQgPSBbcG9pbnRbMF0sIHBvaW50WzFdICsgdGVybWluYWxQcm9wZXJ0eS5oZWlnaHQgLyAyICsgNTUgKyBwcm9jZXNzUHJvcGVydHkuaGVpZ2h0IC8gMl07XG4gICAgY29uc3QgcHJvY2Vzc0VsZW1lbnQxID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsXG4gICAgICAgIGdldERlZmF1bHRHZW9tZXRyeVBvaW50cyhGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsIHByb2Nlc3NQb2ludDEpLFxuICAgICAgICAn6L+H56iLJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNpc2lvblBvaW50OiBQb2ludCA9IFtwcm9jZXNzUG9pbnQxWzBdLCBwcm9jZXNzUG9pbnQxWzFdICsgcHJvY2Vzc1Byb3BlcnR5LmhlaWdodCAvIDIgKyA1NSArIGRlY2lzaW9uUHJvcGVydHkuaGVpZ2h0IC8gMl07XG4gICAgY29uc3QgZGVjaXNpb25FbGVtZW50ID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLmRlY2lzaW9uLFxuICAgICAgICBnZXREZWZhdWx0R2VvbWV0cnlQb2ludHMoRmxvd2NoYXJ0U3ltYm9scy5kZWNpc2lvbiwgZGVjaXNpb25Qb2ludCksXG4gICAgICAgICfov4fnqIsnLFxuICAgICAgICBvcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHByb2Nlc3NQb2ludDI6IFBvaW50ID0gW2RlY2lzaW9uUG9pbnRbMF0gKyBkZWNpc2lvblByb3BlcnR5LndpZHRoIC8gMiArIDc1ICsgcHJvY2Vzc1Byb3BlcnR5LndpZHRoIC8gMiwgZGVjaXNpb25Qb2ludFsxXV07XG4gICAgY29uc3QgcHJvY2Vzc0VsZW1lbnQyID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsXG4gICAgICAgIGdldERlZmF1bHRHZW9tZXRyeVBvaW50cyhGbG93Y2hhcnRTeW1ib2xzLnByb2Nlc3MsIHByb2Nlc3NQb2ludDIpLFxuICAgICAgICAn6L+H56iLJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBlbmRQb2ludDogUG9pbnQgPSBbZGVjaXNpb25Qb2ludFswXSwgZGVjaXNpb25Qb2ludFsxXSArIGRlY2lzaW9uUHJvcGVydHkuaGVpZ2h0IC8gMiArIDk1ICsgdGVybWluYWxQcm9wZXJ0eS5oZWlnaHQgLyAyXTtcbiAgICBjb25zdCBlbmRFbGVtZW50ID0gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBGbG93Y2hhcnRTeW1ib2xzLnRlcm1pbmFsLFxuICAgICAgICBnZXREZWZhdWx0R2VvbWV0cnlQb2ludHMoRmxvd2NoYXJ0U3ltYm9scy50ZXJtaW5hbCwgZW5kUG9pbnQpLFxuICAgICAgICAn57uT5p2fJyxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBsaW5lMSA9IGNyZWF0ZUxpbmVFbGVtZW50KFxuICAgICAgICBMaW5lU2hhcGUuZWxib3csXG4gICAgICAgIFtcbiAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgIFswLCAwXVxuICAgICAgICBdLFxuICAgICAgICB7IG1hcmtlcjogTGluZU1hcmtlclR5cGUubm9uZSwgY29ubmVjdGlvbjogWzAuNSwgMV0sIGJvdW5kSWQ6IHN0YXJ0RWxlbWVudC5pZCB9LFxuICAgICAgICB7IG1hcmtlcjogTGluZU1hcmtlclR5cGUuYXJyb3csIGNvbm5lY3Rpb246IFswLjUsIDBdLCBib3VuZElkOiBwcm9jZXNzRWxlbWVudDEuaWQgfSxcbiAgICAgICAgW10sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmUyID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMC41LCAxXSwgYm91bmRJZDogcHJvY2Vzc0VsZW1lbnQxLmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzAuNSwgMF0sIGJvdW5kSWQ6IGRlY2lzaW9uRWxlbWVudC5pZCB9LFxuICAgICAgICBbXSxcbiAgICAgICAgbGluZU9wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgbGluZTMgPSBjcmVhdGVMaW5lRWxlbWVudChcbiAgICAgICAgTGluZVNoYXBlLmVsYm93LFxuICAgICAgICBbXG4gICAgICAgICAgICBbMCwgMF0sXG4gICAgICAgICAgICBbMCwgMF1cbiAgICAgICAgXSxcbiAgICAgICAgeyBtYXJrZXI6IExpbmVNYXJrZXJUeXBlLm5vbmUsIGNvbm5lY3Rpb246IFswLjUsIDFdLCBib3VuZElkOiBkZWNpc2lvbkVsZW1lbnQuaWQgfSxcbiAgICAgICAgeyBtYXJrZXI6IExpbmVNYXJrZXJUeXBlLmFycm93LCBjb25uZWN0aW9uOiBbMC41LCAwXSwgYm91bmRJZDogZW5kRWxlbWVudC5pZCB9LFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogYnVpbGRUZXh0KCfmmK8nKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogMC41LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmU0ID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMSwgMC41XSwgYm91bmRJZDogZGVjaXNpb25FbGVtZW50LmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzAsIDAuNV0sIGJvdW5kSWQ6IHByb2Nlc3NFbGVtZW50Mi5pZCB9LFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogYnVpbGRUZXh0KCflkKYnKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogMC41LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmU1ID0gY3JlYXRlTGluZUVsZW1lbnQoXG4gICAgICAgIExpbmVTaGFwZS5lbGJvdyxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzAsIDBdXG4gICAgICAgIF0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5ub25lLCBjb25uZWN0aW9uOiBbMC41LCAxXSwgYm91bmRJZDogcHJvY2Vzc0VsZW1lbnQyLmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogWzEsIDAuNV0sIGJvdW5kSWQ6IGVuZEVsZW1lbnQuaWQgfSxcbiAgICAgICAgW10sXG4gICAgICAgIGxpbmVPcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiBbc3RhcnRFbGVtZW50LCBwcm9jZXNzRWxlbWVudDEsIGRlY2lzaW9uRWxlbWVudCwgcHJvY2Vzc0VsZW1lbnQyLCBlbmRFbGVtZW50LCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTVdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEF1dG9Db21wbGV0ZVBvaW50cyA9IChlbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IEF1dG9Db21wbGV0ZU1hcmdpbiA9ICgxMiArIFJFU0laRV9IQU5ETEVfRElBTUVURVIgLyAyKSAqIDI7XG4gICAgbGV0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUocmVjdGFuZ2xlLCBBdXRvQ29tcGxldGVNYXJnaW4pO1xuICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhyZWN0YW5nbGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdEluZGV4T2ZBdXRvQ29tcGxldGVQb2ludCA9IChtb3ZpbmdQb2ludDogUG9pbnQsIHBvaW50czogUG9pbnRbXSkgPT4ge1xuICAgIHJldHVybiBwb2ludHMuZmluZEluZGV4KHBvaW50ID0+IHtcbiAgICAgICAgY29uc3QgbW92aW5nUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFttb3ZpbmdQb2ludF0pO1xuICAgICAgICBsZXQgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtwb2ludF0pO1xuICAgICAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShyZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIpO1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KG1vdmluZ1JlY3RhbmdsZSwgcmVjdGFuZ2xlKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREcmF3RGVmYXVsdFN0cm9rZUNvbG9yID0gKHRoZW1lOiBUaGVtZUNvbG9yTW9kZSkgPT4ge1xuICAgIHJldHVybiBEcmF3VGhlbWVDb2xvcnNbdGhlbWVdLnN0cm9rZUNvbG9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZsb3djaGFydERlZmF1bHRGaWxsID0gKHRoZW1lOiBUaGVtZUNvbG9yTW9kZSkgPT4ge1xuICAgIHJldHVybiBEcmF3VGhlbWVDb2xvcnNbdGhlbWVdLmZpbGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dFNoYXBlUHJvcGVydHkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHRleHQ6IHN0cmluZyB8IEVsZW1lbnQgPSBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIGZvbnRTaXplPzogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gICAgZm9udFNpemUgPSBmb250U2l6ZSA/IE51bWJlcihmb250U2l6ZSkgOiBERUZBVUxUX0ZPTlRfU0laRTtcbiAgICBjb25zdCB0ZXh0U2l6ZSA9IGdldFRleHRTaXplKGJvYXJkLCB0ZXh0LCBJbmZpbml0eSwgeyBmb250U2l6ZSB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdGV4dFNpemUud2lkdGggKyBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICogMixcbiAgICAgICAgaGVpZ2h0OiB0ZXh0U2l6ZS5oZWlnaHRcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRHZW9tZXRyeVBvaW50cyA9IChwb2ludGVyOiBEcmF3UG9pbnRlclR5cGUsIGNlbnRlclBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gZ2V0RGVmYXVsdEdlb21ldHJ5UHJvcGVydHkocG9pbnRlcik7XG4gICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRQb2ludHMoUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5Q2VudGVyUG9pbnQoY2VudGVyUG9pbnQsIHByb3BlcnR5LndpZHRoLCBwcm9wZXJ0eS5oZWlnaHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0R2VvbWV0cnlQcm9wZXJ0eSA9IChwb2ludGVyOiBEcmF3UG9pbnRlclR5cGUpID0+IHtcbiAgICBjb25zdCBpc0Zsb3dDaGFydCA9IGdldEZsb3djaGFydFBvaW50ZXJzKCkuaW5jbHVkZXMocG9pbnRlcik7XG4gICAgaWYgKGlzRmxvd0NoYXJ0KSB7XG4gICAgICAgIHJldHVybiBnZXREZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHkocG9pbnRlciBhcyBGbG93Y2hhcnRTeW1ib2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFRleHRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGNlbnRlclBvaW50OiBQb2ludCwgZm9udFNpemU/OiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGdldFRleHRTaGFwZVByb3BlcnR5KGJvYXJkLCBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIGZvbnRTaXplKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChjZW50ZXJQb2ludCwgcHJvcGVydHkud2lkdGgsIHByb3BlcnR5LmhlaWdodCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEVsZW1lbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpID0+IHtcbiAgICBtZW1vcml6ZUxhdGVzdFNoYXBlKGJvYXJkLCBlbGVtZW50LnNoYXBlKTtcbiAgICBUcmFuc2Zvcm1zLmluc2VydE5vZGUoYm9hcmQsIGVsZW1lbnQsIFtib2FyZC5jaGlsZHJlbi5sZW5ndGhdKTtcbiAgICBjbGVhclNlbGVjdGVkRWxlbWVudChib2FyZCk7XG4gICAgYWRkU2VsZWN0ZWRFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBCb2FyZFRyYW5zZm9ybXMudXBkYXRlUG9pbnRlclR5cGUoYm9hcmQsIFBsYWl0UG9pbnRlclR5cGUuc2VsZWN0aW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUZXh0RWxlbWVudCA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBwb2ludHM6IFtQb2ludCwgUG9pbnRdLFxuICAgIHRleHQ6IHN0cmluZyB8IEVsZW1lbnQgPSBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsXG4gICAgdGV4dEhlaWdodD86IG51bWJlclxuKSA9PiB7XG4gICAgY29uc3QgbWVtb3JpemVkTGF0ZXN0ID0gZ2V0TWVtb3JpemVkTGF0ZXN0QnlQb2ludGVyKEJhc2ljU2hhcGVzLnRleHQpO1xuICAgIHRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0ID8gdGV4dEhlaWdodCA6IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpLmhlaWdodDtcbiAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50KEJhc2ljU2hhcGVzLnRleHQsIHBvaW50cywgdGV4dCwgbWVtb3JpemVkTGF0ZXN0Lmdlb21ldHJ5UHJvcGVydGllcyBhcyBHZW9tZXRyeVN0eWxlT3B0aW9ucywge1xuICAgICAgICAuLi5tZW1vcml6ZWRMYXRlc3QudGV4dFByb3BlcnRpZXMsXG4gICAgICAgIHRleHRIZWlnaHRcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEZWZhdWx0R2VvbWV0cnkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50czogW1BvaW50LCBQb2ludF0sIHNoYXBlOiBHZW9tZXRyeVNoYXBlcykgPT4ge1xuICAgIGNvbnN0IG1lbW9yaXplZExhdGVzdCA9IGdldE1lbW9yaXplZExhdGVzdEJ5UG9pbnRlcihzaGFwZSk7XG4gICAgY29uc3QgdGV4dEhlaWdodCA9IGdldFRleHRTaGFwZVByb3BlcnR5KGJvYXJkLCBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIG1lbW9yaXplZExhdGVzdC50ZXh0UHJvcGVydGllc1snZm9udC1zaXplJ10pLmhlaWdodDtcbiAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50KFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICAnJyxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IERlZmF1bHRCYXNpY1NoYXBlUHJvcGVydHkuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAuLi4obWVtb3JpemVkTGF0ZXN0Lmdlb21ldHJ5UHJvcGVydGllcyBhcyBHZW9tZXRyeVN0eWxlT3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgeyAuLi5tZW1vcml6ZWRMYXRlc3QudGV4dFByb3BlcnRpZXMsIHRleHRIZWlnaHQgfVxuICAgICk7XG59O1xuIl19
@@ -1,12 +1,12 @@
1
- import { RectangleClient, isPolylineHitRectangle, distanceBetweenPointAndSegments, distanceBetweenPointAndPoint, HIT_DISTANCE_BUFFER, rotate } from '@plait/core';
1
+ import { RectangleClient, isPolylineHitRectangle, distanceBetweenPointAndSegments, distanceBetweenPointAndPoint, HIT_DISTANCE_BUFFER, rotatePointsByElement, rotateAntiPointsByElement } from '@plait/core';
2
2
  import { PlaitDrawElement } from '../interfaces';
3
- import { TRANSPARENT, rotatePoints } from '@plait/common';
4
- import { getTextRectangle } from './geometry';
3
+ import { TRANSPARENT } from '@plait/common';
4
+ import { getNearestPoint, getTextRectangle } from './geometry';
5
5
  import { getLinePoints } from './line/line-basic';
6
6
  import { getFillByElement } from './style/stroke';
7
7
  import { DefaultGeometryStyle } from '../constants/geometry';
8
8
  import { getEngine } from '../engines';
9
- import { getShape } from './shape';
9
+ import { getElementShape } from './shape';
10
10
  import { getHitLineTextIndex } from './position/line';
11
11
  export const isTextExceedingBounds = (geometry) => {
12
12
  const client = RectangleClient.getRectangleByPoints(geometry.points);
@@ -31,18 +31,18 @@ export const isRectangleHitDrawElement = (board, element, selection) => {
31
31
  const rangeRectangle = RectangleClient.getRectangleByPoints([selection.anchor, selection.focus]);
32
32
  if (PlaitDrawElement.isGeometry(element)) {
33
33
  const client = RectangleClient.getRectangleByPoints(element.points);
34
- const centerPoint = RectangleClient.getCenterPoint(client);
35
- let rotatedCornerPoints = rotatePoints(RectangleClient.getCornerPoints(client), centerPoint, element.angle);
34
+ let rotatedCornerPoints = rotatePointsByElement(RectangleClient.getCornerPoints(client), element) || RectangleClient.getCornerPoints(client);
36
35
  if (isTextExceedingBounds(element)) {
37
36
  const textClient = getTextRectangle(element);
38
- rotatedCornerPoints = rotatePoints(RectangleClient.getCornerPoints(textClient), centerPoint, element.angle);
37
+ rotatedCornerPoints =
38
+ rotatePointsByElement(RectangleClient.getCornerPoints(textClient), element) || RectangleClient.getCornerPoints(textClient);
39
39
  }
40
40
  return isPolylineHitRectangle(rotatedCornerPoints, rangeRectangle);
41
41
  }
42
42
  if (PlaitDrawElement.isImage(element)) {
43
43
  const client = RectangleClient.getRectangleByPoints(element.points);
44
- const rotatedCornerPoints = rotatePoints(RectangleClient.getCornerPoints(client), RectangleClient.getCenterPoint(client), element.angle);
45
- return isPolylineHitRectangle(rotatedCornerPoints, client);
44
+ const rotatedCornerPoints = rotatePointsByElement(RectangleClient.getCornerPoints(client), element) || RectangleClient.getCornerPoints(client);
45
+ return isPolylineHitRectangle(rotatedCornerPoints, rangeRectangle);
46
46
  }
47
47
  if (PlaitDrawElement.isLine(element)) {
48
48
  const points = getLinePoints(board, element);
@@ -52,19 +52,13 @@ export const isRectangleHitDrawElement = (board, element, selection) => {
52
52
  };
53
53
  export const isHitDrawElement = (board, element, point) => {
54
54
  const rectangle = board.getRectangle(element);
55
- const centerPoint = RectangleClient.getCenterPoint(rectangle);
56
- if (element.angle) {
57
- point = rotate(point[0], point[1], centerPoint[0], centerPoint[1], -element.angle);
58
- }
55
+ point = rotateAntiPointsByElement(point, element) || point;
59
56
  if (PlaitDrawElement.isGeometry(element)) {
60
57
  const fill = getFillByElement(board, element);
61
- const engine = getEngine(getShape(element));
62
- const nearestPoint = engine.getNearestPoint(rectangle, point);
63
- const distance = distanceBetweenPointAndPoint(nearestPoint[0], nearestPoint[1], point[0], point[1]);
64
- const isHitEdge = distance <= HIT_DISTANCE_BUFFER;
65
- if (isHitEdge) {
66
- return isHitEdge;
58
+ if (isHitEdgeOfShape(board, element, point, HIT_DISTANCE_BUFFER)) {
59
+ return true;
67
60
  }
61
+ const engine = getEngine(getElementShape(element));
68
62
  // when shape equals text, fill is not allowed
69
63
  if (fill !== DefaultGeometryStyle.fill && fill !== TRANSPARENT && !PlaitDrawElement.isText(element)) {
70
64
  const isHitInside = engine.isInsidePoint(rectangle, point);
@@ -88,21 +82,28 @@ export const isHitDrawElement = (board, element, point) => {
88
82
  }
89
83
  }
90
84
  if (PlaitDrawElement.isImage(element)) {
91
- return isRectangleHitDrawElement(board, element, { anchor: point, focus: point });
85
+ const client = RectangleClient.getRectangleByPoints(element.points);
86
+ return RectangleClient.isPointInRectangle(client, point);
92
87
  }
93
88
  if (PlaitDrawElement.isLine(element)) {
94
89
  return isHitLine(board, element, point);
95
90
  }
96
91
  return null;
97
92
  };
93
+ export const isHitEdgeOfShape = (board, element, point, hitDistanceBuffer) => {
94
+ const nearestPoint = getNearestPoint(element, point);
95
+ const distance = distanceBetweenPointAndPoint(nearestPoint[0], nearestPoint[1], point[0], point[1]);
96
+ return distance <= hitDistanceBuffer;
97
+ };
98
+ export const isInsideOfShape = (board, element, point, hitDistanceBuffer) => {
99
+ const client = RectangleClient.inflate(RectangleClient.getRectangleByPoints(element.points), hitDistanceBuffer);
100
+ return getEngine(getElementShape(element)).isInsidePoint(client, point);
101
+ };
98
102
  export const isHitElementInside = (board, element, point) => {
99
103
  const rectangle = board.getRectangle(element);
100
- const centerPoint = RectangleClient.getCenterPoint(rectangle);
101
- if (element.angle) {
102
- point = rotate(point[0], point[1], centerPoint[0], centerPoint[1], -element.angle);
103
- }
104
+ point = rotateAntiPointsByElement(point, element) || point;
104
105
  if (PlaitDrawElement.isGeometry(element)) {
105
- const engine = getEngine(getShape(element));
106
+ const engine = getEngine(getElementShape(element));
106
107
  const isHitInside = engine.isInsidePoint(rectangle, point);
107
108
  if (isHitInside) {
108
109
  return isHitInside;
@@ -116,11 +117,12 @@ export const isHitElementInside = (board, element, point) => {
116
117
  }
117
118
  }
118
119
  if (PlaitDrawElement.isImage(element)) {
119
- return isRectangleHitDrawElement(board, element, { anchor: point, focus: point });
120
+ const client = RectangleClient.getRectangleByPoints(element.points);
121
+ return RectangleClient.isPointInRectangle(client, point);
120
122
  }
121
123
  if (PlaitDrawElement.isLine(element)) {
122
124
  return isHitLine(board, element, point);
123
125
  }
124
126
  return null;
125
127
  };
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvaGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxlQUFlLEVBR2Ysc0JBQXNCLEVBRXRCLCtCQUErQixFQUMvQiw0QkFBNEIsRUFDNUIsbUJBQW1CLEVBQ25CLE1BQU0sRUFDVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBdUIsRUFBRSxFQUFFO0lBQzdELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFH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a0JBQWtCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxrQkFBa0IsQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE9BQU8seUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFNlbGVjdGlvbixcbiAgICBQbGFpdEJvYXJkLFxuICAgIGlzUG9seWxpbmVIaXRSZWN0YW5nbGUsXG4gICAgUG9pbnQsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyxcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50LFxuICAgIEhJVF9ESVNUQU5DRV9CVUZGRVIsXG4gICAgcm90YXRlXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0R2VvbWV0cnksIFBsYWl0TGluZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVFJBTlNQQVJFTlQsIHJvdGF0ZVBvaW50cyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0VGV4dFJlY3RhbmdsZSB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZVBvaW50cyB9IGZyb20gJy4vbGluZS9saW5lLWJhc2ljJztcbmltcG9ydCB7IGdldEZpbGxCeUVsZW1lbnQgfSBmcm9tICcuL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBEZWZhdWx0R2VvbWV0cnlTdHlsZSB9IGZyb20gJy4uL2NvbnN0YW50cy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi9zaGFwZSc7XG5pbXBvcnQgeyBnZXRIaXRMaW5lVGV4dEluZGV4IH0gZnJvbSAnLi9wb3NpdGlvbi9saW5lJztcblxuZXhwb3J0IGNvbnN0IGlzVGV4dEV4Y2VlZGluZ0JvdW5kcyA9IChnZW9tZXRyeTogUGxhaXRHZW9tZXRyeSkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhnZW9tZXRyeS5wb2ludHMpO1xuICAgIGlmIChnZW9tZXRyeS50ZXh0SGVpZ2h0ID4gY2xpZW50LmhlaWdodCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0TGluZVRleHQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgcmV0dXJuIGdldEhpdExpbmVUZXh0SW5kZXgoYm9hcmQsIGVsZW1lbnQsIHBvaW50KSAhPT0gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRQb2x5TGluZSA9IChwYXRoUG9pbnRzOiBQb2ludFtdLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMocGF0aFBvaW50cywgcG9pbnQpO1xuICAgIHJldHVybiBkaXN0YW5jZSA8PSBISVRfRElTVEFOQ0VfQlVGRkVSO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0TGluZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBwb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBpc0hpdFRleHQgPSBpc0hpdExpbmVUZXh0KGJvYXJkLCBlbGVtZW50LCBwb2ludCk7XG4gICAgcmV0dXJuIGlzSGl0VGV4dCB8fCBpc0hpdFBvbHlMaW5lKHBvaW50cywgcG9pbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVjdGFuZ2xlSGl0RHJhd0VsZW1lbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCByYW5nZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbc2VsZWN0aW9uLmFuY2hvciwgc2VsZWN0aW9uLmZvY3VzXSk7XG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNHZW9tZXRyeShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChjbGllbnQpO1xuICAgICAgICBsZXQgcm90YXRlZENvcm5lclBvaW50cyA9IHJvdGF0ZVBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0Q29ybmVyUG9pbnRzKGNsaWVudCksIGNlbnRlclBvaW50LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgaWYgKGlzVGV4dEV4Y2VlZGluZ0JvdW5kcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICByb3RhdGVkQ29ybmVyUG9pbnRzID0gcm90YXRlUG9pbnRzKFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHModGV4dENsaWVudCksIGNlbnRlclBvaW50LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNQb2x5bGluZUhpdFJlY3RhbmdsZShyb3RhdGVkQ29ybmVyUG9pbnRzLCByYW5nZVJlY3RhbmdsZSk7XG4gICAgfVxuXG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgICAgICBjb25zdCByb3RhdGVkQ29ybmVyUG9pbnRzID0gcm90YXRlUG9pbnRzKFxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhjbGllbnQpLFxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KGNsaWVudCksXG4gICAgICAgICAgICBlbGVtZW50LmFuZ2xlXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBpc1BvbHlsaW5lSGl0UmVjdGFuZ2xlKHJvdGF0ZWRDb3JuZXJQb2ludHMsIGNsaWVudCk7XG4gICAgfVxuXG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNMaW5lKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gaXNQb2x5bGluZUhpdFJlY3RhbmdsZShwb2ludHMsIHJhbmdlUmVjdGFuZ2xlKTtcbiAgICB9XG4gICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdERyYXdFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEVsZW1lbnQsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGJvYXJkLmdldFJlY3RhbmdsZShlbGVtZW50KTtcbiAgICBjb25zdCBjZW50ZXJQb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChyZWN0YW5nbGUhKTtcbiAgICBpZiAoZWxlbWVudC5hbmdsZSkge1xuICAgICAgICBwb2ludCA9IHJvdGF0ZShwb2ludFswXSwgcG9pbnRbMV0sIGNlbnRlclBvaW50WzBdLCBjZW50ZXJQb2ludFsxXSwgLWVsZW1lbnQuYW5nbGUpIGFzIFBvaW50O1xuICAgIH1cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGZpbGwgPSBnZXRGaWxsQnlFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZW5naW5lID0gZ2V0RW5naW5lKGdldFNoYXBlKGVsZW1lbnQpKTtcbiAgICAgICAgY29uc3QgbmVhcmVzdFBvaW50ID0gZW5naW5lLmdldE5lYXJlc3RQb2ludChyZWN0YW5nbGUhLCBwb2ludCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChuZWFyZXN0UG9pbnRbMF0sIG5lYXJlc3RQb2ludFsxXSwgcG9pbnRbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgY29uc3QgaXNIaXRFZGdlID0gZGlzdGFuY2UgPD0gSElUX0RJU1RBTkNFX0JVRkZFUjtcbiAgICAgICAgaWYgKGlzSGl0RWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzSGl0RWRnZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHNoYXBlIGVxdWFscyB0ZXh0LCBmaWxsIGlzIG5vdCBhbGxvd2VkXG4gICAgICAgIGlmIChmaWxsICE9PSBEZWZhdWx0R2VvbWV0cnlTdHlsZS5maWxsICYmIGZpbGwgIT09IFRSQU5TUEFSRU5UICYmICFQbGFpdERyYXdFbGVtZW50LmlzVGV4dChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgaXNIaXRJbnNpZGUgPSBlbmdpbmUuaXNJbnNpZGVQb2ludChyZWN0YW5nbGUhLCBwb2ludCk7XG4gICAgICAgICAgICBpZiAoaXNIaXRJbnNpZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIaXRJbnNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBzaGFwZSBlcXVhbHMgdGV4dCwgb25seSBjaGVjayB0ZXh0IHJlY3RhbmdsZVxuICAgICAgICAgICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNUZXh0KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzSGl0VGV4dCA9IFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGV4dENsaWVudCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0hpdFRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHRSZWN0YW5nbGUgb2YgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGVuZ2luZS5nZXRUZXh0UmVjdGFuZ2xlID8gZW5naW5lLmdldFRleHRSZWN0YW5nbGUoZWxlbWVudCkgOiBnZXRUZXh0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNIaXRUZXh0UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0ZXh0Q2xpZW50LCBwb2ludCk7XG4gICAgICAgICAgICBpZiAoaXNIaXRUZXh0UmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzSGl0VGV4dFJlY3RhbmdsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBpc1JlY3RhbmdsZUhpdERyYXdFbGVtZW50KGJvYXJkLCBlbGVtZW50LCB7IGFuY2hvcjogcG9pbnQsIGZvY3VzOiBwb2ludCB9KTtcbiAgICB9XG5cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0xpbmUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGlzSGl0TGluZShib2FyZCwgZWxlbWVudCwgcG9pbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdEVsZW1lbnRJbnNpZGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gYm9hcmQuZ2V0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgIGNvbnN0IGNlbnRlclBvaW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KHJlY3RhbmdsZSEpO1xuICAgIGlmIChlbGVtZW50LmFuZ2xlKSB7XG4gICAgICAgIHBvaW50ID0gcm90YXRlKHBvaW50WzBdLCBwb2ludFsxXSwgY2VudGVyUG9pbnRbMF0sIGNlbnRlclBvaW50WzFdLCAtZWxlbWVudC5hbmdsZSkgYXMgUG9pbnQ7XG4gICAgfVxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzR2VvbWV0cnkoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgZW5naW5lID0gZ2V0RW5naW5lKGdldFNoYXBlKGVsZW1lbnQpKTtcbiAgICAgICAgY29uc3QgaXNIaXRJbnNpZGUgPSBlbmdpbmUuaXNJbnNpZGVQb2ludChyZWN0YW5nbGUhLCBwb2ludCk7XG4gICAgICAgIGlmIChpc0hpdEluc2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzSGl0SW5zaWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZ2luZS5nZXRUZXh0UmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Q2xpZW50ID0gZW5naW5lLmdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBpc0hpdFRleHRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaXNQb2ludEluUmVjdGFuZ2xlKHRleHRDbGllbnQsIHBvaW50KTtcbiAgICAgICAgICAgIGlmIChpc0hpdFRleHRSZWN0YW5nbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIaXRUZXh0UmVjdGFuZ2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzSW1hZ2UoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGlzUmVjdGFuZ2xlSGl0RHJhd0VsZW1lbnQoYm9hcmQsIGVsZW1lbnQsIHsgYW5jaG9yOiBwb2ludCwgZm9jdXM6IHBvaW50IH0pO1xuICAgIH1cblxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzTGluZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gaXNIaXRMaW5lKGJvYXJkLCBlbGVtZW50LCBwb2ludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuIl19
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvaGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxlQUFlLEVBR2Ysc0JBQXNCLEVBRXRCLCtCQUErQixFQUMvQiw0QkFBNEIsRUFDNUIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQXVCLEVBQUUsRUFBRTtJQUM3RCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FB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T0FBTyxDQUFDLENBQUM7WUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxrQkFBa0IsQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEUsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUGxhaXRFbGVtZW50LFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBTZWxlY3Rpb24sXG4gICAgUGxhaXRCb2FyZCxcbiAgICBpc1BvbHlsaW5lSGl0UmVjdGFuZ2xlLFxuICAgIFBvaW50LFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCxcbiAgICBISVRfRElTVEFOQ0VfQlVGRkVSLFxuICAgIHJvdGF0ZVBvaW50c0J5RWxlbWVudCxcbiAgICByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50XG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0R2VvbWV0cnksIFBsYWl0TGluZSwgUGxhaXRTaGFwZUVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRSQU5TUEFSRU5UIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBnZXROZWFyZXN0UG9pbnQsIGdldFRleHRSZWN0YW5nbGUgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7IGdldExpbmVQb2ludHMgfSBmcm9tICcuL2xpbmUvbGluZS1iYXNpYyc7XG5pbXBvcnQgeyBnZXRGaWxsQnlFbGVtZW50IH0gZnJvbSAnLi9zdHlsZS9zdHJva2UnO1xuaW1wb3J0IHsgRGVmYXVsdEdlb21ldHJ5U3R5bGUgfSBmcm9tICcuLi9jb25zdGFudHMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBnZXRFbGVtZW50U2hhcGUgfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IGdldEhpdExpbmVUZXh0SW5kZXggfSBmcm9tICcuL3Bvc2l0aW9uL2xpbmUnO1xuXG5leHBvcnQgY29uc3QgaXNUZXh0RXhjZWVkaW5nQm91bmRzID0gKGdlb21ldHJ5OiBQbGFpdEdlb21ldHJ5KSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGdlb21ldHJ5LnBvaW50cyk7XG4gICAgaWYgKGdlb21ldHJ5LnRleHRIZWlnaHQgPiBjbGllbnQuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRMaW5lVGV4dCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICByZXR1cm4gZ2V0SGl0TGluZVRleHRJbmRleChib2FyZCwgZWxlbWVudCwgcG9pbnQpICE9PSAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdFBvbHlMaW5lID0gKHBhdGhQb2ludHM6IFBvaW50W10sIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyhwYXRoUG9pbnRzLCBwb2ludCk7XG4gICAgcmV0dXJuIGRpc3RhbmNlIDw9IEhJVF9ESVNUQU5DRV9CVUZGRVI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRMaW5lID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGlzSGl0VGV4dCA9IGlzSGl0TGluZVRleHQoYm9hcmQsIGVsZW1lbnQsIHBvaW50KTtcbiAgICByZXR1cm4gaXNIaXRUZXh0IHx8IGlzSGl0UG9seUxpbmUocG9pbnRzLCBwb2ludCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSZWN0YW5nbGVIaXREcmF3RWxlbWVudCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHJhbmdlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtzZWxlY3Rpb24uYW5jaG9yLCBzZWxlY3Rpb24uZm9jdXNdKTtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgIGxldCByb3RhdGVkQ29ybmVyUG9pbnRzID1cbiAgICAgICAgICAgIHJvdGF0ZVBvaW50c0J5RWxlbWVudChSZWN0YW5nbGVDbGllbnQuZ2V0Q29ybmVyUG9pbnRzKGNsaWVudCksIGVsZW1lbnQpIHx8IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMoY2xpZW50KTtcbiAgICAgICAgaWYgKGlzVGV4dEV4Y2VlZGluZ0JvdW5kcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICByb3RhdGVkQ29ybmVyUG9pbnRzID1cbiAgICAgICAgICAgICAgICByb3RhdGVQb2ludHNCeUVsZW1lbnQoUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyh0ZXh0Q2xpZW50KSwgZWxlbWVudCkgfHwgUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyh0ZXh0Q2xpZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNQb2x5bGluZUhpdFJlY3RhbmdsZShyb3RhdGVkQ29ybmVyUG9pbnRzLCByYW5nZVJlY3RhbmdsZSk7XG4gICAgfVxuXG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgICAgICBjb25zdCByb3RhdGVkQ29ybmVyUG9pbnRzID1cbiAgICAgICAgICAgIHJvdGF0ZVBvaW50c0J5RWxlbWVudChSZWN0YW5nbGVDbGllbnQuZ2V0Q29ybmVyUG9pbnRzKGNsaWVudCksIGVsZW1lbnQpIHx8IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMoY2xpZW50KTtcbiAgICAgICAgcmV0dXJuIGlzUG9seWxpbmVIaXRSZWN0YW5nbGUocm90YXRlZENvcm5lclBvaW50cywgcmFuZ2VSZWN0YW5nbGUpO1xuICAgIH1cblxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzTGluZShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGlzUG9seWxpbmVIaXRSZWN0YW5nbGUocG9pbnRzLCByYW5nZVJlY3RhbmdsZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0RHJhd0VsZW1lbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gYm9hcmQuZ2V0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgIHBvaW50ID0gcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChwb2ludCwgZWxlbWVudCkgfHwgcG9pbnQ7XG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNHZW9tZXRyeShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBmaWxsID0gZ2V0RmlsbEJ5RWxlbWVudChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGlmIChpc0hpdEVkZ2VPZlNoYXBlKGJvYXJkLCBlbGVtZW50LCBwb2ludCwgSElUX0RJU1RBTkNFX0JVRkZFUikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShnZXRFbGVtZW50U2hhcGUoZWxlbWVudCkpO1xuICAgICAgICAvLyB3aGVuIHNoYXBlIGVxdWFscyB0ZXh0LCBmaWxsIGlzIG5vdCBhbGxvd2VkXG4gICAgICAgIGlmIChmaWxsICE9PSBEZWZhdWx0R2VvbWV0cnlTdHlsZS5maWxsICYmIGZpbGwgIT09IFRSQU5TUEFSRU5UICYmICFQbGFpdERyYXdFbGVtZW50LmlzVGV4dChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgaXNIaXRJbnNpZGUgPSBlbmdpbmUuaXNJbnNpZGVQb2ludChyZWN0YW5nbGUhLCBwb2ludCk7XG4gICAgICAgICAgICBpZiAoaXNIaXRJbnNpZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIaXRJbnNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBzaGFwZSBlcXVhbHMgdGV4dCwgb25seSBjaGVjayB0ZXh0IHJlY3RhbmdsZVxuICAgICAgICAgICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNUZXh0KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzSGl0VGV4dCA9IFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGV4dENsaWVudCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0hpdFRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHRSZWN0YW5nbGUgb2YgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgdGV4dENsaWVudCA9IGVuZ2luZS5nZXRUZXh0UmVjdGFuZ2xlID8gZW5naW5lLmdldFRleHRSZWN0YW5nbGUoZWxlbWVudCkgOiBnZXRUZXh0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNIaXRUZXh0UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0ZXh0Q2xpZW50LCBwb2ludCk7XG4gICAgICAgICAgICBpZiAoaXNIaXRUZXh0UmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzSGl0VGV4dFJlY3RhbmdsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNQb2ludEluUmVjdGFuZ2xlKGNsaWVudCwgcG9pbnQpO1xuICAgIH1cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0xpbmUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGlzSGl0TGluZShib2FyZCwgZWxlbWVudCwgcG9pbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdEVkZ2VPZlNoYXBlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCwgcG9pbnQ6IFBvaW50LCBoaXREaXN0YW5jZUJ1ZmZlcjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmVhcmVzdFBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGVsZW1lbnQsIHBvaW50KTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQobmVhcmVzdFBvaW50WzBdLCBuZWFyZXN0UG9pbnRbMV0sIHBvaW50WzBdLCBwb2ludFsxXSk7XG4gICAgcmV0dXJuIGRpc3RhbmNlIDw9IGhpdERpc3RhbmNlQnVmZmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSW5zaWRlT2ZTaGFwZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsIHBvaW50OiBQb2ludCwgaGl0RGlzdGFuY2VCdWZmZXI6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyksIGhpdERpc3RhbmNlQnVmZmVyKTtcbiAgICByZXR1cm4gZ2V0RW5naW5lKGdldEVsZW1lbnRTaGFwZShlbGVtZW50KSkuaXNJbnNpZGVQb2ludChjbGllbnQsIHBvaW50KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdEVsZW1lbnRJbnNpZGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gYm9hcmQuZ2V0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgIHBvaW50ID0gcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChwb2ludCwgZWxlbWVudCkgfHwgcG9pbnQ7XG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNHZW9tZXRyeShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBlbmdpbmUgPSBnZXRFbmdpbmUoZ2V0RWxlbWVudFNoYXBlKGVsZW1lbnQpKTtcbiAgICAgICAgY29uc3QgaXNIaXRJbnNpZGUgPSBlbmdpbmUuaXNJbnNpZGVQb2ludChyZWN0YW5nbGUhLCBwb2ludCk7XG4gICAgICAgIGlmIChpc0hpdEluc2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzSGl0SW5zaWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZ2luZS5nZXRUZXh0UmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Q2xpZW50ID0gZW5naW5lLmdldFRleHRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBpc0hpdFRleHRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaXNQb2ludEluUmVjdGFuZ2xlKHRleHRDbGllbnQsIHBvaW50KTtcbiAgICAgICAgICAgIGlmIChpc0hpdFRleHRSZWN0YW5nbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIaXRUZXh0UmVjdGFuZ2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzSW1hZ2UoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGVsZW1lbnQucG9pbnRzKTtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUoY2xpZW50LCBwb2ludCk7XG4gICAgfVxuXG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNMaW5lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBpc0hpdExpbmUoYm9hcmQsIGVsZW1lbnQsIHBvaW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG4iXX0=
@@ -1,19 +1,24 @@
1
- import { Point, getElementById, RectangleClient } from '@plait/core';
2
- import { getPoints, getPointByVectorComponent, removeDuplicatePoints, generateElbowLineRoute, simplifyOrthogonalPoints, isSourceAndTargetIntersect } from '@plait/common';
1
+ import { Point, getElementById, RectangleClient, rotatePointsByElement } from '@plait/core';
2
+ import { getPoints, getPointByVectorComponent, removeDuplicatePoints, generateElbowLineRoute, simplifyOrthogonalPoints, isSourceAndTargetIntersect, DEFAULT_ROUTE_MARGIN } from '@plait/common';
3
3
  import { BasicShapes, PlaitLine } from '../../interfaces';
4
4
  import { createGeometryElement } from '../geometry';
5
5
  import { getStrokeWidthByElement } from '../style/stroke';
6
6
  import { getElbowLineRouteOptions, getLineHandleRefPair } from './line-common';
7
7
  import { getMidKeyPoints, getMirrorDataPoints, hasIllegalElbowPoint } from './line-resize';
8
+ export const isSelfLoop = (element) => {
9
+ return element.source.boundId && element.source.boundId === element.target.boundId;
10
+ };
11
+ export const isUseDefaultOrthogonalRoute = (element, options) => {
12
+ return isSourceAndTargetIntersect(options) && !isSelfLoop(element);
13
+ };
8
14
  export const getElbowPoints = (board, element) => {
9
15
  const handleRefPair = getLineHandleRefPair(board, element);
10
16
  const params = getElbowLineRouteOptions(board, element, handleRefPair);
11
17
  // console.log(params, 'params');
12
- const isIntersect = isSourceAndTargetIntersect(params);
13
- if (isIntersect) {
14
- return simplifyOrthogonalPoints(getPoints(handleRefPair.source.point, handleRefPair.source.direction, handleRefPair.target.point, handleRefPair.target.direction, 0));
18
+ if (isUseDefaultOrthogonalRoute(element, params)) {
19
+ return simplifyOrthogonalPoints(getPoints(handleRefPair.source.point, handleRefPair.source.direction, handleRefPair.target.point, handleRefPair.target.direction, DEFAULT_ROUTE_MARGIN));
15
20
  }
16
- const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params));
21
+ const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params, board));
17
22
  const nextKeyPoints = keyPoints.slice(1, keyPoints.length - 1);
18
23
  if (element.points.length === 2) {
19
24
  return simplifyOrthogonalPoints(keyPoints);
@@ -79,8 +84,16 @@ export const getSourceAndTargetRectangle = (board, element, handleRefPair) => {
79
84
  const target = handleRefPair.target;
80
85
  targetElement = createFakeElement(target.point, target.vector);
81
86
  }
82
- const sourceRectangle = RectangleClient.inflate(RectangleClient.getRectangleByPoints(sourceElement.points), getStrokeWidthByElement(sourceElement) * 2);
83
- const targetRectangle = RectangleClient.inflate(RectangleClient.getRectangleByPoints(targetElement.points), getStrokeWidthByElement(targetElement) * 2);
87
+ let sourceRectangle = RectangleClient.getRectangleByPoints(sourceElement.points);
88
+ const rotatedSourceCornerPoints = rotatePointsByElement(RectangleClient.getCornerPoints(sourceRectangle), sourceElement) ||
89
+ RectangleClient.getCornerPoints(sourceRectangle);
90
+ sourceRectangle = RectangleClient.getRectangleByPoints(rotatedSourceCornerPoints);
91
+ sourceRectangle = RectangleClient.inflate(sourceRectangle, getStrokeWidthByElement(sourceElement) * 2);
92
+ let targetRectangle = RectangleClient.getRectangleByPoints(targetElement.points);
93
+ const rotatedTargetCornerPoints = rotatePointsByElement(RectangleClient.getCornerPoints(targetRectangle), targetElement) ||
94
+ RectangleClient.getCornerPoints(targetRectangle);
95
+ targetRectangle = RectangleClient.getRectangleByPoints(rotatedTargetCornerPoints);
96
+ targetRectangle = RectangleClient.inflate(targetRectangle, getStrokeWidthByElement(targetElement) * 2);
84
97
  return {
85
98
  sourceRectangle,
86
99
  targetRectangle
@@ -98,4 +111,4 @@ export function getNextRenderPoints(board, element, renderPoints) {
98
111
  newRenderKeyPoints.splice(-1, 1, nextTargetPoint);
99
112
  return removeDuplicatePoints(newRenderKeyPoints);
100
113
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxib3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2VsYm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQWMsY0FBYyxFQUFFLGVBQWUsRUFBVSxNQUFNLGFBQWEsQ0FBQztBQUN6RixPQUFPLEVBQ0gsU0FBUyxFQUNULHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QiwwQkFBMEIsRUFDN0IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBb0MsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLGlDQUFpQztJQUNqQyxNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2QsT0FBTyx3QkFBd0IsQ0FDM0IsU0FBUyxDQUNMLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxF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SSxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLEdBQUcsNEJBQTRCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hGLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEQsT0FBTyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCwgUGxhaXRCb2FyZCwgZ2V0RWxlbWVudEJ5SWQsIFJlY3RhbmdsZUNsaWVudCwgVmVjdG9yIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHtcbiAgICBnZXRQb2ludHMsXG4gICAgZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudCxcbiAgICByZW1vdmVEdXBsaWNhdGVQb2ludHMsXG4gICAgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSxcbiAgICBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMsXG4gICAgaXNTb3VyY2VBbmRUYXJnZXRJbnRlcnNlY3Rcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBCYXNpY1NoYXBlcywgTGluZUhhbmRsZVJlZlBhaXIsIFBsYWl0R2VvbWV0cnksIFBsYWl0TGluZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY3JlYXRlR2VvbWV0cnlFbGVtZW50IH0gZnJvbSAnLi4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuLi9zdHlsZS9zdHJva2UnO1xuaW1wb3J0IHsgZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zLCBnZXRMaW5lSGFuZGxlUmVmUGFpciB9IGZyb20gJy4vbGluZS1jb21tb24nO1xuaW1wb3J0IHsgZ2V0TWlkS2V5UG9pbnRzLCBnZXRNaXJyb3JEYXRhUG9pbnRzLCBoYXNJbGxlZ2FsRWxib3dQb2ludCB9IGZyb20gJy4vbGluZS1yZXNpemUnO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxib3dQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVJlZlBhaXIgPSBnZXRMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgcGFyYW1zID0gZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zKGJvYXJkLCBlbGVtZW50LCBoYW5kbGVSZWZQYWlyKTtcbiAgICAvLyBjb25zb2xlLmxvZyhwYXJhbXMsICdwYXJhbXMnKTtcbiAgICBjb25zdCBpc0ludGVyc2VjdCA9IGlzU291cmNlQW5kVGFyZ2V0SW50ZXJzZWN0KHBhcmFtcyk7XG4gICAgaWYgKGlzSW50ZXJzZWN0KSB7XG4gICAgICAgIHJldHVybiBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMoXG4gICAgICAgICAgICBnZXRQb2ludHMoXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci5zb3VyY2UucG9pbnQsXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci5zb3VyY2UuZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGhhbmRsZVJlZlBhaXIudGFyZ2V0LnBvaW50LFxuICAgICAgICAgICAgICAgIGhhbmRsZVJlZlBhaXIudGFyZ2V0LmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhnZW5lcmF0ZUVsYm93TGluZVJvdXRlKHBhcmFtcykpO1xuICAgIGNvbnN0IG5leHRLZXlQb2ludHMgPSBrZXlQb2ludHMuc2xpY2UoMSwga2V5UG9pbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyhrZXlQb2ludHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKG5leHRLZXlQb2ludHMpO1xuICAgICAgICBjb25zdCBkYXRhUG9pbnRzID0gcmVtb3ZlRHVwbGljYXRlUG9pbnRzKFBsYWl0TGluZS5nZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpKTtcbiAgICAgICAgY29uc3QgbWlkRGF0YVBvaW50cyA9IGRhdGFQb2ludHMuc2xpY2UoMSwgLTEpO1xuICAgICAgICBpZiAoaGFzSWxsZWdhbEVsYm93UG9pbnQobWlkRGF0YVBvaW50cykpIHtcbiAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMoa2V5UG9pbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgbmV4dERhdGFQb2ludHMgPSBbc2ltcGxpZmllZE5leHRLZXlQb2ludHNbMF0sIC4uLm1pZERhdGFQb2ludHMsIHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgY29uc3QgbWlycm9yRGF0YVBvaW50cyA9IGdldE1pcnJvckRhdGFQb2ludHMoYm9hcmQsIG5leHREYXRhUG9pbnRzLCBzaW1wbGlmaWVkTmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cobWlycm9yRGF0YVBvaW50cywgJ21pcnJvckRhdGFQb2ludHMnKTtcbiAgICAgICAgY29uc3QgcmVuZGVyUG9pbnRzOiBQb2ludFtdID0gW2tleVBvaW50c1swXV07XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtaXJyb3JEYXRhUG9pbnRzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9pbnQgPSBtaXJyb3JEYXRhUG9pbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBuZXh0UG9pbnQgPSBtaXJyb3JEYXRhUG9pbnRzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBpc1N0cmFpZ2h0ID0gUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnRdKTtcbiAgICAgICAgICAgIGlmICghaXNTdHJhaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZEtleVBvaW50cyA9IGdldE1pZEtleVBvaW50cyhzaW1wbGlmaWVkTmV4dEtleVBvaW50cywgY3VycmVudFBvaW50LCBuZXh0UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtaWRLZXlQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKGN1cnJlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKC4uLm1pZEtleVBvaW50cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUG9pbnRzLnB1c2goY3VycmVudFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vua25vd24gZGF0YSBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKGN1cnJlbnRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyUG9pbnRzLnB1c2goa2V5UG9pbnRzW2tleVBvaW50cy5sZW5ndGggLSAyXSwga2V5UG9pbnRzW2tleVBvaW50cy5sZW5ndGggLSAxXSk7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWlkZGxlIHBvaW50IHRvIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcG9zaXRpb25zIGFyZSBkcmF3biBiYWNrLCBzdWNoIGFzIHdoZW4gc291cmNlUG9pbnQgaXMgYmV0d2VlbiBuZXh0U291cmNlUG9pbnQgYW5kIHRoZSBmaXJzdCBrZXkgcG9pbnQuXG4gICAgICAgIC8vIElzc3VlXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5UG9pbnQyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vIG5leHRQb2ludC0tLXNvdXJjZVBvaW50LS0ta2V5UG9pbnQxXG4gICAgICAgIC8vIFRoZSBjb3JyZWN0IHJlbmRlcmluZyBzaG91bGQgYmUgKG5leHRQb2ludCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0KTpcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlQb2ludDJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlUG9pbnQtLS1rZXlQb2ludDFcbiAgICAgICAgY29uc3QgcmV0ID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKHJlbmRlclBvaW50cyk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldE5leHRTb3VyY2VBbmRUYXJnZXRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBbb3B0aW9ucy5uZXh0U291cmNlUG9pbnQsIG9wdGlvbnMubmV4dFRhcmdldFBvaW50XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTb3VyY2VBbmRUYXJnZXRSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgaGFuZGxlUmVmUGFpcjogTGluZUhhbmRsZVJlZlBhaXIpID0+IHtcbiAgICBsZXQgc291cmNlRWxlbWVudCA9IGVsZW1lbnQuc291cmNlLmJvdW5kSWQgPyBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC5zb3VyY2UuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHRhcmdldEVsZW1lbnQgPSBlbGVtZW50LnRhcmdldC5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgIGlmICghc291cmNlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZTtcbiAgICAgICAgc291cmNlRWxlbWVudCA9IGNyZWF0ZUZha2VFbGVtZW50KHNvdXJjZS5wb2ludCwgc291cmNlLnZlY3Rvcik7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBoYW5kbGVSZWZQYWlyLnRhcmdldDtcbiAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGNyZWF0ZUZha2VFbGVtZW50KHRhcmdldC5wb2ludCwgdGFyZ2V0LnZlY3Rvcik7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKFxuICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoc291cmNlRWxlbWVudC5wb2ludHMpLFxuICAgICAgICBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChzb3VyY2VFbGVtZW50KSAqIDJcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKFxuICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHModGFyZ2V0RWxlbWVudC5wb2ludHMpLFxuICAgICAgICBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCh0YXJnZXRFbGVtZW50KSAqIDJcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0UmVjdGFuZ2xlXG4gICAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUZha2VFbGVtZW50ID0gKHN0YXJ0UG9pbnQ6IFBvaW50LCB2ZWN0b3I6IFZlY3RvcikgPT4ge1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudChzdGFydFBvaW50LCB2ZWN0b3IsIC0yNSk7XG4gICAgY29uc3QgcG9pbnRzID0gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChwb2ludCwgNTAsIDUwKSk7XG4gICAgcmV0dXJuIGNyZWF0ZUdlb21ldHJ5RWxlbWVudChCYXNpY1NoYXBlcy5yZWN0YW5nbGUsIHBvaW50cywgJycpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRSZW5kZXJQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgcmVuZGVyUG9pbnRzPzogUG9pbnRbXSkge1xuICAgIGxldCBuZXdSZW5kZXJLZXlQb2ludHMgPSByZW5kZXJQb2ludHMgPz8gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IFtuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludF0gPSBnZXROZXh0U291cmNlQW5kVGFyZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBuZXdSZW5kZXJLZXlQb2ludHMuc3BsaWNlKDAsIDEsIG5leHRTb3VyY2VQb2ludCk7XG4gICAgbmV3UmVuZGVyS2V5UG9pbnRzLnNwbGljZSgtMSwgMSwgbmV4dFRhcmdldFBvaW50KTtcbiAgICByZXR1cm4gcmVtb3ZlRHVwbGljYXRlUG9pbnRzKG5ld1JlbmRlcktleVBvaW50cyk7XG59XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxib3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2VsYm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQWMsY0FBYyxFQUFFLGVBQWUsRUFBd0IscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUgsT0FBTyxFQUNILFNBQVMsRUFDVCx5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLG9CQUFvQixFQUV2QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0YsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBa0IsRUFBRSxFQUFFO0lBQzdDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxPQUFrQixFQUFFLE9BQThCLEVBQUUsRUFBRTtJQUM5RixPQUFPLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZFLENB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ZUFBZSxDQUFDLENBQUM7SUFDakQsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNsRCxPQUFPLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50LCBQbGFpdEJvYXJkLCBnZXRFbGVtZW50QnlJZCwgUmVjdGFuZ2xlQ2xpZW50LCBWZWN0b3IsIHJvdGF0ZVBvaW50cywgcm90YXRlUG9pbnRzQnlFbGVtZW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHtcbiAgICBnZXRQb2ludHMsXG4gICAgZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudCxcbiAgICByZW1vdmVEdXBsaWNhdGVQb2ludHMsXG4gICAgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSxcbiAgICBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMsXG4gICAgaXNTb3VyY2VBbmRUYXJnZXRJbnRlcnNlY3QsXG4gICAgREVGQVVMVF9ST1VURV9NQVJHSU4sXG4gICAgRWxib3dMaW5lUm91dGVPcHRpb25zXG59IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgQmFzaWNTaGFwZXMsIExpbmVIYW5kbGVSZWZQYWlyLCBQbGFpdEdlb21ldHJ5LCBQbGFpdExpbmUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNyZWF0ZUdlb21ldHJ5RWxlbWVudCB9IGZyb20gJy4uL2dlb21ldHJ5JztcbmltcG9ydCB7IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vc3R5bGUvc3Ryb2tlJztcbmltcG9ydCB7IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucywgZ2V0TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2xpbmUtY29tbW9uJztcbmltcG9ydCB7IGdldE1pZEtleVBvaW50cywgZ2V0TWlycm9yRGF0YVBvaW50cywgaGFzSWxsZWdhbEVsYm93UG9pbnQgfSBmcm9tICcuL2xpbmUtcmVzaXplJztcblxuZXhwb3J0IGNvbnN0IGlzU2VsZkxvb3AgPSAoZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc291cmNlLmJvdW5kSWQgJiYgZWxlbWVudC5zb3VyY2UuYm91bmRJZCA9PT0gZWxlbWVudC50YXJnZXQuYm91bmRJZDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1VzZURlZmF1bHRPcnRob2dvbmFsUm91dGUgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBvcHRpb25zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gaXNTb3VyY2VBbmRUYXJnZXRJbnRlcnNlY3Qob3B0aW9ucykgJiYgIWlzU2VsZkxvb3AoZWxlbWVudCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxib3dQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVJlZlBhaXIgPSBnZXRMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgcGFyYW1zID0gZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zKGJvYXJkLCBlbGVtZW50LCBoYW5kbGVSZWZQYWlyKTtcbiAgICAvLyBjb25zb2xlLmxvZyhwYXJhbXMsICdwYXJhbXMnKTtcbiAgICBpZiAoaXNVc2VEZWZhdWx0T3J0aG9nb25hbFJvdXRlKGVsZW1lbnQsIHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyhcbiAgICAgICAgICAgIGdldFBvaW50cyhcbiAgICAgICAgICAgICAgICBoYW5kbGVSZWZQYWlyLnNvdXJjZS5wb2ludCxcbiAgICAgICAgICAgICAgICBoYW5kbGVSZWZQYWlyLnNvdXJjZS5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQsXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci50YXJnZXQuZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfTUFSR0lOXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhnZW5lcmF0ZUVsYm93TGluZVJvdXRlKHBhcmFtcywgYm9hcmQpKTtcbiAgICBjb25zdCBuZXh0S2V5UG9pbnRzID0ga2V5UG9pbnRzLnNsaWNlKDEsIGtleVBvaW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMoa2V5UG9pbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaW1wbGlmaWVkTmV4dEtleVBvaW50cyA9IHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyhuZXh0S2V5UG9pbnRzKTtcbiAgICAgICAgY29uc3QgZGF0YVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhQbGFpdExpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KSk7XG4gICAgICAgIGNvbnN0IG1pZERhdGFQb2ludHMgPSBkYXRhUG9pbnRzLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgaWYgKGhhc0lsbGVnYWxFbGJvd1BvaW50KG1pZERhdGFQb2ludHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKGtleVBvaW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dERhdGFQb2ludHMgPSBbc2ltcGxpZmllZE5leHRLZXlQb2ludHNbMF0sIC4uLm1pZERhdGFQb2ludHMsIHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgY29uc3QgbWlycm9yRGF0YVBvaW50cyA9IGdldE1pcnJvckRhdGFQb2ludHMoYm9hcmQsIG5leHREYXRhUG9pbnRzLCBzaW1wbGlmaWVkTmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cobWlycm9yRGF0YVBvaW50cywgJ21pcnJvckRhdGFQb2ludHMnKTtcbiAgICAgICAgY29uc3QgcmVuZGVyUG9pbnRzOiBQb2ludFtdID0gW2tleVBvaW50c1swXV07XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtaXJyb3JEYXRhUG9pbnRzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9pbnQgPSBtaXJyb3JEYXRhUG9pbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBuZXh0UG9pbnQgPSBtaXJyb3JEYXRhUG9pbnRzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBpc1N0cmFpZ2h0ID0gUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnRdKTtcbiAgICAgICAgICAgIGlmICghaXNTdHJhaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZEtleVBvaW50cyA9IGdldE1pZEtleVBvaW50cyhzaW1wbGlmaWVkTmV4dEtleVBvaW50cywgY3VycmVudFBvaW50LCBuZXh0UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtaWRLZXlQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKGN1cnJlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKC4uLm1pZEtleVBvaW50cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUG9pbnRzLnB1c2goY3VycmVudFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vua25vd24gZGF0YSBwb2ludHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlclBvaW50cy5wdXNoKGN1cnJlbnRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyUG9pbnRzLnB1c2goa2V5UG9pbnRzW2tleVBvaW50cy5sZW5ndGggLSAyXSwga2V5UG9pbnRzW2tleVBvaW50cy5sZW5ndGggLSAxXSk7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWlkZGxlIHBvaW50IHRvIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcG9zaXRpb25zIGFyZSBkcmF3biBiYWNrLCBzdWNoIGFzIHdoZW4gc291cmNlUG9pbnQgaXMgYmV0d2VlbiBuZXh0U291cmNlUG9pbnQgYW5kIHRoZSBmaXJzdCBrZXkgcG9pbnQuXG4gICAgICAgIC8vIElzc3VlXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5UG9pbnQyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vIG5leHRQb2ludC0tLXNvdXJjZVBvaW50LS0ta2V5UG9pbnQxXG4gICAgICAgIC8vIFRoZSBjb3JyZWN0IHJlbmRlcmluZyBzaG91bGQgYmUgKG5leHRQb2ludCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0KTpcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlQb2ludDJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlUG9pbnQtLS1rZXlQb2ludDFcbiAgICAgICAgY29uc3QgcmV0ID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKHJlbmRlclBvaW50cyk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldE5leHRTb3VyY2VBbmRUYXJnZXRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBbb3B0aW9ucy5uZXh0U291cmNlUG9pbnQsIG9wdGlvbnMubmV4dFRhcmdldFBvaW50XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTb3VyY2VBbmRUYXJnZXRSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgaGFuZGxlUmVmUGFpcjogTGluZUhhbmRsZVJlZlBhaXIpID0+IHtcbiAgICBsZXQgc291cmNlRWxlbWVudCA9IGVsZW1lbnQuc291cmNlLmJvdW5kSWQgPyBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC5zb3VyY2UuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHRhcmdldEVsZW1lbnQgPSBlbGVtZW50LnRhcmdldC5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgIGlmICghc291cmNlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZTtcbiAgICAgICAgc291cmNlRWxlbWVudCA9IGNyZWF0ZUZha2VFbGVtZW50KHNvdXJjZS5wb2ludCwgc291cmNlLnZlY3Rvcik7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBoYW5kbGVSZWZQYWlyLnRhcmdldDtcbiAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGNyZWF0ZUZha2VFbGVtZW50KHRhcmdldC5wb2ludCwgdGFyZ2V0LnZlY3Rvcik7XG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhzb3VyY2VFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgcm90YXRlZFNvdXJjZUNvcm5lclBvaW50cyA9XG4gICAgICAgIHJvdGF0ZVBvaW50c0J5RWxlbWVudChSZWN0YW5nbGVDbGllbnQuZ2V0Q29ybmVyUG9pbnRzKHNvdXJjZVJlY3RhbmdsZSksIHNvdXJjZUVsZW1lbnQpIHx8XG4gICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMoc291cmNlUmVjdGFuZ2xlKTtcbiAgICBzb3VyY2VSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocm90YXRlZFNvdXJjZUNvcm5lclBvaW50cyk7XG4gICAgc291cmNlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUoc291cmNlUmVjdGFuZ2xlLCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChzb3VyY2VFbGVtZW50KSAqIDIpO1xuXG4gICAgbGV0IHRhcmdldFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyh0YXJnZXRFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgcm90YXRlZFRhcmdldENvcm5lclBvaW50cyA9XG4gICAgICAgIHJvdGF0ZVBvaW50c0J5RWxlbWVudChSZWN0YW5nbGVDbGllbnQuZ2V0Q29ybmVyUG9pbnRzKHRhcmdldFJlY3RhbmdsZSksIHRhcmdldEVsZW1lbnQpIHx8XG4gICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHModGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICB0YXJnZXRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocm90YXRlZFRhcmdldENvcm5lclBvaW50cyk7XG4gICAgdGFyZ2V0UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUodGFyZ2V0UmVjdGFuZ2xlLCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCh0YXJnZXRFbGVtZW50KSAqIDIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlUmVjdGFuZ2xlLFxuICAgICAgICB0YXJnZXRSZWN0YW5nbGVcbiAgICB9O1xufTtcblxuY29uc3QgY3JlYXRlRmFrZUVsZW1lbnQgPSAoc3RhcnRQb2ludDogUG9pbnQsIHZlY3RvcjogVmVjdG9yKSA9PiB7XG4gICAgY29uc3QgcG9pbnQgPSBnZXRQb2ludEJ5VmVjdG9yQ29tcG9uZW50KHN0YXJ0UG9pbnQsIHZlY3RvciwgLTI1KTtcbiAgICBjb25zdCBwb2ludHMgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UG9pbnRzKFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeUNlbnRlclBvaW50KHBvaW50LCA1MCwgNTApKTtcbiAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50KEJhc2ljU2hhcGVzLnJlY3RhbmdsZSwgcG9pbnRzLCAnJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFJlbmRlclBvaW50cyhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCByZW5kZXJQb2ludHM/OiBQb2ludFtdKSB7XG4gICAgbGV0IG5ld1JlbmRlcktleVBvaW50cyA9IHJlbmRlclBvaW50cyA/PyBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgW25leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50XSA9IGdldE5leHRTb3VyY2VBbmRUYXJnZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIG5ld1JlbmRlcktleVBvaW50cy5zcGxpY2UoMCwgMSwgbmV4dFNvdXJjZVBvaW50KTtcbiAgICBuZXdSZW5kZXJLZXlQb2ludHMuc3BsaWNlKC0xLCAxLCBuZXh0VGFyZ2V0UG9pbnQpO1xuICAgIHJldHVybiByZW1vdmVEdXBsaWNhdGVQb2ludHMobmV3UmVuZGVyS2V5UG9pbnRzKTtcbn1cbiJdfQ==