@plait/draw 0.77.2 → 0.78.0-next.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.
- package/fesm2022/plait-draw.mjs +21 -14
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/package.json +1 -3
- package/transforms/image.d.ts +6 -0
- package/utils/hit.d.ts +1 -1
- package/esm2022/arrow-line.component.mjs +0 -165
- package/esm2022/constants/default.mjs +0 -7
- package/esm2022/constants/geometry.mjs +0 -272
- package/esm2022/constants/image.mjs +0 -2
- package/esm2022/constants/index.mjs +0 -9
- package/esm2022/constants/line.mjs +0 -12
- package/esm2022/constants/pointer.mjs +0 -23
- package/esm2022/constants/swimlane.mjs +0 -25
- package/esm2022/constants/text.mjs +0 -2
- package/esm2022/constants/theme.mjs +0 -28
- package/esm2022/engines/basic-shapes/cloud.mjs +0 -146
- package/esm2022/engines/basic-shapes/comment.mjs +0 -56
- package/esm2022/engines/basic-shapes/cross.mjs +0 -33
- package/esm2022/engines/basic-shapes/diamond.mjs +0 -16
- package/esm2022/engines/basic-shapes/ellipse.mjs +0 -53
- package/esm2022/engines/basic-shapes/hexagon.mjs +0 -27
- package/esm2022/engines/basic-shapes/left-arrow.mjs +0 -30
- package/esm2022/engines/basic-shapes/octagon.mjs +0 -29
- package/esm2022/engines/basic-shapes/parallelogram.mjs +0 -26
- package/esm2022/engines/basic-shapes/pentagon-arrow.mjs +0 -27
- package/esm2022/engines/basic-shapes/pentagon.mjs +0 -30
- package/esm2022/engines/basic-shapes/polygon.mjs +0 -56
- package/esm2022/engines/basic-shapes/process-arrow.mjs +0 -26
- package/esm2022/engines/basic-shapes/rectangle.mjs +0 -26
- package/esm2022/engines/basic-shapes/right-arrow.mjs +0 -28
- package/esm2022/engines/basic-shapes/round-comment.mjs +0 -82
- package/esm2022/engines/basic-shapes/round-rectangle.mjs +0 -58
- package/esm2022/engines/basic-shapes/star.mjs +0 -39
- package/esm2022/engines/basic-shapes/trapezoid.mjs +0 -26
- package/esm2022/engines/basic-shapes/triangle.mjs +0 -34
- package/esm2022/engines/basic-shapes/two-way-arrow.mjs +0 -25
- package/esm2022/engines/flowchart/database.mjs +0 -84
- package/esm2022/engines/flowchart/delay.mjs +0 -44
- package/esm2022/engines/flowchart/display.mjs +0 -74
- package/esm2022/engines/flowchart/document.mjs +0 -81
- package/esm2022/engines/flowchart/hard-disk.mjs +0 -84
- package/esm2022/engines/flowchart/internal-storage.mjs +0 -47
- package/esm2022/engines/flowchart/manual-input.mjs +0 -33
- package/esm2022/engines/flowchart/manual-loop.mjs +0 -26
- package/esm2022/engines/flowchart/merge.mjs +0 -34
- package/esm2022/engines/flowchart/multi-document.mjs +0 -143
- package/esm2022/engines/flowchart/note-curly-left.mjs +0 -86
- package/esm2022/engines/flowchart/note-curly-right.mjs +0 -89
- package/esm2022/engines/flowchart/note-square.mjs +0 -46
- package/esm2022/engines/flowchart/off-page.mjs +0 -32
- package/esm2022/engines/flowchart/or.mjs +0 -20
- package/esm2022/engines/flowchart/predefined-process.mjs +0 -47
- package/esm2022/engines/flowchart/preparation.mjs +0 -27
- package/esm2022/engines/flowchart/stored-data.mjs +0 -79
- package/esm2022/engines/flowchart/summing-junction.mjs +0 -23
- package/esm2022/engines/flowchart/terminal.mjs +0 -68
- package/esm2022/engines/index.mjs +0 -130
- package/esm2022/engines/table/table.mjs +0 -101
- package/esm2022/engines/uml/activity-class.mjs +0 -47
- package/esm2022/engines/uml/actor.mjs +0 -119
- package/esm2022/engines/uml/assembly.mjs +0 -105
- package/esm2022/engines/uml/combined-fragment.mjs +0 -66
- package/esm2022/engines/uml/component-box.mjs +0 -61
- package/esm2022/engines/uml/component.mjs +0 -117
- package/esm2022/engines/uml/container.mjs +0 -44
- package/esm2022/engines/uml/deletion.mjs +0 -54
- package/esm2022/engines/uml/note.mjs +0 -58
- package/esm2022/engines/uml/package.mjs +0 -105
- package/esm2022/engines/uml/provided-interface.mjs +0 -92
- package/esm2022/engines/uml/required-interface.mjs +0 -81
- package/esm2022/engines/uml/template.mjs +0 -47
- package/esm2022/generators/arrow-line-auto-complete.generator.mjs +0 -46
- package/esm2022/generators/arrow-line.generator.mjs +0 -13
- package/esm2022/generators/geometry-shape.generator.mjs +0 -29
- package/esm2022/generators/index.mjs +0 -7
- package/esm2022/generators/line-active.generator.mjs +0 -84
- package/esm2022/generators/single-text.generator.mjs +0 -16
- package/esm2022/generators/table.generator.mjs +0 -25
- package/esm2022/generators/text.generator.mjs +0 -131
- package/esm2022/generators/vector-line-generator.mjs +0 -13
- package/esm2022/geometry.component.mjs +0 -145
- package/esm2022/image.component.mjs +0 -67
- package/esm2022/interfaces/arrow-line.mjs +0 -70
- package/esm2022/interfaces/element.mjs +0 -9
- package/esm2022/interfaces/engine.mjs +0 -2
- package/esm2022/interfaces/geometry.mjs +0 -82
- package/esm2022/interfaces/image.mjs +0 -2
- package/esm2022/interfaces/index.mjs +0 -92
- package/esm2022/interfaces/line.mjs +0 -2
- package/esm2022/interfaces/options.mjs +0 -2
- package/esm2022/interfaces/swimlane.mjs +0 -13
- package/esm2022/interfaces/table.mjs +0 -13
- package/esm2022/interfaces/text.mjs +0 -2
- package/esm2022/interfaces/vector-line.mjs +0 -10
- package/esm2022/plait-draw.mjs +0 -5
- package/esm2022/plugins/with-arrow-line-auto-complete-reaction.mjs +0 -43
- package/esm2022/plugins/with-arrow-line-auto-complete.mjs +0 -76
- package/esm2022/plugins/with-arrow-line-bound-reaction.mjs +0 -53
- package/esm2022/plugins/with-arrow-line-create.mjs +0 -51
- package/esm2022/plugins/with-arrow-line-resize.mjs +0 -158
- package/esm2022/plugins/with-arrow-line-text-move.mjs +0 -53
- package/esm2022/plugins/with-arrow-line-text.mjs +0 -73
- package/esm2022/plugins/with-draw-fragment.mjs +0 -98
- package/esm2022/plugins/with-draw-hotkey.mjs +0 -45
- package/esm2022/plugins/with-draw-resize.mjs +0 -269
- package/esm2022/plugins/with-draw-rotate.mjs +0 -132
- package/esm2022/plugins/with-draw.mjs +0 -144
- package/esm2022/plugins/with-geometry-create.mjs +0 -182
- package/esm2022/plugins/with-swimlane-create.mjs +0 -127
- package/esm2022/plugins/with-swimlane.mjs +0 -21
- package/esm2022/plugins/with-table-resize.mjs +0 -135
- package/esm2022/plugins/with-table.mjs +0 -109
- package/esm2022/plugins/with-vector-line-create.mjs +0 -85
- package/esm2022/plugins/with-vector-line-resize.mjs +0 -61
- package/esm2022/public-api.mjs +0 -11
- package/esm2022/table.component.mjs +0 -162
- package/esm2022/transforms/arrow-line.mjs +0 -66
- package/esm2022/transforms/common.mjs +0 -36
- package/esm2022/transforms/geometry-text.mjs +0 -59
- package/esm2022/transforms/geometry.mjs +0 -43
- package/esm2022/transforms/image.mjs +0 -22
- package/esm2022/transforms/index.mjs +0 -36
- package/esm2022/transforms/multi-text-geometry-text.mjs +0 -15
- package/esm2022/transforms/swimlane.mjs +0 -164
- package/esm2022/transforms/table-text.mjs +0 -44
- package/esm2022/transforms/table.mjs +0 -36
- package/esm2022/transforms/vector-line.mjs +0 -13
- package/esm2022/utils/arrow-line/arrow-line-arrow.mjs +0 -123
- package/esm2022/utils/arrow-line/arrow-line-basic.mjs +0 -205
- package/esm2022/utils/arrow-line/arrow-line-common.mjs +0 -162
- package/esm2022/utils/arrow-line/arrow-line-resize.mjs +0 -309
- package/esm2022/utils/arrow-line/elbow.mjs +0 -114
- package/esm2022/utils/arrow-line/index.mjs +0 -6
- package/esm2022/utils/clipboard.mjs +0 -55
- package/esm2022/utils/common.mjs +0 -184
- package/esm2022/utils/geometry.mjs +0 -178
- package/esm2022/utils/hit.mjs +0 -242
- package/esm2022/utils/index.mjs +0 -17
- package/esm2022/utils/line.mjs +0 -64
- package/esm2022/utils/memorize.mjs +0 -93
- package/esm2022/utils/multi-text-geometry.mjs +0 -61
- package/esm2022/utils/polygon.mjs +0 -30
- package/esm2022/utils/position/arrow-line.mjs +0 -20
- package/esm2022/utils/position/geometry.mjs +0 -30
- package/esm2022/utils/position/line.mjs +0 -51
- package/esm2022/utils/selected.mjs +0 -39
- package/esm2022/utils/shape.mjs +0 -11
- package/esm2022/utils/snap-resizing.mjs +0 -185
- package/esm2022/utils/style/index.mjs +0 -2
- package/esm2022/utils/style/stroke.mjs +0 -21
- package/esm2022/utils/swimlane.mjs +0 -124
- package/esm2022/utils/table-selected.mjs +0 -21
- package/esm2022/utils/table.mjs +0 -172
- package/esm2022/utils/uml.mjs +0 -90
- package/esm2022/utils/vector-line.mjs +0 -71
- package/esm2022/vector-line.component.mjs +0 -55
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
import { drawHandle, getFirstTextManage, getIndexByResizeHandle, getResizeHandlePointByIndex, getSymmetricHandleIndex, isCornerHandle, withResize, resetPointsAfterResize, normalizeShapePoints } from '@plait/common';
|
|
2
|
-
import { PlaitBoard, Point, RectangleClient, Transforms, createG, getRectangleByElements, getSelectedElements, isSelectionMoving, getSelectionAngle, rotatePoints, rotatedDataPoints, createDebugGenerator, hasValidAngle, isAxisChangedByAngle, drawRectangle, ACTIVE_STROKE_WIDTH, SELECTION_BORDER_COLOR, toActiveRectangleFromViewBoxRectangle } from '@plait/core';
|
|
3
|
-
import { PlaitDrawElement } from '../interfaces';
|
|
4
|
-
import { DrawTransforms } from '../transforms';
|
|
5
|
-
import { getHitRectangleResizeHandleRef } from '../utils/position/geometry';
|
|
6
|
-
import { getSnapResizingRefOptions, getSnapResizingRef } from '../utils/snap-resizing';
|
|
7
|
-
import { isGeometryIncludeText, isSingleSelectLine, isSingleSelectSwimlane } from '../utils';
|
|
8
|
-
const debugKey = 'debug:plait:resize-for-rotation';
|
|
9
|
-
const debugGenerator = createDebugGenerator(debugKey);
|
|
10
|
-
export function withDrawResize(board) {
|
|
11
|
-
const { afterChange, drawSelectionRectangle } = board;
|
|
12
|
-
let snapG;
|
|
13
|
-
let handleG;
|
|
14
|
-
let needCustomActiveRectangle = false;
|
|
15
|
-
let resizeActivePoints = null;
|
|
16
|
-
const canResize = () => {
|
|
17
|
-
const elements = getSelectedElements(board);
|
|
18
|
-
return (elements.length >= 1 &&
|
|
19
|
-
elements.every((el) => (PlaitDrawElement.isDrawElement(el) || (PlaitDrawElement.isCustomGeometryElement(board, el) && el.points.length > 1)) &&
|
|
20
|
-
!isSingleSelectLine(board) &&
|
|
21
|
-
!isSingleSelectSwimlane(board)));
|
|
22
|
-
};
|
|
23
|
-
const options = {
|
|
24
|
-
key: 'draw-elements',
|
|
25
|
-
canResize,
|
|
26
|
-
hitTest: (point) => {
|
|
27
|
-
const elements = getSelectedElements(board);
|
|
28
|
-
const boundingRectangle = getRectangleByElements(board, elements, false);
|
|
29
|
-
const angle = getSelectionAngle(elements);
|
|
30
|
-
const handleRef = getHitRectangleResizeHandleRef(board, boundingRectangle, point, angle);
|
|
31
|
-
if (handleRef) {
|
|
32
|
-
return {
|
|
33
|
-
element: [...elements],
|
|
34
|
-
rectangle: boundingRectangle,
|
|
35
|
-
handle: handleRef.handle,
|
|
36
|
-
cursorClass: handleRef.cursorClass
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
},
|
|
41
|
-
onResize: (resizeRef, resizeState) => {
|
|
42
|
-
snapG?.remove();
|
|
43
|
-
debugGenerator.isDebug() && debugGenerator.clear();
|
|
44
|
-
const isFromCorner = isCornerHandle(board, resizeRef.handle);
|
|
45
|
-
const isAspectRatio = resizeState.isShift || (resizeRef.element.length === 1 && PlaitDrawElement.isImage(resizeRef.element[0]));
|
|
46
|
-
const centerPoint = RectangleClient.getCenterPoint(resizeRef.rectangle);
|
|
47
|
-
const handleIndex = getIndexByResizeHandle(resizeRef.handle);
|
|
48
|
-
const { originPoint, handlePoint } = getResizeOriginPointAndHandlePoint(board, handleIndex, resizeRef.rectangle);
|
|
49
|
-
const angle = getSelectionAngle(resizeRef.element);
|
|
50
|
-
let bulkRotationRef;
|
|
51
|
-
if (angle) {
|
|
52
|
-
bulkRotationRef = {
|
|
53
|
-
angle: angle,
|
|
54
|
-
offsetX: 0,
|
|
55
|
-
offsetY: 0,
|
|
56
|
-
newCenterPoint: [0, 0]
|
|
57
|
-
};
|
|
58
|
-
const [rotatedStartPoint, rotateEndPoint] = rotatePoints([resizeState.startPoint, resizeState.endPoint], centerPoint, -bulkRotationRef.angle);
|
|
59
|
-
resizeState.startPoint = rotatedStartPoint;
|
|
60
|
-
resizeState.endPoint = rotateEndPoint;
|
|
61
|
-
}
|
|
62
|
-
const resizeSnapRefOptions = getSnapResizingRefOptions(board, resizeRef, resizeState, {
|
|
63
|
-
originPoint,
|
|
64
|
-
handlePoint
|
|
65
|
-
}, isAspectRatio, isFromCorner);
|
|
66
|
-
const resizeSnapRef = getSnapResizingRef(board, resizeRef.element, resizeSnapRefOptions);
|
|
67
|
-
resizeActivePoints = resizeSnapRef.activePoints;
|
|
68
|
-
snapG = resizeSnapRef.snapG;
|
|
69
|
-
PlaitBoard.getElementTopHost(board).append(snapG);
|
|
70
|
-
if (bulkRotationRef) {
|
|
71
|
-
const boundingBoxCornerPoints = RectangleClient.getPoints(resizeRef.rectangle);
|
|
72
|
-
const resizedBoundingBoxCornerPoints = boundingBoxCornerPoints.map((p) => {
|
|
73
|
-
return movePointByZoomAndOriginPoint(p, originPoint, resizeSnapRef.xZoom, resizeSnapRef.yZoom);
|
|
74
|
-
});
|
|
75
|
-
const newBoundingBox = RectangleClient.getRectangleByPoints(resizedBoundingBoxCornerPoints);
|
|
76
|
-
debugGenerator.isDebug() && debugGenerator.drawRectangle(board, newBoundingBox, { stroke: 'blue' });
|
|
77
|
-
const newBoundingBoxCenter = RectangleClient.getCenterPoint(newBoundingBox);
|
|
78
|
-
const adjustedNewBoundingBoxPoints = resetPointsAfterResize(RectangleClient.getRectangleByPoints(boundingBoxCornerPoints), RectangleClient.getRectangleByPoints(resizedBoundingBoxCornerPoints), centerPoint, newBoundingBoxCenter, bulkRotationRef.angle);
|
|
79
|
-
const newCenter = RectangleClient.getCenterPoint(RectangleClient.getRectangleByPoints(adjustedNewBoundingBoxPoints));
|
|
80
|
-
bulkRotationRef = Object.assign(bulkRotationRef, {
|
|
81
|
-
offsetX: newCenter[0] - newBoundingBoxCenter[0],
|
|
82
|
-
offsetY: newCenter[1] - newBoundingBoxCenter[1],
|
|
83
|
-
newCenterPoint: newCenter
|
|
84
|
-
});
|
|
85
|
-
debugGenerator.isDebug() && debugGenerator.drawRectangle(board, adjustedNewBoundingBoxPoints);
|
|
86
|
-
}
|
|
87
|
-
resizeRef.element.forEach((target) => {
|
|
88
|
-
const path = PlaitBoard.findPath(board, target);
|
|
89
|
-
let points;
|
|
90
|
-
if (bulkRotationRef) {
|
|
91
|
-
const reversedPoints = rotatedDataPoints(target.points, centerPoint, -bulkRotationRef.angle);
|
|
92
|
-
points = reversedPoints.map((p) => {
|
|
93
|
-
return movePointByZoomAndOriginPoint(p, originPoint, resizeSnapRef.xZoom, resizeSnapRef.yZoom);
|
|
94
|
-
});
|
|
95
|
-
const adjustTargetPoints = points.map((p) => [
|
|
96
|
-
p[0] + bulkRotationRef.offsetX,
|
|
97
|
-
p[1] + bulkRotationRef.offsetY
|
|
98
|
-
]);
|
|
99
|
-
points = rotatedDataPoints(adjustTargetPoints, bulkRotationRef.newCenterPoint, bulkRotationRef.angle);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
if (hasValidAngle(target)) {
|
|
103
|
-
needCustomActiveRectangle = true;
|
|
104
|
-
}
|
|
105
|
-
if (hasValidAngle(target) && isAxisChangedByAngle(target.angle)) {
|
|
106
|
-
points = getResizePointsByOtherwiseAxis(board, target.points, originPoint, resizeSnapRef.xZoom, resizeSnapRef.yZoom);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
points = target.points.map((p) => {
|
|
110
|
-
return movePointByZoomAndOriginPoint(p, originPoint, resizeSnapRef.xZoom, resizeSnapRef.yZoom);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (PlaitDrawElement.isGeometry(target)) {
|
|
115
|
-
if (PlaitDrawElement.isGeometry(target) && isGeometryIncludeText(target)) {
|
|
116
|
-
const { height: textHeight } = getFirstTextManage(target).getSize();
|
|
117
|
-
DrawTransforms.resizeGeometry(board, points, textHeight, path);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
points = normalizeShapePoints(points);
|
|
121
|
-
Transforms.setNode(board, { points }, path);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else if (PlaitDrawElement.isLine(target) ||
|
|
125
|
-
PlaitDrawElement.isCustomGeometryElement(board, target) ||
|
|
126
|
-
PlaitDrawElement.isVectorLine(target)) {
|
|
127
|
-
Transforms.setNode(board, { points }, path);
|
|
128
|
-
}
|
|
129
|
-
else if (PlaitDrawElement.isImage(target)) {
|
|
130
|
-
if (isAspectRatio) {
|
|
131
|
-
Transforms.setNode(board, { points }, path);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
// The image element does not follow the resize, but moves based on the center point.
|
|
135
|
-
const targetRectangle = RectangleClient.getRectangleByPoints(target.points);
|
|
136
|
-
const centerPoint = RectangleClient.getCenterPoint(targetRectangle);
|
|
137
|
-
const newCenterPoint = movePointByZoomAndOriginPoint(centerPoint, originPoint, resizeSnapRef.xZoom, resizeSnapRef.yZoom);
|
|
138
|
-
const newTargetRectangle = RectangleClient.getRectangleByCenterPoint(newCenterPoint, targetRectangle.width, targetRectangle.height);
|
|
139
|
-
Transforms.setNode(board, { points: RectangleClient.getPoints(newTargetRectangle) }, path);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
},
|
|
144
|
-
afterResize: (resizeRef) => {
|
|
145
|
-
snapG?.remove();
|
|
146
|
-
snapG = null;
|
|
147
|
-
if (needCustomActiveRectangle) {
|
|
148
|
-
needCustomActiveRectangle = false;
|
|
149
|
-
resizeActivePoints = null;
|
|
150
|
-
const selectedElements = getSelectedElements(board);
|
|
151
|
-
Transforms.addSelectionWithTemporaryElements(board, selectedElements);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
withResize(board, options);
|
|
156
|
-
board.afterChange = () => {
|
|
157
|
-
afterChange();
|
|
158
|
-
if (handleG) {
|
|
159
|
-
handleG.remove();
|
|
160
|
-
handleG = null;
|
|
161
|
-
}
|
|
162
|
-
const selectedElements = getSelectedElements(board);
|
|
163
|
-
if (canResize() && !isSelectionMoving(board) && selectedElements.length > 1) {
|
|
164
|
-
handleG = generatorResizeHandles(board, resizeActivePoints, needCustomActiveRectangle);
|
|
165
|
-
PlaitBoard.getActiveHost(board).append(handleG);
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
board.drawSelectionRectangle = () => {
|
|
169
|
-
if (needCustomActiveRectangle) {
|
|
170
|
-
const rectangle = RectangleClient.getRectangleByPoints(resizeActivePoints);
|
|
171
|
-
const activeRectangle = toActiveRectangleFromViewBoxRectangle(board, rectangle);
|
|
172
|
-
return drawRectangle(board, RectangleClient.inflate(activeRectangle, ACTIVE_STROKE_WIDTH), {
|
|
173
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
174
|
-
strokeWidth: ACTIVE_STROKE_WIDTH
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
return drawSelectionRectangle();
|
|
178
|
-
};
|
|
179
|
-
return board;
|
|
180
|
-
}
|
|
181
|
-
export const getResizeOriginPointAndHandlePoint = (board, handleIndex, rectangle) => {
|
|
182
|
-
const symmetricHandleIndex = getSymmetricHandleIndex(board, handleIndex);
|
|
183
|
-
const originPoint = getResizeHandlePointByIndex(rectangle, symmetricHandleIndex);
|
|
184
|
-
const handlePoint = getResizeHandlePointByIndex(rectangle, handleIndex);
|
|
185
|
-
return {
|
|
186
|
-
originPoint,
|
|
187
|
-
handlePoint
|
|
188
|
-
};
|
|
189
|
-
};
|
|
190
|
-
export const getResizeZoom = (resizeStartAndEnd, resizeOriginPoint, resizeHandlePoint, isFromCorner, isAspectRatio) => {
|
|
191
|
-
const [startPoint, endPoint] = resizeStartAndEnd;
|
|
192
|
-
let xZoom = 0;
|
|
193
|
-
let yZoom = 0;
|
|
194
|
-
if (isFromCorner) {
|
|
195
|
-
if (isAspectRatio) {
|
|
196
|
-
let normalizedOffsetX = Point.getOffsetX(startPoint, endPoint);
|
|
197
|
-
xZoom = normalizedOffsetX / (resizeHandlePoint[0] - resizeOriginPoint[0]);
|
|
198
|
-
yZoom = xZoom;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
let normalizedOffsetX = Point.getOffsetX(startPoint, endPoint);
|
|
202
|
-
let normalizedOffsetY = Point.getOffsetY(startPoint, endPoint);
|
|
203
|
-
xZoom = normalizedOffsetX / (resizeHandlePoint[0] - resizeOriginPoint[0]);
|
|
204
|
-
yZoom = normalizedOffsetY / (resizeHandlePoint[1] - resizeOriginPoint[1]);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
const isHorizontal = Point.isHorizontal(resizeOriginPoint, resizeHandlePoint, 0.1) || false;
|
|
209
|
-
let normalizedOffset = isHorizontal ? Point.getOffsetX(startPoint, endPoint) : Point.getOffsetY(startPoint, endPoint);
|
|
210
|
-
let benchmarkOffset = isHorizontal ? resizeHandlePoint[0] - resizeOriginPoint[0] : resizeHandlePoint[1] - resizeOriginPoint[1];
|
|
211
|
-
const zoom = normalizedOffset / benchmarkOffset;
|
|
212
|
-
if (isAspectRatio) {
|
|
213
|
-
xZoom = zoom;
|
|
214
|
-
yZoom = zoom;
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
if (isHorizontal) {
|
|
218
|
-
xZoom = zoom;
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
yZoom = zoom;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return { xZoom, yZoom };
|
|
226
|
-
};
|
|
227
|
-
export const movePointByZoomAndOriginPoint = (p, resizeOriginPoint, xZoom, yZoom) => {
|
|
228
|
-
const offsetX = (p[0] - resizeOriginPoint[0]) * xZoom;
|
|
229
|
-
const offsetY = (p[1] - resizeOriginPoint[1]) * yZoom;
|
|
230
|
-
return [p[0] + offsetX, p[1] + offsetY];
|
|
231
|
-
};
|
|
232
|
-
/**
|
|
233
|
-
* 1. Rotate 90°
|
|
234
|
-
* 2. Scale based on the rotated points
|
|
235
|
-
* 3. Reverse rotate the scaled points by 90°
|
|
236
|
-
*/
|
|
237
|
-
export const getResizePointsByOtherwiseAxis = (board, points, resizeOriginPoint, xZoom, yZoom) => {
|
|
238
|
-
const currentRectangle = RectangleClient.getRectangleByPoints(points);
|
|
239
|
-
debugGenerator.isDebug() && debugGenerator.drawRectangle(board, currentRectangle, { stroke: 'black' });
|
|
240
|
-
let resultPoints = points;
|
|
241
|
-
resultPoints = rotatePoints(resultPoints, RectangleClient.getCenterPoint(currentRectangle), (1 / 2) * Math.PI);
|
|
242
|
-
debugGenerator.isDebug() && debugGenerator.drawRectangle(board, resultPoints, { stroke: 'blue' });
|
|
243
|
-
resultPoints = resultPoints.map((p) => {
|
|
244
|
-
return movePointByZoomAndOriginPoint(p, resizeOriginPoint, xZoom, yZoom);
|
|
245
|
-
});
|
|
246
|
-
debugGenerator.isDebug() && debugGenerator.drawRectangle(board, resultPoints);
|
|
247
|
-
const newRectangle = RectangleClient.getRectangleByPoints(resultPoints);
|
|
248
|
-
return rotatePoints(resultPoints, RectangleClient.getCenterPoint(newRectangle), -(1 / 2) * Math.PI);
|
|
249
|
-
};
|
|
250
|
-
export const generatorResizeHandles = (board, resizeActivePoints, needCustomActiveRectangle) => {
|
|
251
|
-
const handleG = createG();
|
|
252
|
-
const elements = getSelectedElements(board);
|
|
253
|
-
const boundingRectangle = needCustomActiveRectangle
|
|
254
|
-
? RectangleClient.getRectangleByPoints(resizeActivePoints)
|
|
255
|
-
: getRectangleByElements(board, elements, false);
|
|
256
|
-
const boundingActiveRectangle = toActiveRectangleFromViewBoxRectangle(board, boundingRectangle);
|
|
257
|
-
let corners = RectangleClient.getCornerPoints(boundingActiveRectangle);
|
|
258
|
-
const angle = getSelectionAngle(elements);
|
|
259
|
-
if (angle) {
|
|
260
|
-
const centerPoint = RectangleClient.getCenterPoint(boundingActiveRectangle);
|
|
261
|
-
corners = rotatePoints(corners, centerPoint, angle);
|
|
262
|
-
}
|
|
263
|
-
corners.forEach((corner) => {
|
|
264
|
-
const g = drawHandle(board, corner);
|
|
265
|
-
handleG.append(g);
|
|
266
|
-
});
|
|
267
|
-
return handleG;
|
|
268
|
-
};
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kcmF3LXJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3BsdWdpbnMvd2l0aC1kcmF3LXJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUgsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixjQUFjLEVBQ2QsVUFBVSxFQUNWLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixPQUFPLEVBQ1Asc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixzQkFBc0IsRUFFdEIscUNBQXFDLEVBQ3hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU3RixNQUFNLFFBQVEsR0FBRyxpQ0FBaUMsQ0FBQztBQUNuRCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQVN0RCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWlCO0lB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QUMzRCxDQUFDLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyRCxNQUFNLHVCQUF1QixHQUFHLHFDQUFxQyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hHLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN2RSxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQWlDLENBQUM7SUFDeEYsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN2QixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFJlc2l6ZVJlZixcbiAgICBSZXNpemVTdGF0ZSxcbiAgICBXaXRoUmVzaXplT3B0aW9ucyxcbiAgICBkcmF3SGFuZGxlLFxuICAgIGdldEZpcnN0VGV4dE1hbmFnZSxcbiAgICBnZXRJbmRleEJ5UmVzaXplSGFuZGxlLFxuICAgIGdldFJlc2l6ZUhhbmRsZVBvaW50QnlJbmRleCxcbiAgICBnZXRTeW1tZXRyaWNIYW5kbGVJbmRleCxcbiAgICBpc0Nvcm5lckhhbmRsZSxcbiAgICB3aXRoUmVzaXplLFxuICAgIHJlc2V0UG9pbnRzQWZ0ZXJSZXNpemUsXG4gICAgbm9ybWFsaXplU2hhcGVQb2ludHNcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFRyYW5zZm9ybXMsXG4gICAgY3JlYXRlRyxcbiAgICBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzLFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gICAgaXNTZWxlY3Rpb25Nb3ZpbmcsXG4gICAgZ2V0U2VsZWN0aW9uQW5nbGUsXG4gICAgcm90YXRlUG9pbnRzLFxuICAgIHJvdGF0ZWREYXRhUG9pbnRzLFxuICAgIGNyZWF0ZURlYnVnR2VuZXJhdG9yLFxuICAgIGhhc1ZhbGlkQW5nbGUsXG4gICAgaXNBeGlzQ2hhbmdlZEJ5QW5nbGUsXG4gICAgZHJhd1JlY3RhbmdsZSxcbiAgICBBQ1RJVkVfU1RST0tFX1dJRFRILFxuICAgIFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgUGF0aCxcbiAgICB0b0FjdGl2ZVJlY3RhbmdsZUZyb21WaWV3Qm94UmVjdGFuZ2xlXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERyYXdUcmFuc2Zvcm1zIH0gZnJvbSAnLi4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBnZXRIaXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWYgfSBmcm9tICcuLi91dGlscy9wb3NpdGlvbi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXRTbmFwUmVzaXppbmdSZWZPcHRpb25zLCBnZXRTbmFwUmVzaXppbmdSZWYgfSBmcm9tICcuLi91dGlscy9zbmFwLXJlc2l6aW5nJztcbmltcG9ydCB7IGlzR2VvbWV0cnlJbmNsdWRlVGV4dCwgaXNTaW5nbGVTZWxlY3RMaW5lLCBpc1NpbmdsZVNlbGVjdFN3aW1sYW5lIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBkZWJ1Z0tleSA9ICdkZWJ1ZzpwbGFpdDpyZXNpemUtZm9yLXJvdGF0aW9uJztcbmNvbnN0IGRlYnVnR2VuZXJhdG9yID0gY3JlYXRlRGVidWdHZW5lcmF0b3IoZGVidWdLZXkpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtSb3RhdGlvblJlZiB7XG4gICAgYW5nbGU6IG51bWJlcjtcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgb2Zmc2V0WTogbnVtYmVyO1xuICAgIG5ld0NlbnRlclBvaW50OiBQb2ludDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEcmF3UmVzaXplKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3QgeyBhZnRlckNoYW5nZSwgZHJhd1NlbGVjdGlvblJlY3RhbmdsZSB9ID0gYm9hcmQ7XG4gICAgbGV0IHNuYXBHOiBTVkdHRWxlbWVudCB8IG51bGw7XG4gICAgbGV0IGhhbmRsZUc6IFNWR0dFbGVtZW50IHwgbnVsbDtcbiAgICBsZXQgbmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSA9IGZhbHNlO1xuICAgIGxldCByZXNpemVBY3RpdmVQb2ludHM6IFBvaW50W10gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IGNhblJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+PSAxICYmXG4gICAgICAgICAgICBlbGVtZW50cy5ldmVyeShcbiAgICAgICAgICAgICAgICAoZWwpID0+XG4gICAgICAgICAgICAgICAgICAgIChQbGFpdERyYXdFbGVtZW50LmlzRHJhd0VsZW1lbnQoZWwpIHx8IChQbGFpdERyYXdFbGVtZW50LmlzQ3VzdG9tR2VvbWV0cnlFbGVtZW50KGJvYXJkLCBlbCkgJiYgZWwucG9pbnRzLmxlbmd0aCA+IDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNTaW5nbGVTZWxlY3RMaW5lKGJvYXJkKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNTaW5nbGVTZWxlY3RTd2ltbGFuZShib2FyZClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uczogV2l0aFJlc2l6ZU9wdGlvbnM8UGxhaXREcmF3RWxlbWVudFtdPiA9IHtcbiAgICAgICAga2V5OiAnZHJhdy1lbGVtZW50cycsXG4gICAgICAgIGNhblJlc2l6ZSxcbiAgICAgICAgaGl0VGVzdDogKHBvaW50OiBQb2ludCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKSBhcyBQbGFpdERyYXdFbGVtZW50W107XG4gICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGVsZW1lbnRzLCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IGdldFNlbGVjdGlvbkFuZ2xlKGVsZW1lbnRzKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVJlZiA9IGdldEhpdFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZihib2FyZCwgYm91bmRpbmdSZWN0YW5nbGUsIHBvaW50LCBhbmdsZSk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlUmVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogWy4uLmVsZW1lbnRzXSxcbiAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlOiBib3VuZGluZ1JlY3RhbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBoYW5kbGVSZWYuaGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JDbGFzczogaGFuZGxlUmVmLmN1cnNvckNsYXNzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBvblJlc2l6ZTogKHJlc2l6ZVJlZjogUmVzaXplUmVmPFBsYWl0RHJhd0VsZW1lbnRbXT4sIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgc25hcEc/LnJlbW92ZSgpO1xuICAgICAgICAgICAgZGVidWdHZW5lcmF0b3IuaXNEZWJ1ZygpICYmIGRlYnVnR2VuZXJhdG9yLmNsZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBpc0Zyb21Db3JuZXIgPSBpc0Nvcm5lckhhbmRsZShib2FyZCwgcmVzaXplUmVmLmhhbmRsZSk7XG4gICAgICAgICAgICBjb25zdCBpc0FzcGVjdFJhdGlvID0gcmVzaXplU3RhdGUuaXNTaGlmdCB8fCAocmVzaXplUmVmLmVsZW1lbnQubGVuZ3RoID09PSAxICYmIFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZShyZXNpemVSZWYuZWxlbWVudFswXSkpO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQocmVzaXplUmVmLnJlY3RhbmdsZSEpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlSW5kZXggPSBnZXRJbmRleEJ5UmVzaXplSGFuZGxlKHJlc2l6ZVJlZi5oYW5kbGUpO1xuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW5Qb2ludCwgaGFuZGxlUG9pbnQgfSA9IGdldFJlc2l6ZU9yaWdpblBvaW50QW5kSGFuZGxlUG9pbnQoYm9hcmQsIGhhbmRsZUluZGV4LCByZXNpemVSZWYucmVjdGFuZ2xlISk7XG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IGdldFNlbGVjdGlvbkFuZ2xlKHJlc2l6ZVJlZi5lbGVtZW50KTtcbiAgICAgICAgICAgIGxldCBidWxrUm90YXRpb25SZWY6IEJ1bGtSb3RhdGlvblJlZiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgICAgIGJ1bGtSb3RhdGlvblJlZiA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGU6IGFuZ2xlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiAwLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAwLFxuICAgICAgICAgICAgICAgICAgICBuZXdDZW50ZXJQb2ludDogWzAsIDBdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBbcm90YXRlZFN0YXJ0UG9pbnQsIHJvdGF0ZUVuZFBvaW50XSA9IHJvdGF0ZVBvaW50cyhcbiAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50XSxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIC1idWxrUm90YXRpb25SZWYuYW5nbGVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQgPSByb3RhdGVkU3RhcnRQb2ludDtcbiAgICAgICAgICAgICAgICByZXNpemVTdGF0ZS5lbmRQb2ludCA9IHJvdGF0ZUVuZFBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzaXplU25hcFJlZk9wdGlvbnMgPSBnZXRTbmFwUmVzaXppbmdSZWZPcHRpb25zKFxuICAgICAgICAgICAgICAgIGJvYXJkLFxuICAgICAgICAgICAgICAgIHJlc2l6ZVJlZixcbiAgICAgICAgICAgICAgICByZXNpemVTdGF0ZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblBvaW50LFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb2ludFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNBc3BlY3RSYXRpbyxcbiAgICAgICAgICAgICAgICBpc0Zyb21Db3JuZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCByZXNpemVTbmFwUmVmID0gZ2V0U25hcFJlc2l6aW5nUmVmKGJvYXJkLCByZXNpemVSZWYuZWxlbWVudCwgcmVzaXplU25hcFJlZk9wdGlvbnMpO1xuICAgICAgICAgICAgcmVzaXplQWN0aXZlUG9pbnRzID0gcmVzaXplU25hcFJlZi5hY3RpdmVQb2ludHM7XG4gICAgICAgICAgICBzbmFwRyA9IHJlc2l6ZVNuYXBSZWYuc25hcEc7XG4gICAgICAgICAgICBQbGFpdEJvYXJkLmdldEVsZW1lbnRUb3BIb3N0KGJvYXJkKS5hcHBlbmQoc25hcEcpO1xuXG4gICAgICAgICAgICBpZiAoYnVsa1JvdGF0aW9uUmVmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm91bmRpbmdCb3hDb3JuZXJQb2ludHMgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UG9pbnRzKHJlc2l6ZVJlZi5yZWN0YW5nbGUhKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNpemVkQm91bmRpbmdCb3hDb3JuZXJQb2ludHMgPSBib3VuZGluZ0JveENvcm5lclBvaW50cy5tYXAoKHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50KHAsIG9yaWdpblBvaW50LCByZXNpemVTbmFwUmVmLnhab29tLCByZXNpemVTbmFwUmVmLnlab29tKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdCb3VuZGluZ0JveCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhyZXNpemVkQm91bmRpbmdCb3hDb3JuZXJQb2ludHMpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdHZW5lcmF0b3IuaXNEZWJ1ZygpICYmIGRlYnVnR2VuZXJhdG9yLmRyYXdSZWN0YW5nbGUoYm9hcmQsIG5ld0JvdW5kaW5nQm94LCB7IHN0cm9rZTogJ2JsdWUnIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Qm91bmRpbmdCb3hDZW50ZXIgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQobmV3Qm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkTmV3Qm91bmRpbmdCb3hQb2ludHMgPSByZXNldFBvaW50c0FmdGVyUmVzaXplKFxuICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYm91bmRpbmdCb3hDb3JuZXJQb2ludHMpLFxuICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocmVzaXplZEJvdW5kaW5nQm94Q29ybmVyUG9pbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIG5ld0JvdW5kaW5nQm94Q2VudGVyLFxuICAgICAgICAgICAgICAgICAgICBidWxrUm90YXRpb25SZWYuYW5nbGVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYWRqdXN0ZWROZXdCb3VuZGluZ0JveFBvaW50cykpO1xuICAgICAgICAgICAgICAgIGJ1bGtSb3RhdGlvblJlZiA9IE9iamVjdC5hc3NpZ24oYnVsa1JvdGF0aW9uUmVmLCB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IG5ld0NlbnRlclswXSAtIG5ld0JvdW5kaW5nQm94Q2VudGVyWzBdLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiBuZXdDZW50ZXJbMV0gLSBuZXdCb3VuZGluZ0JveENlbnRlclsxXSxcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2VudGVyUG9pbnQ6IG5ld0NlbnRlclxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZGVidWdHZW5lcmF0b3IuaXNEZWJ1ZygpICYmIGRlYnVnR2VuZXJhdG9yLmRyYXdSZWN0YW5nbGUoYm9hcmQsIGFkanVzdGVkTmV3Qm91bmRpbmdCb3hQb2ludHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNpemVSZWYuZWxlbWVudC5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRzO1xuICAgICAgICAgICAgICAgIGlmIChidWxrUm90YXRpb25SZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZWRQb2ludHMgPSByb3RhdGVkRGF0YVBvaW50cyh0YXJnZXQucG9pbnRzLCBjZW50ZXJQb2ludCwgLWJ1bGtSb3RhdGlvblJlZi5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IHJldmVyc2VkUG9pbnRzLm1hcCgocDogUG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlUG9pbnRCeVpvb21BbmRPcmlnaW5Qb2ludChwLCBvcmlnaW5Qb2ludCwgcmVzaXplU25hcFJlZi54Wm9vbSwgcmVzaXplU25hcFJlZi55Wm9vbSk7XG4gICAgICAgICAgICAgICAgICAgIH0pIGFzIFtQb2ludCwgUG9pbnRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RUYXJnZXRQb2ludHMgPSBwb2ludHMubWFwKChwKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBwWzBdICsgYnVsa1JvdGF0aW9uUmVmIS5vZmZzZXRYLFxuICAgICAgICAgICAgICAgICAgICAgICAgcFsxXSArIGJ1bGtSb3RhdGlvblJlZiEub2Zmc2V0WVxuICAgICAgICAgICAgICAgICAgICBdKSBhcyBQb2ludFtdO1xuICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSByb3RhdGVkRGF0YVBvaW50cyhhZGp1c3RUYXJnZXRQb2ludHMsIGJ1bGtSb3RhdGlvblJlZi5uZXdDZW50ZXJQb2ludCwgYnVsa1JvdGF0aW9uUmVmLmFuZ2xlKSBhcyBbUG9pbnQsIFBvaW50XTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRBbmdsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkQ3VzdG9tQWN0aXZlUmVjdGFuZ2xlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRBbmdsZSh0YXJnZXQpICYmIGlzQXhpc0NoYW5nZWRCeUFuZ2xlKHRhcmdldC5hbmdsZSEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBnZXRSZXNpemVQb2ludHNCeU90aGVyd2lzZUF4aXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5Qb2ludCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVTbmFwUmVmLnhab29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVNuYXBSZWYueVpvb21cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSB0YXJnZXQucG9pbnRzLm1hcCgocCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlUG9pbnRCeVpvb21BbmRPcmlnaW5Qb2ludChwLCBvcmlnaW5Qb2ludCwgcmVzaXplU25hcFJlZi54Wm9vbSwgcmVzaXplU25hcFJlZi55Wm9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzR2VvbWV0cnkodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KHRhcmdldCkgJiYgaXNHZW9tZXRyeUluY2x1ZGVUZXh0KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVpZ2h0OiB0ZXh0SGVpZ2h0IH0gPSBnZXRGaXJzdFRleHRNYW5hZ2UodGFyZ2V0KS5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBEcmF3VHJhbnNmb3Jtcy5yZXNpemVHZW9tZXRyeShib2FyZCwgcG9pbnRzIGFzIFtQb2ludCwgUG9pbnRdLCB0ZXh0SGVpZ2h0LCBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IG5vcm1hbGl6ZVNoYXBlUG9pbnRzKHBvaW50cyBhcyBbUG9pbnQsIFBvaW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIHsgcG9pbnRzIH0sIHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgUGxhaXREcmF3RWxlbWVudC5pc0xpbmUodGFyZ2V0KSB8fFxuICAgICAgICAgICAgICAgICAgICBQbGFpdERyYXdFbGVtZW50LmlzQ3VzdG9tR2VvbWV0cnlFbGVtZW50KGJvYXJkLCB0YXJnZXQpIHx8XG4gICAgICAgICAgICAgICAgICAgIFBsYWl0RHJhd0VsZW1lbnQuaXNWZWN0b3JMaW5lKHRhcmdldClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCB7IHBvaW50cyB9LCBwYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIHsgcG9pbnRzIH0sIHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGltYWdlIGVsZW1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSByZXNpemUsIGJ1dCBtb3ZlcyBiYXNlZCBvbiB0aGUgY2VudGVyIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHRhcmdldC5wb2ludHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQodGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlclBvaW50ID0gbW92ZVBvaW50Qnlab29tQW5kT3JpZ2luUG9pbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplU25hcFJlZi54Wm9vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVTbmFwUmVmLnlab29tXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFyZ2V0UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5Q2VudGVyUG9pbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VudGVyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlY3RhbmdsZS5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIHsgcG9pbnRzOiBSZWN0YW5nbGVDbGllbnQuZ2V0UG9pbnRzKG5ld1RhcmdldFJlY3RhbmdsZSkgfSwgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJSZXNpemU6IChyZXNpemVSZWY6IFJlc2l6ZVJlZjxQbGFpdERyYXdFbGVtZW50W10+KSA9PiB7XG4gICAgICAgICAgICBzbmFwRz8ucmVtb3ZlKCk7XG4gICAgICAgICAgICBzbmFwRyA9IG51bGw7XG4gICAgICAgICAgICBpZiAobmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSkge1xuICAgICAgICAgICAgICAgIG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXNpemVBY3RpdmVQb2ludHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmFkZFNlbGVjdGlvbldpdGhUZW1wb3JhcnlFbGVtZW50cyhib2FyZCwgc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgd2l0aFJlc2l6ZTxQbGFpdERyYXdFbGVtZW50W10+KGJvYXJkLCBvcHRpb25zKTtcblxuICAgIGJvYXJkLmFmdGVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBhZnRlckNoYW5nZSgpO1xuICAgICAgICBpZiAoaGFuZGxlRykge1xuICAgICAgICAgICAgaGFuZGxlRy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGhhbmRsZUcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgaWYgKGNhblJlc2l6ZSgpICYmICFpc1NlbGVjdGlvbk1vdmluZyhib2FyZCkgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBoYW5kbGVHID0gZ2VuZXJhdG9yUmVzaXplSGFuZGxlcyhib2FyZCwgcmVzaXplQWN0aXZlUG9pbnRzISwgbmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgICAgICBQbGFpdEJvYXJkLmdldEFjdGl2ZUhvc3QoYm9hcmQpLmFwcGVuZChoYW5kbGVHKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBib2FyZC5kcmF3U2VsZWN0aW9uUmVjdGFuZ2xlID0gKCkgPT4ge1xuICAgICAgICBpZiAobmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSkge1xuICAgICAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHJlc2l6ZUFjdGl2ZVBvaW50cyEpO1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gdG9BY3RpdmVSZWN0YW5nbGVGcm9tVmlld0JveFJlY3RhbmdsZShib2FyZCwgcmVjdGFuZ2xlKTtcbiAgICAgICAgICAgIHJldHVybiBkcmF3UmVjdGFuZ2xlKGJvYXJkLCBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShhY3RpdmVSZWN0YW5nbGUsIEFDVElWRV9TVFJPS0VfV0lEVEgpLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBBQ1RJVkVfU1RST0tFX1dJRFRIXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhd1NlbGVjdGlvblJlY3RhbmdsZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYm9hcmQ7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVPcmlnaW5Qb2ludEFuZEhhbmRsZVBvaW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBoYW5kbGVJbmRleDogbnVtYmVyLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IHN5bW1ldHJpY0hhbmRsZUluZGV4ID0gZ2V0U3ltbWV0cmljSGFuZGxlSW5kZXgoYm9hcmQsIGhhbmRsZUluZGV4KTtcbiAgICBjb25zdCBvcmlnaW5Qb2ludCA9IGdldFJlc2l6ZUhhbmRsZVBvaW50QnlJbmRleChyZWN0YW5nbGUgYXMgUmVjdGFuZ2xlQ2xpZW50LCBzeW1tZXRyaWNIYW5kbGVJbmRleCk7XG4gICAgY29uc3QgaGFuZGxlUG9pbnQgPSBnZXRSZXNpemVIYW5kbGVQb2ludEJ5SW5kZXgocmVjdGFuZ2xlIGFzIFJlY3RhbmdsZUNsaWVudCwgaGFuZGxlSW5kZXgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpblBvaW50LFxuICAgICAgICBoYW5kbGVQb2ludFxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplWm9vbSA9IChcbiAgICByZXNpemVTdGFydEFuZEVuZDogW1BvaW50LCBQb2ludF0sXG4gICAgcmVzaXplT3JpZ2luUG9pbnQ6IFBvaW50LFxuICAgIHJlc2l6ZUhhbmRsZVBvaW50OiBQb2ludCxcbiAgICBpc0Zyb21Db3JuZXI6IGJvb2xlYW4sXG4gICAgaXNBc3BlY3RSYXRpbzogYm9vbGVhblxuKSA9PiB7XG4gICAgY29uc3QgW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSA9IHJlc2l6ZVN0YXJ0QW5kRW5kO1xuICAgIGxldCB4Wm9vbSA9IDA7XG4gICAgbGV0IHlab29tID0gMDtcbiAgICBpZiAoaXNGcm9tQ29ybmVyKSB7XG4gICAgICAgIGlmIChpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZE9mZnNldFggPSBQb2ludC5nZXRPZmZzZXRYKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgICAgIHhab29tID0gbm9ybWFsaXplZE9mZnNldFggLyAocmVzaXplSGFuZGxlUG9pbnRbMF0gLSByZXNpemVPcmlnaW5Qb2ludFswXSk7XG4gICAgICAgICAgICB5Wm9vbSA9IHhab29tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRPZmZzZXRYID0gUG9pbnQuZ2V0T2Zmc2V0WChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZE9mZnNldFkgPSBQb2ludC5nZXRPZmZzZXRZKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgICAgIHhab29tID0gbm9ybWFsaXplZE9mZnNldFggLyAocmVzaXplSGFuZGxlUG9pbnRbMF0gLSByZXNpemVPcmlnaW5Qb2ludFswXSk7XG4gICAgICAgICAgICB5Wm9vbSA9IG5vcm1hbGl6ZWRPZmZzZXRZIC8gKHJlc2l6ZUhhbmRsZVBvaW50WzFdIC0gcmVzaXplT3JpZ2luUG9pbnRbMV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHJlc2l6ZU9yaWdpblBvaW50LCByZXNpemVIYW5kbGVQb2ludCwgMC4xKSB8fCBmYWxzZTtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRPZmZzZXQgPSBpc0hvcml6b250YWwgPyBQb2ludC5nZXRPZmZzZXRYKHN0YXJ0UG9pbnQsIGVuZFBvaW50KSA6IFBvaW50LmdldE9mZnNldFkoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgICAgICBsZXQgYmVuY2htYXJrT2Zmc2V0ID0gaXNIb3Jpem9udGFsID8gcmVzaXplSGFuZGxlUG9pbnRbMF0gLSByZXNpemVPcmlnaW5Qb2ludFswXSA6IHJlc2l6ZUhhbmRsZVBvaW50WzFdIC0gcmVzaXplT3JpZ2luUG9pbnRbMV07XG4gICAgICAgIGNvbnN0IHpvb20gPSBub3JtYWxpemVkT2Zmc2V0IC8gYmVuY2htYXJrT2Zmc2V0O1xuICAgICAgICBpZiAoaXNBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgeFpvb20gPSB6b29tO1xuICAgICAgICAgICAgeVpvb20gPSB6b29tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHhab29tID0gem9vbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeVpvb20gPSB6b29tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHhab29tLCB5Wm9vbSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50ID0gKHA6IFBvaW50LCByZXNpemVPcmlnaW5Qb2ludDogUG9pbnQsIHhab29tOiBudW1iZXIsIHlab29tOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBvZmZzZXRYID0gKHBbMF0gLSByZXNpemVPcmlnaW5Qb2ludFswXSkgKiB4Wm9vbTtcbiAgICBjb25zdCBvZmZzZXRZID0gKHBbMV0gLSByZXNpemVPcmlnaW5Qb2ludFsxXSkgKiB5Wm9vbTtcbiAgICByZXR1cm4gW3BbMF0gKyBvZmZzZXRYLCBwWzFdICsgb2Zmc2V0WV0gYXMgUG9pbnQ7XG59O1xuXG4vKipcbiAqIDEuIFJvdGF0ZSA5MMKwXG4gKiAyLiBTY2FsZSBiYXNlZCBvbiB0aGUgcm90YXRlZCBwb2ludHNcbiAqIDMuIFJldmVyc2Ugcm90YXRlIHRoZSBzY2FsZWQgcG9pbnRzIGJ5IDkwwrBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc2l6ZVBvaW50c0J5T3RoZXJ3aXNlQXhpcyA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBwb2ludHM6IFBvaW50W10sXG4gICAgcmVzaXplT3JpZ2luUG9pbnQ6IFBvaW50LFxuICAgIHhab29tOiBudW1iZXIsXG4gICAgeVpvb206IG51bWJlclxuKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpO1xuICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5kcmF3UmVjdGFuZ2xlKGJvYXJkLCBjdXJyZW50UmVjdGFuZ2xlLCB7IHN0cm9rZTogJ2JsYWNrJyB9KTtcbiAgICBsZXQgcmVzdWx0UG9pbnRzID0gcG9pbnRzO1xuICAgIHJlc3VsdFBvaW50cyA9IHJvdGF0ZVBvaW50cyhyZXN1bHRQb2ludHMsIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChjdXJyZW50UmVjdGFuZ2xlKSwgKDEgLyAyKSAqIE1hdGguUEkpO1xuICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5kcmF3UmVjdGFuZ2xlKGJvYXJkLCByZXN1bHRQb2ludHMsIHsgc3Ryb2tlOiAnYmx1ZScgfSk7XG4gICAgcmVzdWx0UG9pbnRzID0gcmVzdWx0UG9pbnRzLm1hcCgocCkgPT4ge1xuICAgICAgICByZXR1cm4gbW92ZVBvaW50Qnlab29tQW5kT3JpZ2luUG9pbnQocCwgcmVzaXplT3JpZ2luUG9pbnQsIHhab29tLCB5Wm9vbSk7XG4gICAgfSk7XG4gICAgZGVidWdHZW5lcmF0b3IuaXNEZWJ1ZygpICYmIGRlYnVnR2VuZXJhdG9yLmRyYXdSZWN0YW5nbGUoYm9hcmQsIHJlc3VsdFBvaW50cyk7XG4gICAgY29uc3QgbmV3UmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHJlc3VsdFBvaW50cyk7XG4gICAgcmV0dXJuIHJvdGF0ZVBvaW50cyhyZXN1bHRQb2ludHMsIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChuZXdSZWN0YW5nbGUpLCAtKDEgLyAyKSAqIE1hdGguUEkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRvclJlc2l6ZUhhbmRsZXMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlc2l6ZUFjdGl2ZVBvaW50cz86IFBvaW50W10sIG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGU/OiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlRyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpIGFzIFBsYWl0RHJhd0VsZW1lbnRbXTtcbiAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGVcbiAgICAgICAgPyBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocmVzaXplQWN0aXZlUG9pbnRzISlcbiAgICAgICAgOiBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBlbGVtZW50cywgZmFsc2UpO1xuICAgIGNvbnN0IGJvdW5kaW5nQWN0aXZlUmVjdGFuZ2xlID0gdG9BY3RpdmVSZWN0YW5nbGVGcm9tVmlld0JveFJlY3RhbmdsZShib2FyZCwgYm91bmRpbmdSZWN0YW5nbGUpO1xuICAgIGxldCBjb3JuZXJzID0gUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhib3VuZGluZ0FjdGl2ZVJlY3RhbmdsZSk7XG4gICAgY29uc3QgYW5nbGUgPSBnZXRTZWxlY3Rpb25BbmdsZShlbGVtZW50cyk7XG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlclBvaW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KGJvdW5kaW5nQWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgY29ybmVycyA9IHJvdGF0ZVBvaW50cyhjb3JuZXJzLCBjZW50ZXJQb2ludCwgYW5nbGUpIGFzIFtQb2ludCwgUG9pbnQsIFBvaW50LCBQb2ludF07XG4gICAgfVxuICAgIGNvcm5lcnMuZm9yRWFjaCgoY29ybmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGcgPSBkcmF3SGFuZGxlKGJvYXJkLCBjb3JuZXIpO1xuICAgICAgICBoYW5kbGVHLmFwcGVuZChnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlRztcbn07XG4iXX0=
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { MERGING, PlaitBoard, RectangleClient, Transforms, getRectangleByElements, getSelectedElements, getSelectionAngle, isMainPointer, isSelectionMoving, rotatePoints, throttleRAF, drawRectangle, ACTIVE_STROKE_WIDTH, SELECTION_BORDER_COLOR, setAngleForG, rotateElements, getAngleBetweenPoints, ROTATE_HANDLE_CLASS_NAME, SELECTION_RECTANGLE_CLASS_NAME, normalizeAngle, degreesToRadians, toActiveRectangleFromViewBoxRectangle, toActivePoint } from '@plait/core';
|
|
2
|
-
import { addRotating, removeRotating, drawRotateHandle } from '@plait/common';
|
|
3
|
-
import { PlaitDrawElement } from '../interfaces';
|
|
4
|
-
import { getRotateHandleRectangle } from '../utils/position/geometry';
|
|
5
|
-
export const withDrawRotate = (board) => {
|
|
6
|
-
const { pointerDown, pointerMove, globalPointerUp, afterChange, drawSelectionRectangle } = board;
|
|
7
|
-
let rotateRef = null;
|
|
8
|
-
let rotateHandleG;
|
|
9
|
-
let needCustomActiveRectangle = false;
|
|
10
|
-
const canRotate = () => {
|
|
11
|
-
const elements = getSelectedElements(board);
|
|
12
|
-
return (elements.length > 0 &&
|
|
13
|
-
elements.every((el) => (PlaitDrawElement.isDrawElement(el) && !PlaitDrawElement.isArrowLine(el)) ||
|
|
14
|
-
PlaitDrawElement.isCustomGeometryElement(board, el)));
|
|
15
|
-
};
|
|
16
|
-
board.pointerDown = (event) => {
|
|
17
|
-
if (!canRotate() || PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board) || !isMainPointer(event)) {
|
|
18
|
-
pointerDown(event);
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
const activePoint = toActivePoint(board, event.x, event.y);
|
|
22
|
-
const elements = getSelectedElements(board);
|
|
23
|
-
const rectangle = getRectangleByElements(board, elements, false);
|
|
24
|
-
const activeRectangle = toActiveRectangleFromViewBoxRectangle(board, rectangle);
|
|
25
|
-
const handleRectangle = getRotateHandleRectangle(activeRectangle);
|
|
26
|
-
const angle = getSelectionAngle(elements);
|
|
27
|
-
const rotatedPoint = angle ? rotatePoints(activePoint, RectangleClient.getCenterPoint(activeRectangle), -angle) : activePoint;
|
|
28
|
-
if (handleRectangle && RectangleClient.isHit(RectangleClient.getRectangleByPoints([rotatedPoint, rotatedPoint]), handleRectangle)) {
|
|
29
|
-
rotateRef = {
|
|
30
|
-
elements: [...elements],
|
|
31
|
-
startPoint: activePoint
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
pointerDown(event);
|
|
35
|
-
};
|
|
36
|
-
board.pointerMove = (event) => {
|
|
37
|
-
if (rotateRef) {
|
|
38
|
-
event.preventDefault();
|
|
39
|
-
const isShift = !!event.shiftKey;
|
|
40
|
-
addRotating(board, rotateRef);
|
|
41
|
-
const endPoint = toActivePoint(board, event.x, event.y);
|
|
42
|
-
const rectangle = getRectangleByElements(board, rotateRef.elements, false);
|
|
43
|
-
const activeRectangle = toActiveRectangleFromViewBoxRectangle(board, rectangle);
|
|
44
|
-
const selectionCenterPoint = RectangleClient.getCenterPoint(activeRectangle);
|
|
45
|
-
if (!getSelectionAngle(rotateRef.elements) && rotateRef.elements.length > 1) {
|
|
46
|
-
needCustomActiveRectangle = true;
|
|
47
|
-
}
|
|
48
|
-
throttleRAF(board, 'with-common-rotate', () => {
|
|
49
|
-
if (rotateRef && rotateRef.startPoint) {
|
|
50
|
-
let angle = getAngleBetweenPoints(rotateRef.startPoint, endPoint, selectionCenterPoint);
|
|
51
|
-
const selectionAngle = getSelectionAngle(rotateRef.elements);
|
|
52
|
-
angle = normalizeAngle(selectionAngle + angle);
|
|
53
|
-
if (isShift) {
|
|
54
|
-
angle += Math.PI / 12 / 2;
|
|
55
|
-
angle -= angle % (Math.PI / 12);
|
|
56
|
-
}
|
|
57
|
-
let remainder = angle % (Math.PI / 2);
|
|
58
|
-
if (Math.PI / 2 - remainder <= degreesToRadians(5)) {
|
|
59
|
-
const snapAngle = Math.PI / 2 - remainder;
|
|
60
|
-
angle += snapAngle;
|
|
61
|
-
}
|
|
62
|
-
if (remainder <= degreesToRadians(5)) {
|
|
63
|
-
const snapAngle = -remainder;
|
|
64
|
-
angle += snapAngle;
|
|
65
|
-
}
|
|
66
|
-
rotateRef.angle = normalizeAngle(angle - selectionAngle) || 0;
|
|
67
|
-
rotateElements(board, rotateRef.elements, rotateRef.angle);
|
|
68
|
-
PlaitBoard.getBoardContainer(board).classList.add('element-rotating');
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
pointerMove(event);
|
|
74
|
-
};
|
|
75
|
-
board.globalPointerUp = (event) => {
|
|
76
|
-
globalPointerUp(event);
|
|
77
|
-
if (needCustomActiveRectangle) {
|
|
78
|
-
needCustomActiveRectangle = false;
|
|
79
|
-
const selectedElements = getSelectedElements(board);
|
|
80
|
-
Transforms.addSelectionWithTemporaryElements(board, selectedElements);
|
|
81
|
-
}
|
|
82
|
-
PlaitBoard.getBoardContainer(board).classList.remove('element-rotating');
|
|
83
|
-
removeRotating(board);
|
|
84
|
-
rotateRef = null;
|
|
85
|
-
MERGING.set(board, false);
|
|
86
|
-
};
|
|
87
|
-
board.afterChange = () => {
|
|
88
|
-
afterChange();
|
|
89
|
-
if (rotateHandleG) {
|
|
90
|
-
rotateHandleG.remove();
|
|
91
|
-
rotateHandleG = null;
|
|
92
|
-
}
|
|
93
|
-
if (canRotate() && !isSelectionMoving(board)) {
|
|
94
|
-
if (needCustomActiveRectangle && rotateRef) {
|
|
95
|
-
const boundingRectangle = getRectangleByElements(board, rotateRef.elements, false);
|
|
96
|
-
const boundingActiveRectangle = toActiveRectangleFromViewBoxRectangle(board, boundingRectangle);
|
|
97
|
-
rotateHandleG = drawRotateHandle(board, boundingActiveRectangle);
|
|
98
|
-
rotateHandleG.classList.add(ROTATE_HANDLE_CLASS_NAME);
|
|
99
|
-
if (rotateRef.angle) {
|
|
100
|
-
setAngleForG(rotateHandleG, RectangleClient.getCenterPoint(boundingActiveRectangle), rotateRef.angle);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const elements = getSelectedElements(board);
|
|
105
|
-
const boundingRectangle = getRectangleByElements(board, elements, false);
|
|
106
|
-
const boundingActiveRectangle = toActiveRectangleFromViewBoxRectangle(board, boundingRectangle);
|
|
107
|
-
rotateHandleG = drawRotateHandle(board, boundingActiveRectangle);
|
|
108
|
-
rotateHandleG.classList.add(ROTATE_HANDLE_CLASS_NAME);
|
|
109
|
-
setAngleForG(rotateHandleG, RectangleClient.getCenterPoint(boundingActiveRectangle), getSelectionAngle(elements));
|
|
110
|
-
}
|
|
111
|
-
PlaitBoard.getActiveHost(board).append(rotateHandleG);
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
board.drawSelectionRectangle = () => {
|
|
115
|
-
if (needCustomActiveRectangle && rotateRef) {
|
|
116
|
-
const rectangle = getRectangleByElements(board, rotateRef.elements, false);
|
|
117
|
-
const activeRectangle = toActiveRectangleFromViewBoxRectangle(board, rectangle);
|
|
118
|
-
const rectangleG = drawRectangle(board, RectangleClient.inflate(activeRectangle, ACTIVE_STROKE_WIDTH), {
|
|
119
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
120
|
-
strokeWidth: ACTIVE_STROKE_WIDTH
|
|
121
|
-
});
|
|
122
|
-
rectangleG.classList.add(SELECTION_RECTANGLE_CLASS_NAME);
|
|
123
|
-
if (rotateRef.angle) {
|
|
124
|
-
setAngleForG(rectangleG, RectangleClient.getCenterPoint(activeRectangle), rotateRef.angle);
|
|
125
|
-
}
|
|
126
|
-
return rectangleG;
|
|
127
|
-
}
|
|
128
|
-
return drawSelectionRectangle();
|
|
129
|
-
};
|
|
130
|
-
return board;
|
|
131
|
-
};
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kcmF3LXJvdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3BsdWdpbnMvd2l0aC1kcmF3LXJvdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsT0FBTyxFQUNQLFVBQVUsRUFDVixlQUFlLEVBQ2YsVUFBVSxFQUNWLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFdBQVcsRUFHWCxhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osY0FBYyxFQUNkLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIscUNBQXFDLEVBQ3JDLGFBQWEsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUNoRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ2pHLElBQUksU0FBUyxHQUFxQixJQUFJLENBQUM7SUFDdkMsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUkseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBRXRDLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNuQixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztR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QUFDLENBQUMsQ0FBQztZQUN0SCxDQUFDO1lBQ0QsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLEVBQUU7UUFDaEMsSUFBSSx5QkFBeUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRSxNQUFNLGVBQWUsR0FBRyxxQ0FBcUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEYsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO2dCQUNuRyxNQUFNLEVBQUUsc0JBQXNCO2dCQUM5QixXQUFXLEVBQUUsbUJBQW1CO2FBQ25DLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDekQsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLFlBQVksQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLHNCQUFzQixFQUFFLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBNRVJHSU5HLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFRyYW5zZm9ybXMsXG4gICAgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyxcbiAgICBnZXRTZWxlY3RlZEVsZW1lbnRzLFxuICAgIGdldFNlbGVjdGlvbkFuZ2xlLFxuICAgIGlzTWFpblBvaW50ZXIsXG4gICAgaXNTZWxlY3Rpb25Nb3ZpbmcsXG4gICAgcm90YXRlUG9pbnRzLFxuICAgIHRocm90dGxlUkFGLFxuICAgIHRvSG9zdFBvaW50LFxuICAgIHRvVmlld0JveFBvaW50LFxuICAgIGRyYXdSZWN0YW5nbGUsXG4gICAgQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgIHNldEFuZ2xlRm9yRyxcbiAgICByb3RhdGVFbGVtZW50cyxcbiAgICBnZXRBbmdsZUJldHdlZW5Qb2ludHMsXG4gICAgUk9UQVRFX0hBTkRMRV9DTEFTU19OQU1FLFxuICAgIFNFTEVDVElPTl9SRUNUQU5HTEVfQ0xBU1NfTkFNRSxcbiAgICBub3JtYWxpemVBbmdsZSxcbiAgICBkZWdyZWVzVG9SYWRpYW5zLFxuICAgIHRvQWN0aXZlUmVjdGFuZ2xlRnJvbVZpZXdCb3hSZWN0YW5nbGUsXG4gICAgdG9BY3RpdmVQb2ludFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBhZGRSb3RhdGluZywgcmVtb3ZlUm90YXRpbmcsIGRyYXdSb3RhdGVIYW5kbGUsIFJvdGF0ZVJlZiB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0Um90YXRlSGFuZGxlUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vZ2VvbWV0cnknO1xuXG5leHBvcnQgY29uc3Qgd2l0aERyYXdSb3RhdGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IHBvaW50ZXJEb3duLCBwb2ludGVyTW92ZSwgZ2xvYmFsUG9pbnRlclVwLCBhZnRlckNoYW5nZSwgZHJhd1NlbGVjdGlvblJlY3RhbmdsZSB9ID0gYm9hcmQ7XG4gICAgbGV0IHJvdGF0ZVJlZjogUm90YXRlUmVmIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHJvdGF0ZUhhbmRsZUc6IFNWR0dFbGVtZW50IHwgbnVsbDtcbiAgICBsZXQgbmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FuUm90YXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgZWxlbWVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgKGVsKSA9PlxuICAgICAgICAgICAgICAgICAgICAoUGxhaXREcmF3RWxlbWVudC5pc0RyYXdFbGVtZW50KGVsKSAmJiAhUGxhaXREcmF3RWxlbWVudC5pc0Fycm93TGluZShlbCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIFBsYWl0RHJhd0VsZW1lbnQuaXNDdXN0b21HZW9tZXRyeUVsZW1lbnQoYm9hcmQsIGVsKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBib2FyZC5wb2ludGVyRG93biA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghY2FuUm90YXRlKCkgfHwgUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSB8fCBQbGFpdEJvYXJkLmhhc0JlZW5UZXh0RWRpdGluZyhib2FyZCkgfHwgIWlzTWFpblBvaW50ZXIoZXZlbnQpKSB7XG4gICAgICAgICAgICBwb2ludGVyRG93bihldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aXZlUG9pbnQgPSB0b0FjdGl2ZVBvaW50KGJvYXJkLCBldmVudC54LCBldmVudC55KTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKSBhcyBQbGFpdERyYXdFbGVtZW50W107XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGVsZW1lbnRzLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZSA9IHRvQWN0aXZlUmVjdGFuZ2xlRnJvbVZpZXdCb3hSZWN0YW5nbGUoYm9hcmQsIHJlY3RhbmdsZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJlY3RhbmdsZSA9IGdldFJvdGF0ZUhhbmRsZVJlY3RhbmdsZShhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICBjb25zdCBhbmdsZSA9IGdldFNlbGVjdGlvbkFuZ2xlKGVsZW1lbnRzKTtcbiAgICAgICAgY29uc3Qgcm90YXRlZFBvaW50ID0gYW5nbGUgPyByb3RhdGVQb2ludHMoYWN0aXZlUG9pbnQsIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChhY3RpdmVSZWN0YW5nbGUpLCAtYW5nbGUpIDogYWN0aXZlUG9pbnQ7XG4gICAgICAgIGlmIChoYW5kbGVSZWN0YW5nbGUgJiYgUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcm90YXRlZFBvaW50LCByb3RhdGVkUG9pbnRdKSwgaGFuZGxlUmVjdGFuZ2xlKSkge1xuICAgICAgICAgICAgcm90YXRlUmVmID0ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbLi4uZWxlbWVudHNdLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQ6IGFjdGl2ZVBvaW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQucG9pbnRlck1vdmUgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBpZiAocm90YXRlUmVmKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNTaGlmdCA9ICEhZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgICAgICBhZGRSb3RhdGluZyhib2FyZCwgcm90YXRlUmVmKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdG9BY3RpdmVQb2ludChib2FyZCwgZXZlbnQueCwgZXZlbnQueSk7XG4gICAgICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCByb3RhdGVSZWYuZWxlbWVudHMsIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZSA9IHRvQWN0aXZlUmVjdGFuZ2xlRnJvbVZpZXdCb3hSZWN0YW5nbGUoYm9hcmQsIHJlY3RhbmdsZSk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25DZW50ZXJQb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgaWYgKCFnZXRTZWxlY3Rpb25BbmdsZShyb3RhdGVSZWYuZWxlbWVudHMpICYmIHJvdGF0ZVJlZi5lbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgbmVlZEN1c3RvbUFjdGl2ZVJlY3RhbmdsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm90dGxlUkFGKGJvYXJkLCAnd2l0aC1jb21tb24tcm90YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyb3RhdGVSZWYgJiYgcm90YXRlUmVmLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gZ2V0QW5nbGVCZXR3ZWVuUG9pbnRzKHJvdGF0ZVJlZi5zdGFydFBvaW50LCBlbmRQb2ludCwgc2VsZWN0aW9uQ2VudGVyUG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25BbmdsZSA9IGdldFNlbGVjdGlvbkFuZ2xlKHJvdGF0ZVJlZi5lbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gbm9ybWFsaXplQW5nbGUoc2VsZWN0aW9uQW5nbGUgKyBhbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NoaWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMTIgLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgLT0gYW5nbGUgJSAoTWF0aC5QSSAvIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1haW5kZXIgPSBhbmdsZSAlIChNYXRoLlBJIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLlBJIC8gMiAtIHJlbWFpbmRlciA8PSBkZWdyZWVzVG9SYWRpYW5zKDUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwQW5nbGUgPSBNYXRoLlBJIC8gMiAtIHJlbWFpbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlICs9IHNuYXBBbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPD0gZGVncmVlc1RvUmFkaWFucyg1KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc25hcEFuZ2xlID0gLXJlbWFpbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlICs9IHNuYXBBbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJlZi5hbmdsZSA9IG5vcm1hbGl6ZUFuZ2xlKGFuZ2xlIC0gc2VsZWN0aW9uQW5nbGUpIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZUVsZW1lbnRzKGJvYXJkLCByb3RhdGVSZWYuZWxlbWVudHMsIHJvdGF0ZVJlZi5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoJ2VsZW1lbnQtcm90YXRpbmcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvaW50ZXJNb3ZlKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuZ2xvYmFsUG9pbnRlclVwID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgZ2xvYmFsUG9pbnRlclVwKGV2ZW50KTtcbiAgICAgICAgaWYgKG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGUpIHtcbiAgICAgICAgICAgIG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuYWRkU2VsZWN0aW9uV2l0aFRlbXBvcmFyeUVsZW1lbnRzKGJvYXJkLCBzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QucmVtb3ZlKCdlbGVtZW50LXJvdGF0aW5nJyk7XG4gICAgICAgIHJlbW92ZVJvdGF0aW5nKGJvYXJkKTtcbiAgICAgICAgcm90YXRlUmVmID0gbnVsbDtcbiAgICAgICAgTUVSR0lORy5zZXQoYm9hcmQsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgYm9hcmQuYWZ0ZXJDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGFmdGVyQ2hhbmdlKCk7XG4gICAgICAgIGlmIChyb3RhdGVIYW5kbGVHKSB7XG4gICAgICAgICAgICByb3RhdGVIYW5kbGVHLnJlbW92ZSgpO1xuICAgICAgICAgICAgcm90YXRlSGFuZGxlRyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FuUm90YXRlKCkgJiYgIWlzU2VsZWN0aW9uTW92aW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgaWYgKG5lZWRDdXN0b21BY3RpdmVSZWN0YW5nbGUgJiYgcm90YXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm91bmRpbmdSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCByb3RhdGVSZWYuZWxlbWVudHMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZGluZ0FjdGl2ZVJlY3RhbmdsZSA9IHRvQWN0aXZlUmVjdGFuZ2xlRnJvbVZpZXdCb3hSZWN0YW5nbGUoYm9hcmQsIGJvdW5kaW5nUmVjdGFuZ2xlKTtcbiAgICAgICAgICAgICAgICByb3RhdGVIYW5kbGVHID0gZHJhd1JvdGF0ZUhhbmRsZShib2FyZCwgYm91bmRpbmdBY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgICAgIHJvdGF0ZUhhbmRsZUcuY2xhc3NMaXN0LmFkZChST1RBVEVfSEFORExFX0NMQVNTX05BTUUpO1xuICAgICAgICAgICAgICAgIGlmIChyb3RhdGVSZWYuYW5nbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QW5nbGVGb3JHKHJvdGF0ZUhhbmRsZUcsIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChib3VuZGluZ0FjdGl2ZVJlY3RhbmdsZSksIHJvdGF0ZVJlZi5hbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpIGFzIFBsYWl0RHJhd0VsZW1lbnRbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGVsZW1lbnRzLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm91bmRpbmdBY3RpdmVSZWN0YW5nbGUgPSB0b0FjdGl2ZVJlY3RhbmdsZUZyb21WaWV3Qm94UmVjdGFuZ2xlKGJvYXJkLCBib3VuZGluZ1JlY3RhbmdsZSk7XG4gICAgICAgICAgICAgICAgcm90YXRlSGFuZGxlRyA9IGRyYXdSb3RhdGVIYW5kbGUoYm9hcmQsIGJvdW5kaW5nQWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgICAgICAgICByb3RhdGVIYW5kbGVHLmNsYXNzTGlzdC5hZGQoUk9UQVRFX0hBTkRMRV9DTEFTU19OQU1FKTtcbiAgICAgICAgICAgICAgICBzZXRBbmdsZUZvckcocm90YXRlSGFuZGxlRywgUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KGJvdW5kaW5nQWN0aXZlUmVjdGFuZ2xlKSwgZ2V0U2VsZWN0aW9uQW5nbGUoZWxlbWVudHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFBsYWl0Qm9hcmQuZ2V0QWN0aXZlSG9zdChib2FyZCkuYXBwZW5kKHJvdGF0ZUhhbmRsZUcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGJvYXJkLmRyYXdTZWxlY3Rpb25SZWN0YW5nbGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChuZWVkQ3VzdG9tQWN0aXZlUmVjdGFuZ2xlICYmIHJvdGF0ZVJlZikge1xuICAgICAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgcm90YXRlUmVmLmVsZW1lbnRzLCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVSZWN0YW5nbGUgPSB0b0FjdGl2ZVJlY3RhbmdsZUZyb21WaWV3Qm94UmVjdGFuZ2xlKGJvYXJkLCByZWN0YW5nbGUpO1xuICAgICAgICAgICAgY29uc3QgcmVjdGFuZ2xlRyA9IGRyYXdSZWN0YW5nbGUoYm9hcmQsIFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKGFjdGl2ZVJlY3RhbmdsZSwgQUNUSVZFX1NUUk9LRV9XSURUSCksIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IEFDVElWRV9TVFJPS0VfV0lEVEhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVjdGFuZ2xlRy5jbGFzc0xpc3QuYWRkKFNFTEVDVElPTl9SRUNUQU5HTEVfQ0xBU1NfTkFNRSk7XG4gICAgICAgICAgICBpZiAocm90YXRlUmVmLmFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgc2V0QW5nbGVGb3JHKHJlY3RhbmdsZUcsIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChhY3RpdmVSZWN0YW5nbGUpLCByb3RhdGVSZWYuYW5nbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY3RhbmdsZUc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXdTZWxlY3Rpb25SZWN0YW5nbGUoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcbiJdfQ==
|