@plait/draw 0.50.1 → 0.51.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/README.md +13 -1
- package/constants/line.d.ts +1 -0
- package/engines/basic-shapes/ellipse.d.ts +1 -10
- package/engines/flowchart/terminal.d.ts +1 -0
- package/esm2022/constants/line.mjs +2 -1
- package/esm2022/engines/basic-shapes/comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/ellipse.mjs +5 -29
- package/esm2022/engines/basic-shapes/parallelogram.mjs +3 -2
- package/esm2022/engines/basic-shapes/pentagon.mjs +3 -3
- package/esm2022/engines/basic-shapes/polygon.mjs +20 -4
- package/esm2022/engines/basic-shapes/process-arrow.mjs +3 -3
- package/esm2022/engines/basic-shapes/rectangle.mjs +4 -4
- package/esm2022/engines/basic-shapes/round-comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/round-rectangle.mjs +3 -3
- package/esm2022/engines/basic-shapes/star.mjs +3 -3
- package/esm2022/engines/basic-shapes/trapezoid.mjs +3 -2
- package/esm2022/engines/basic-shapes/triangle.mjs +5 -4
- package/esm2022/engines/flowchart/delay.mjs +6 -6
- package/esm2022/engines/flowchart/manual-input.mjs +5 -4
- package/esm2022/engines/flowchart/manual-loop.mjs +3 -2
- package/esm2022/engines/flowchart/merge.mjs +4 -4
- package/esm2022/engines/flowchart/stored-data.mjs +16 -10
- package/esm2022/engines/flowchart/terminal.mjs +37 -27
- package/esm2022/generators/geometry-shape.generator.mjs +3 -3
- package/esm2022/generators/line-active.generator.mjs +52 -68
- package/esm2022/generators/line.generator.mjs +2 -2
- package/esm2022/geometry.component.mjs +4 -4
- package/esm2022/interfaces/geometry.mjs +1 -1
- package/esm2022/interfaces/line.mjs +2 -2
- package/esm2022/line.component.mjs +39 -9
- package/esm2022/plugins/with-draw-fragment.mjs +3 -3
- package/esm2022/plugins/with-draw-hotkey.mjs +6 -6
- package/esm2022/plugins/with-draw-resize.mjs +149 -0
- package/esm2022/plugins/with-draw.mjs +14 -8
- package/esm2022/plugins/with-geometry-create.mjs +10 -10
- package/esm2022/plugins/with-geometry-resize.mjs +27 -74
- package/esm2022/plugins/with-line-auto-complete.mjs +17 -5
- package/esm2022/plugins/with-line-bound-reaction.mjs +6 -5
- package/esm2022/plugins/with-line-create.mjs +2 -2
- package/esm2022/plugins/with-line-resize.mjs +105 -19
- package/esm2022/plugins/with-line-text-move.mjs +5 -4
- package/esm2022/plugins/with-line-text.mjs +7 -5
- package/esm2022/transforms/geometry.mjs +4 -4
- package/esm2022/transforms/line.mjs +6 -8
- package/esm2022/utils/clipboard.mjs +2 -2
- package/esm2022/utils/geometry.mjs +16 -33
- package/esm2022/utils/hit.mjs +18 -10
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/line/elbow.mjs +101 -0
- package/esm2022/utils/line/index.mjs +6 -0
- package/esm2022/utils/line/line-arrow.mjs +123 -0
- package/esm2022/utils/line/line-basic.mjs +258 -0
- package/esm2022/utils/line/line-common.mjs +111 -0
- package/esm2022/utils/line/line-resize.mjs +313 -0
- package/esm2022/utils/polygon.mjs +30 -0
- package/esm2022/utils/position/geometry.mjs +5 -6
- package/esm2022/utils/position/line.mjs +38 -15
- package/esm2022/utils/resize-align-reaction.mjs +316 -0
- package/esm2022/utils/resize-align.mjs +37 -0
- package/fesm2022/plait-draw.mjs +2108 -1143
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-active.generator.d.ts +4 -2
- package/interfaces/geometry.d.ts +1 -0
- package/interfaces/line.d.ts +4 -0
- package/package.json +1 -1
- package/plugins/with-draw-resize.d.ts +13 -0
- package/utils/geometry.d.ts +1 -3
- package/utils/hit.d.ts +3 -1
- package/utils/index.d.ts +1 -1
- package/utils/line/elbow.d.ts +19 -0
- package/utils/line/index.d.ts +5 -0
- package/utils/{line-arrow.d.ts → line/line-arrow.d.ts} +1 -1
- package/utils/line/line-basic.d.ts +13 -0
- package/utils/line/line-common.d.ts +35 -0
- package/utils/line/line-resize.d.ts +23 -0
- package/utils/polygon.d.ts +4 -0
- package/utils/position/geometry.d.ts +2 -3
- package/utils/position/line.d.ts +4 -2
- package/utils/resize-align-reaction.d.ts +42 -0
- package/utils/resize-align.d.ts +8 -0
- package/esm2022/utils/line-arrow.mjs +0 -123
- package/esm2022/utils/line.mjs +0 -392
- package/utils/line.d.ts +0 -25
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { generateElbowLineRoute, removeDuplicatePoints, simplifyOrthogonalPoints } from '@plait/common';
|
|
2
|
+
import { Point, RectangleClient } from '@plait/core';
|
|
3
|
+
import { LINE_ALIGN_TOLERANCE } from '../../constants/line';
|
|
4
|
+
import { getElbowLineRouteOptions, getLineHandleRefPair } from './line-common';
|
|
5
|
+
export const alignPoints = (basePoint, movingPoint) => {
|
|
6
|
+
const newPoint = [...movingPoint];
|
|
7
|
+
if (Point.isVertical(newPoint, basePoint, LINE_ALIGN_TOLERANCE)) {
|
|
8
|
+
newPoint[0] = basePoint[0];
|
|
9
|
+
}
|
|
10
|
+
if (Point.isHorizontal(newPoint, basePoint, LINE_ALIGN_TOLERANCE)) {
|
|
11
|
+
newPoint[1] = basePoint[1];
|
|
12
|
+
}
|
|
13
|
+
return newPoint;
|
|
14
|
+
};
|
|
15
|
+
export function getResizedPreviousAndNextPoint(nextRenderPoints, sourcePoint, targetPoint, handleIndex) {
|
|
16
|
+
const referencePoint = {
|
|
17
|
+
previous: null,
|
|
18
|
+
next: null
|
|
19
|
+
};
|
|
20
|
+
const startPoint = nextRenderPoints[handleIndex];
|
|
21
|
+
const endPoint = nextRenderPoints[handleIndex + 1];
|
|
22
|
+
const isHorizontal = Point.isHorizontal(startPoint, endPoint);
|
|
23
|
+
const isVertical = Point.isVertical(startPoint, endPoint);
|
|
24
|
+
const previousPoint = nextRenderPoints[handleIndex - 1] ?? nextRenderPoints[0];
|
|
25
|
+
const beforePreviousPoint = nextRenderPoints[handleIndex - 2] ?? sourcePoint;
|
|
26
|
+
if ((isHorizontal && Point.isHorizontal(beforePreviousPoint, previousPoint)) ||
|
|
27
|
+
(isVertical && Point.isVertical(beforePreviousPoint, previousPoint))) {
|
|
28
|
+
referencePoint.previous = previousPoint;
|
|
29
|
+
}
|
|
30
|
+
const nextPoint = nextRenderPoints[handleIndex + 2] ?? nextRenderPoints[nextRenderPoints.length - 1];
|
|
31
|
+
const afterNextPoint = nextRenderPoints[handleIndex + 3] ?? targetPoint;
|
|
32
|
+
if ((isHorizontal && Point.isHorizontal(nextPoint, afterNextPoint)) || (isVertical && Point.isVertical(nextPoint, afterNextPoint))) {
|
|
33
|
+
referencePoint.next = nextPoint;
|
|
34
|
+
}
|
|
35
|
+
return referencePoint;
|
|
36
|
+
}
|
|
37
|
+
export function alignElbowSegment(startKeyPoint, endKeyPoint, resizeState, resizedPreviousAndNextPoint) {
|
|
38
|
+
let newStartPoint = startKeyPoint;
|
|
39
|
+
let newEndPoint = endKeyPoint;
|
|
40
|
+
if (Point.isHorizontal(startKeyPoint, endKeyPoint)) {
|
|
41
|
+
const offsetY = Point.getOffsetY(resizeState.startPoint, resizeState.endPoint);
|
|
42
|
+
let pointY = startKeyPoint[1] + offsetY;
|
|
43
|
+
if (resizedPreviousAndNextPoint.previous && Math.abs(resizedPreviousAndNextPoint.previous[1] - pointY) < LINE_ALIGN_TOLERANCE) {
|
|
44
|
+
pointY = resizedPreviousAndNextPoint.previous[1];
|
|
45
|
+
}
|
|
46
|
+
else if (resizedPreviousAndNextPoint.next && Math.abs(resizedPreviousAndNextPoint.next[1] - pointY) < LINE_ALIGN_TOLERANCE) {
|
|
47
|
+
pointY = resizedPreviousAndNextPoint.next[1];
|
|
48
|
+
}
|
|
49
|
+
newStartPoint = [startKeyPoint[0], pointY];
|
|
50
|
+
newEndPoint = [endKeyPoint[0], pointY];
|
|
51
|
+
}
|
|
52
|
+
if (Point.isVertical(startKeyPoint, endKeyPoint)) {
|
|
53
|
+
const offsetX = Point.getOffsetX(resizeState.startPoint, resizeState.endPoint);
|
|
54
|
+
let pointX = startKeyPoint[0] + offsetX;
|
|
55
|
+
if (resizedPreviousAndNextPoint.previous && Math.abs(resizedPreviousAndNextPoint.previous[0] - pointX) < LINE_ALIGN_TOLERANCE) {
|
|
56
|
+
pointX = resizedPreviousAndNextPoint.previous[0];
|
|
57
|
+
}
|
|
58
|
+
else if (resizedPreviousAndNextPoint.next && Math.abs(resizedPreviousAndNextPoint.next[0] - pointX) < LINE_ALIGN_TOLERANCE) {
|
|
59
|
+
pointX = resizedPreviousAndNextPoint.next[0];
|
|
60
|
+
}
|
|
61
|
+
newStartPoint = [pointX, startKeyPoint[1]];
|
|
62
|
+
newEndPoint = [pointX, endKeyPoint[1]];
|
|
63
|
+
}
|
|
64
|
+
return [newStartPoint, newEndPoint];
|
|
65
|
+
}
|
|
66
|
+
export function getIndexAndDeleteCountByKeyPoint(board, element, dataPoints, nextRenderPoints, handleIndex) {
|
|
67
|
+
let index = null;
|
|
68
|
+
let deleteCount = null;
|
|
69
|
+
const startKeyPoint = nextRenderPoints[handleIndex];
|
|
70
|
+
const endKeyPoint = nextRenderPoints[handleIndex + 1];
|
|
71
|
+
if (!startKeyPoint || !endKeyPoint) {
|
|
72
|
+
return {
|
|
73
|
+
index,
|
|
74
|
+
deleteCount
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const midDataPoints = dataPoints.slice(1, -1);
|
|
78
|
+
const startIndex = midDataPoints.findIndex(item => Point.isEquals(item, startKeyPoint));
|
|
79
|
+
const endIndex = midDataPoints.findIndex(item => Point.isEquals(item, endKeyPoint));
|
|
80
|
+
if (Math.max(startIndex, endIndex) > -1) {
|
|
81
|
+
if (startIndex > -1 && endIndex > -1) {
|
|
82
|
+
return {
|
|
83
|
+
index: startIndex,
|
|
84
|
+
deleteCount: 2
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (startIndex > -1 && endIndex === -1) {
|
|
88
|
+
const isReplace = startIndex < midDataPoints.length - 1 &&
|
|
89
|
+
Point.isAlign([midDataPoints[startIndex], midDataPoints[startIndex + 1], startKeyPoint, endKeyPoint]);
|
|
90
|
+
if (isReplace) {
|
|
91
|
+
return {
|
|
92
|
+
index: startIndex,
|
|
93
|
+
deleteCount: 2
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
index: startIndex,
|
|
98
|
+
deleteCount: 1
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (startIndex === -1 && endIndex > -1) {
|
|
102
|
+
const isReplace = endIndex > 0 && Point.isAlign([midDataPoints[endIndex], midDataPoints[endIndex - 1], startKeyPoint, endKeyPoint]);
|
|
103
|
+
if (isReplace) {
|
|
104
|
+
return {
|
|
105
|
+
index: endIndex - 1,
|
|
106
|
+
deleteCount: 2
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
index: endIndex,
|
|
111
|
+
deleteCount: 1
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
for (let i = 0; i < midDataPoints.length - 1; i++) {
|
|
117
|
+
const currentPoint = midDataPoints[i];
|
|
118
|
+
const nextPoint = midDataPoints[i + 1];
|
|
119
|
+
if (Point.isAlign([currentPoint, nextPoint, startKeyPoint, endKeyPoint])) {
|
|
120
|
+
index = i;
|
|
121
|
+
deleteCount = 2;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
if (Point.isAlign([currentPoint, nextPoint, startKeyPoint])) {
|
|
125
|
+
index = Math.min(i + 1, midDataPoints.length - 1);
|
|
126
|
+
deleteCount = 1;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
if (Point.isAlign([currentPoint, nextPoint, endKeyPoint])) {
|
|
130
|
+
index = Math.max(i - 1, 0);
|
|
131
|
+
deleteCount = 1;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (index === null) {
|
|
137
|
+
deleteCount = 0;
|
|
138
|
+
if (midDataPoints.length > 0) {
|
|
139
|
+
const handleRefPair = getLineHandleRefPair(board, element);
|
|
140
|
+
const params = getElbowLineRouteOptions(board, element, handleRefPair);
|
|
141
|
+
const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params));
|
|
142
|
+
const nextKeyPoints = simplifyOrthogonalPoints(keyPoints.slice(1, keyPoints.length - 1));
|
|
143
|
+
const nextDataPoints = [nextRenderPoints[0], ...midDataPoints, nextRenderPoints[nextRenderPoints.length - 1]];
|
|
144
|
+
const mirrorDataPoints = getMirrorDataPoints(board, nextDataPoints, nextKeyPoints, params);
|
|
145
|
+
for (let i = handleIndex - 1; i >= 0; i--) {
|
|
146
|
+
const previousIndex = mirrorDataPoints.slice(1, -1).findIndex(item => Point.isEquals(item, nextRenderPoints[i]));
|
|
147
|
+
if (previousIndex > -1) {
|
|
148
|
+
index = previousIndex + 1;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (index === null) {
|
|
153
|
+
index = 0;
|
|
154
|
+
// When renderPoints is a straight line and dataPoints are not on the line,
|
|
155
|
+
// the default 'deleteCount' is set to midDataPoints.length.
|
|
156
|
+
if (Point.isAlign(nextRenderPoints)) {
|
|
157
|
+
deleteCount = midDataPoints.length;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
index = 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
index,
|
|
167
|
+
deleteCount
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function getMirrorDataPoints(board, nextDataPoints, nextKeyPoints, params) {
|
|
171
|
+
for (let index = 1; index < nextDataPoints.length - 2; index++) {
|
|
172
|
+
adjustByCustomPointStartIndex(board, index, nextDataPoints, nextKeyPoints, params);
|
|
173
|
+
}
|
|
174
|
+
return nextDataPoints;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* adjust based parallel segment
|
|
178
|
+
*/
|
|
179
|
+
const adjustByCustomPointStartIndex = (board, customPointStartIndex, nextDataPoints, nextKeyPoints, params) => {
|
|
180
|
+
const beforePoint = nextDataPoints[customPointStartIndex - 1];
|
|
181
|
+
const startPoint = nextDataPoints[customPointStartIndex];
|
|
182
|
+
const endPoint = nextDataPoints[customPointStartIndex + 1];
|
|
183
|
+
const afterPoint = nextDataPoints[customPointStartIndex + 2];
|
|
184
|
+
const beforeSegment = [beforePoint, startPoint];
|
|
185
|
+
const afterSegment = [endPoint, afterPoint];
|
|
186
|
+
const isStraightWithBefore = Point.isAlign(beforeSegment);
|
|
187
|
+
const isStraightWithAfter = Point.isAlign(afterSegment);
|
|
188
|
+
let isAdjustStart = false;
|
|
189
|
+
let isAdjustEnd = false;
|
|
190
|
+
if (!isStraightWithBefore || !isStraightWithAfter) {
|
|
191
|
+
const midKeyPointsWithBefore = getMidKeyPoints(nextKeyPoints, beforeSegment[0], beforeSegment[1]);
|
|
192
|
+
const midKeyPointsWithAfter = getMidKeyPoints(nextKeyPoints, afterSegment[0], afterSegment[1]);
|
|
193
|
+
const hasMidKeyPoints = midKeyPointsWithBefore.length > 0 && midKeyPointsWithAfter.length > 0;
|
|
194
|
+
isAdjustStart = !isStraightWithBefore && !hasMidKeyPoints;
|
|
195
|
+
isAdjustEnd = !isStraightWithAfter && !hasMidKeyPoints;
|
|
196
|
+
}
|
|
197
|
+
if (isAdjustStart || isAdjustEnd) {
|
|
198
|
+
const parallelSegment = [startPoint, endPoint];
|
|
199
|
+
const parallelSegments = findOrthogonalParallelSegments(parallelSegment, nextKeyPoints);
|
|
200
|
+
const mirrorSegments = findMirrorSegments(board, parallelSegment, parallelSegments, params.sourceRectangle, params.targetRectangle);
|
|
201
|
+
if (mirrorSegments.length === 1) {
|
|
202
|
+
const mirrorSegment = mirrorSegments[0];
|
|
203
|
+
if (isAdjustStart) {
|
|
204
|
+
nextDataPoints.splice(customPointStartIndex, 1, mirrorSegment[0]);
|
|
205
|
+
}
|
|
206
|
+
if (isAdjustEnd) {
|
|
207
|
+
nextDataPoints.splice(customPointStartIndex + 1, 1, mirrorSegment[1]);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const isHorizontal = Point.isHorizontal(startPoint, endPoint);
|
|
212
|
+
const adjustIndex = isHorizontal ? 0 : 1;
|
|
213
|
+
if (isAdjustStart) {
|
|
214
|
+
const newStartPoint = [startPoint[0], startPoint[1]];
|
|
215
|
+
newStartPoint[adjustIndex] = beforePoint[adjustIndex];
|
|
216
|
+
nextDataPoints.splice(customPointStartIndex, 1, newStartPoint);
|
|
217
|
+
}
|
|
218
|
+
if (isAdjustEnd) {
|
|
219
|
+
const newEndPoint = [endPoint[0], endPoint[1]];
|
|
220
|
+
newEndPoint[adjustIndex] = afterPoint[adjustIndex];
|
|
221
|
+
nextDataPoints.splice(customPointStartIndex + 1, 1, newEndPoint);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
export function isUpdatedHandleIndex(board, element, dataPoints, nextRenderPoints, handleIndex) {
|
|
227
|
+
const { deleteCount } = getIndexAndDeleteCountByKeyPoint(board, element, dataPoints, nextRenderPoints, handleIndex);
|
|
228
|
+
if (deleteCount !== null && deleteCount > 1) {
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
export function getMidKeyPoints(simplifiedNextKeyPoints, startPoint, endPoint) {
|
|
234
|
+
let midElbowPoints = [];
|
|
235
|
+
let startPointIndex = -1;
|
|
236
|
+
let endPointIndex = -1;
|
|
237
|
+
for (let i = 0; i < simplifiedNextKeyPoints.length; i++) {
|
|
238
|
+
if (Point.isAlign([simplifiedNextKeyPoints[i], startPoint])) {
|
|
239
|
+
startPointIndex = i;
|
|
240
|
+
}
|
|
241
|
+
if (startPointIndex > -1 && Point.isAlign([simplifiedNextKeyPoints[i], endPoint])) {
|
|
242
|
+
endPointIndex = i;
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (startPointIndex > -1 && endPointIndex > -1) {
|
|
247
|
+
midElbowPoints = simplifiedNextKeyPoints.slice(startPointIndex, endPointIndex + 1);
|
|
248
|
+
}
|
|
249
|
+
return midElbowPoints;
|
|
250
|
+
}
|
|
251
|
+
function findOrthogonalParallelSegments(segment, keyPoints) {
|
|
252
|
+
const isHorizontalSegment = Point.isHorizontal(segment[0], segment[1]);
|
|
253
|
+
const parallelSegments = [];
|
|
254
|
+
for (let i = 0; i < keyPoints.length - 1; i++) {
|
|
255
|
+
const current = keyPoints[i];
|
|
256
|
+
const next = keyPoints[i + 1];
|
|
257
|
+
const isHorizontal = Point.isHorizontal(current, next, 0.1);
|
|
258
|
+
if (isHorizontalSegment && isHorizontal) {
|
|
259
|
+
parallelSegments.push([current, next]);
|
|
260
|
+
}
|
|
261
|
+
if (!isHorizontalSegment && !isHorizontal) {
|
|
262
|
+
parallelSegments.push([current, next]);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return parallelSegments;
|
|
266
|
+
}
|
|
267
|
+
function findMirrorSegments(board, segment, parallelSegments, sourceRectangle, targetRectangle) {
|
|
268
|
+
const mirrorSegments = [];
|
|
269
|
+
for (let index = 0; index < parallelSegments.length; index++) {
|
|
270
|
+
const parallelPath = parallelSegments[index];
|
|
271
|
+
const startPoint = [segment[0][0], segment[0][1]];
|
|
272
|
+
const endPoint = [segment[1][0], segment[1][1]];
|
|
273
|
+
const isHorizontal = Point.isHorizontal(startPoint, endPoint);
|
|
274
|
+
const adjustDataIndex = isHorizontal ? 0 : 1;
|
|
275
|
+
startPoint[adjustDataIndex] = parallelPath[0][adjustDataIndex];
|
|
276
|
+
endPoint[adjustDataIndex] = parallelPath[1][adjustDataIndex];
|
|
277
|
+
const fakeRectangle = RectangleClient.getRectangleByPoints([startPoint, endPoint, ...parallelPath]);
|
|
278
|
+
const isValid = !RectangleClient.isHit(fakeRectangle, sourceRectangle) && !RectangleClient.isHit(fakeRectangle, targetRectangle);
|
|
279
|
+
if (isValid) {
|
|
280
|
+
mirrorSegments.push([startPoint, endPoint]);
|
|
281
|
+
// const fakeRectangleG = PlaitBoard.getRoughSVG(board).rectangle(
|
|
282
|
+
// fakeRectangle.x,
|
|
283
|
+
// fakeRectangle.y,
|
|
284
|
+
// fakeRectangle.width,
|
|
285
|
+
// fakeRectangle.height,
|
|
286
|
+
// { stroke: 'blue' }
|
|
287
|
+
// );
|
|
288
|
+
// PlaitBoard.getElementActiveHost(board).append(fakeRectangleG);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return mirrorSegments;
|
|
292
|
+
}
|
|
293
|
+
export const hasIllegalElbowPoint = (midDataPoints) => {
|
|
294
|
+
if (midDataPoints.length === 1) {
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
return midDataPoints.some((item, index) => {
|
|
298
|
+
const beforePoint = midDataPoints[index - 1];
|
|
299
|
+
const afterPoint = midDataPoints[index + 1];
|
|
300
|
+
const beforeSegment = beforePoint && [beforePoint, item];
|
|
301
|
+
const afterSegment = afterPoint && [item, afterPoint];
|
|
302
|
+
const isStraightWithBefore = beforeSegment && Point.isAlign(beforeSegment);
|
|
303
|
+
const isStraightWithAfter = afterSegment && Point.isAlign(afterSegment);
|
|
304
|
+
if (index === 0) {
|
|
305
|
+
return !isStraightWithAfter;
|
|
306
|
+
}
|
|
307
|
+
if (index === midDataPoints.length - 1) {
|
|
308
|
+
return !isStraightWithBefore;
|
|
309
|
+
}
|
|
310
|
+
return !isStraightWithBefore && !isStraightWithAfter;
|
|
311
|
+
});
|
|
312
|
+
};
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQWMsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1FBQzdELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDOUI7SUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1FBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDOUI7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsOEJBQThCLENBQUMsZ0JBQXlCLEVBQUUsV0FBa0IsRUFBRSxXQUFrQixFQUFFLFdBQW1CO0lBQ2pJLE1BQU0sY0FBYyxHQUFtRDtRQUNuRSxRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxJQUFJO0tBQ2IsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDO0lBQzdFLElBQ0ksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN4RSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQ3RFO1FBQ0UsY0FBYyxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7S0FDM0M7SUFFRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDeEUsSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUU7UUFDaEksY0FBYyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7S0FDbkM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixhQUFvQixFQUNwQixXQUFrQixFQUNsQixXQUF3QixFQUN4QiwyQkFBMkU7SUFFM0UsSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUM5QixJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1FBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0UsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN4QyxJQUFJLDJCQUEyQixDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsRUFBRTtZQUMzSCxNQUFNLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsb0JBQW9CLEVBQUU7WUFDMUgsTUFBTSxHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUNELGFBQWEsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxXQUFXLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDMUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1FBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0UsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN4QyxJQUFJLDJCQUEyQixDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsRUFBRTtZQUMzSCxNQUFNLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsb0JBQW9CLEVBQUU7WUFDMUgsTUFBTSxHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUNELGFBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0NBQWdDLENBQzVDLEtBQWlCLEVBQ2pCLE9BQWtCLEVBQ2xCLFVBQW1CLEVBQ25CLGdCQUF5QixFQUN6QixXQUFtQjtJQUVuQixJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDO0lBQ2hDLElBQUksV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFdEMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDaEMsT0FBTztZQUNILEtBQUs7WUFDTCxXQUFXO1NBQ2QsQ0FBQztLQUNMO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4RixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUVwRixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3JDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNsQyxPQUFPO2dCQUNILEtBQUssRUFBRSxVQUFVO2dCQUNqQixXQUFXLEVBQUUsQ0FBQzthQUNqQixDQUFDO1NBQ0w7UUFDRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxTQUFTLEdBQ1gsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzFHLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU87b0JBQ0gsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDO2FBQ0w7WUFDRCxPQUFPO2dCQUNILEtBQUssRUFBRSxVQUFVO2dCQUNqQixXQUFXLEVBQUUsQ0FBQzthQUNqQixDQUFDO1NBQ0w7UUFDRCxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxTQUFTLEdBQ1gsUUFBUSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEgsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsT0FBTztvQkFDSCxLQUFLLEVBQUUsUUFBUSxHQUFHLENBQUM7b0JBQ25CLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDO2FBQ0w7WUFDRCxPQUFPO2dCQUNILEtBQUssRUFBRSxRQUFRO2dCQUNmLFdBQVcsRUFBRSxDQUFDO2FBQ2pCLENBQUM7U0FDTDtLQUNKO1NBQU07UUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRTtnQkFDdEUsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNO2FBQ1Q7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pELEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFBTTthQUNUO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFO2dCQUN2RCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNO2FBQ1Q7U0FDSjtLQUNKO0lBQ0QsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ2hCLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQixNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN2RSxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RixNQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0YsS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNwQixLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztvQkFDMUIsTUFBTTtpQkFDVDthQUNKO1lBQ0QsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNoQixLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLDJFQUEyRTtnQkFDM0UsNERBQTREO2dCQUM1RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtvQkFDakMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7aUJBQ3RDO2FBQ0o7U0FDSjthQUFNO1lBQ0gsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNiO0tBQ0o7SUFFRCxPQUFPO1FBQ0gsS0FBSztRQUNMLFdBQVc7S0FDZCxDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFpQixFQUFFLGNBQXVCLEVBQUUsYUFBc0IsRUFBRSxNQUE2QjtJQUNqSSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDNUQsNkJBQTZCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3RGO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSw2QkFBNkIsR0FBRyxDQUNsQyxLQUFpQixFQUNqQixxQkFBNkIsRUFDN0IsY0FBdUIsRUFDdkIsYUFBc0IsRUFDdEIsTUFBNkIsRUFDL0IsRUFBRTtJQUNBLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdELE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxRCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzFCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtRQUMvQyxNQUFNLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlGLGFBQWEsR0FBRyxDQUFDLG9CQUFvQixJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzFELFdBQVcsR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxhQUFhLElBQUksV0FBVyxFQUFFO1FBQzlCLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBbUIsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLDhCQUE4QixDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN4RixNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BJLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksYUFBYSxFQUFFO2dCQUNmLGNBQWMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1lBQ0QsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pFO1NBQ0o7YUFBTTtZQUNILE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxhQUFhLEVBQUU7Z0JBQ2YsTUFBTSxhQUFhLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7Z0JBQzlELGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RELGNBQWMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25ELGNBQWMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNwRTtTQUNKO0tBQ0o7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLEtBQWlCLEVBQ2pCLE9BQWtCLEVBQ2xCLFVBQW1CLEVBQ25CLGdCQUF5QixFQUN6QixXQUFtQjtJQUVuQixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDcEgsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLHVCQUFnQyxFQUFFLFVBQWlCLEVBQUUsUUFBZTtJQUNoRyxJQUFJLGNBQWMsR0FBWSxFQUFFLENBQUM7SUFDakMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3pELGVBQWUsR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFDRCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUMvRSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLE1BQU07U0FDVDtLQUNKO0lBQ0QsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQzVDLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0RjtJQUNELE9BQU8sY0FBYyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUFDLE9BQXVCLEVBQUUsU0FBa0I7SUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7SUFFOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzNDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RCxJQUFJLG1CQUFtQixJQUFJLFlBQVksRUFBRTtZQUNyQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN2QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUMxQztLQUNKO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDdkIsS0FBaUIsRUFDakIsT0FBdUIsRUFDdkIsZ0JBQWtDLEVBQ2xDLGVBQWdDLEVBQ2hDLGVBQWdDO0lBRWhDLE1BQU0sY0FBYyxHQUFxQixFQUFFLENBQUM7SUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVUsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVUsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3RCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwRyxNQUFNLE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDakksSUFBSSxPQUFPLEVBQUU7WUFDVCxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsa0VBQWtFO1lBQ2xFLHVCQUF1QjtZQUN2Qix1QkFBdUI7WUFDdkIsMkJBQTJCO1lBQzNCLDRCQUE0QjtZQUM1Qix5QkFBeUI7WUFDekIsS0FBSztZQUNMLGlFQUFpRTtTQUNwRTtLQUNKO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsYUFBc0IsRUFBVyxFQUFFO0lBQ3BFLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDNUIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUN0QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxhQUFhLEdBQUcsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLFVBQVUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLG9CQUFvQixHQUFHLGFBQWEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2IsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1NBQy9CO1FBQ0QsSUFBSSxLQUFLLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxDQUFDLG9CQUFvQixJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIFJlc2l6ZVN0YXRlLCBnZW5lcmF0ZUVsYm93TGluZVJvdXRlLCByZW1vdmVEdXBsaWNhdGVQb2ludHMsIHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgZHJhd0NpcmNsZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IExJTkVfQUxJR05fVE9MRVJBTkNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2xpbmUnO1xuaW1wb3J0IHsgZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zLCBnZXRMaW5lSGFuZGxlUmVmUGFpciB9IGZyb20gJy4vbGluZS1jb21tb24nO1xuaW1wb3J0IHsgUGxhaXRMaW5lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjb25zdCBhbGlnblBvaW50cyA9IChiYXNlUG9pbnQ6IFBvaW50LCBtb3ZpbmdQb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBuZXdQb2ludDogUG9pbnQgPSBbLi4ubW92aW5nUG9pbnRdO1xuICAgIGlmIChQb2ludC5pc1ZlcnRpY2FsKG5ld1BvaW50LCBiYXNlUG9pbnQsIExJTkVfQUxJR05fVE9MRVJBTkNFKSkge1xuICAgICAgICBuZXdQb2ludFswXSA9IGJhc2VQb2ludFswXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzSG9yaXpvbnRhbChuZXdQb2ludCwgYmFzZVBvaW50LCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkpIHtcbiAgICAgICAgbmV3UG9pbnRbMV0gPSBiYXNlUG9pbnRbMV07XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQobmV4dFJlbmRlclBvaW50czogUG9pbnRbXSwgc291cmNlUG9pbnQ6IFBvaW50LCB0YXJnZXRQb2ludDogUG9pbnQsIGhhbmRsZUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZWZlcmVuY2VQb2ludDogeyBwcmV2aW91czogUG9pbnQgfCBudWxsOyBuZXh0OiBQb2ludCB8IG51bGwgfSA9IHtcbiAgICAgICAgcHJldmlvdXM6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IFBvaW50LmlzVmVydGljYWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIGNvbnN0IHByZXZpb3VzUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4IC0gMV0gPz8gbmV4dFJlbmRlclBvaW50c1swXTtcbiAgICBjb25zdCBiZWZvcmVQcmV2aW91c1BvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCAtIDJdID8/IHNvdXJjZVBvaW50O1xuICAgIGlmIChcbiAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiBQb2ludC5pc0hvcml6b250YWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpIHx8XG4gICAgICAgIChpc1ZlcnRpY2FsICYmIFBvaW50LmlzVmVydGljYWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpXG4gICAgKSB7XG4gICAgICAgIHJlZmVyZW5jZVBvaW50LnByZXZpb3VzID0gcHJldmlvdXNQb2ludDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMl0gPz8gbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFmdGVyTmV4dFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDNdID8/IHRhcmdldFBvaW50O1xuICAgIGlmICgoaXNIb3Jpem9udGFsICYmIFBvaW50LmlzSG9yaXpvbnRhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkgfHwgKGlzVmVydGljYWwgJiYgUG9pbnQuaXNWZXJ0aWNhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkpIHtcbiAgICAgICAgcmVmZXJlbmNlUG9pbnQubmV4dCA9IG5leHRQb2ludDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZmVyZW5jZVBvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25FbGJvd1NlZ21lbnQoXG4gICAgc3RhcnRLZXlQb2ludDogUG9pbnQsXG4gICAgZW5kS2V5UG9pbnQ6IFBvaW50LFxuICAgIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZSxcbiAgICByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQ6IHsgcHJldmlvdXM6IFBvaW50IHwgbnVsbDsgbmV4dDogUG9pbnQgfCBudWxsIH1cbikge1xuICAgIGxldCBuZXdTdGFydFBvaW50ID0gc3RhcnRLZXlQb2ludDtcbiAgICBsZXQgbmV3RW5kUG9pbnQgPSBlbmRLZXlQb2ludDtcbiAgICBpZiAoUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50KSkge1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gUG9pbnQuZ2V0T2Zmc2V0WShyZXNpemVTdGF0ZS5zdGFydFBvaW50LCByZXNpemVTdGF0ZS5lbmRQb2ludCk7XG4gICAgICAgIGxldCBwb2ludFkgPSBzdGFydEtleVBvaW50WzFdICsgb2Zmc2V0WTtcbiAgICAgICAgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91cyAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMV0gLSBwb2ludFkpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WSA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dCAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFsxXSAtIHBvaW50WSkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRZID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMV07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhcnRQb2ludCA9IFtzdGFydEtleVBvaW50WzBdLCBwb2ludFldO1xuICAgICAgICBuZXdFbmRQb2ludCA9IFtlbmRLZXlQb2ludFswXSwgcG9pbnRZXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzVmVydGljYWwoc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBQb2ludC5nZXRPZmZzZXRYKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgbGV0IHBvaW50WCA9IHN0YXJ0S2V5UG9pbnRbMF0gKyBvZmZzZXRYO1xuICAgICAgICBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1swXSAtIHBvaW50WCkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRYID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0ICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzBdIC0gcG9pbnRYKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFggPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFswXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFBvaW50ID0gW3BvaW50WCwgc3RhcnRLZXlQb2ludFsxXV07XG4gICAgICAgIG5ld0VuZFBvaW50ID0gW3BvaW50WCwgZW5kS2V5UG9pbnRbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gW25ld1N0YXJ0UG9pbnQsIG5ld0VuZFBvaW50XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QW5kRGVsZXRlQ291bnRCeUtleVBvaW50KFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnQ6IFBsYWl0TGluZSxcbiAgICBkYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sXG4gICAgaGFuZGxlSW5kZXg6IG51bWJlclxuKSB7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZGVsZXRlQ291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcnRLZXlQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZEtleVBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGlmICghc3RhcnRLZXlQb2ludCB8fCAhZW5kS2V5UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZGVsZXRlQ291bnRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbWlkRGF0YVBvaW50cyA9IGRhdGFQb2ludHMuc2xpY2UoMSwgLTEpO1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBtaWREYXRhUG9pbnRzLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIHN0YXJ0S2V5UG9pbnQpKTtcbiAgICBjb25zdCBlbmRJbmRleCA9IG1pZERhdGFQb2ludHMuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgZW5kS2V5UG9pbnQpKTtcblxuICAgIGlmIChNYXRoLm1heChzdGFydEluZGV4LCBlbmRJbmRleCkgPiAtMSkge1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiAtMSAmJiBlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVwbGFjZSA9XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA8IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgIFBvaW50LmlzQWxpZ24oW21pZERhdGFQb2ludHNbc3RhcnRJbmRleF0sIG1pZERhdGFQb2ludHNbc3RhcnRJbmRleCArIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSAmJiBlbmRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpc1JlcGxhY2UgPVxuICAgICAgICAgICAgICAgIGVuZEluZGV4ID4gMCAmJiBQb2ludC5pc0FsaWduKFttaWREYXRhUG9pbnRzW2VuZEluZGV4XSwgbWlkRGF0YVBvaW50c1tlbmRJbmRleCAtIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBlbmRJbmRleCAtIDEsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVuZEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gbWlkRGF0YVBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb2ludCA9IG1pZERhdGFQb2ludHNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgc3RhcnRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1pbihpICsgMSwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIGVuZEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KGkgLSAxLCAwKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgaWYgKG1pZERhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucyhib2FyZCwgZWxlbWVudCwgaGFuZGxlUmVmUGFpcik7XG4gICAgICAgICAgICBjb25zdCBrZXlQb2ludHMgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMoZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZShwYXJhbXMpKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRLZXlQb2ludHMgPSBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMoa2V5UG9pbnRzLnNsaWNlKDEsIGtleVBvaW50cy5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0RGF0YVBvaW50cyA9IFtuZXh0UmVuZGVyUG9pbnRzWzBdLCAuLi5taWREYXRhUG9pbnRzLCBuZXh0UmVuZGVyUG9pbnRzW25leHRSZW5kZXJQb2ludHMubGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgY29uc3QgbWlycm9yRGF0YVBvaW50cyA9IGdldE1pcnJvckRhdGFQb2ludHMoYm9hcmQsIG5leHREYXRhUG9pbnRzLCBuZXh0S2V5UG9pbnRzLCBwYXJhbXMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGhhbmRsZUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gbWlycm9yRGF0YVBvaW50cy5zbGljZSgxLCAtMSkuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgbmV4dFJlbmRlclBvaW50c1tpXSkpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwcmV2aW91c0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gcmVuZGVyUG9pbnRzIGlzIGEgc3RyYWlnaHQgbGluZSBhbmQgZGF0YVBvaW50cyBhcmUgbm90IG9uIHRoZSBsaW5lLFxuICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0ICdkZWxldGVDb3VudCcgaXMgc2V0IHRvIG1pZERhdGFQb2ludHMubGVuZ3RoLlxuICAgICAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKG5leHRSZW5kZXJQb2ludHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gbWlkRGF0YVBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIGRlbGV0ZUNvdW50XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pcnJvckRhdGFQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIG5leHREYXRhUG9pbnRzOiBQb2ludFtdLCBuZXh0S2V5UG9pbnRzOiBQb2ludFtdLCBwYXJhbXM6IEVsYm93TGluZVJvdXRlT3B0aW9ucykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBuZXh0RGF0YVBvaW50cy5sZW5ndGggLSAyOyBpbmRleCsrKSB7XG4gICAgICAgIGFkanVzdEJ5Q3VzdG9tUG9pbnRTdGFydEluZGV4KGJvYXJkLCBpbmRleCwgbmV4dERhdGFQb2ludHMsIG5leHRLZXlQb2ludHMsIHBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0RGF0YVBvaW50cztcbn1cblxuLyoqXG4gKiBhZGp1c3QgYmFzZWQgcGFyYWxsZWwgc2VnbWVudFxuICovXG5jb25zdCBhZGp1c3RCeUN1c3RvbVBvaW50U3RhcnRJbmRleCA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBjdXN0b21Qb2ludFN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBuZXh0RGF0YVBvaW50czogUG9pbnRbXSxcbiAgICBuZXh0S2V5UG9pbnRzOiBQb2ludFtdLFxuICAgIHBhcmFtczogRWxib3dMaW5lUm91dGVPcHRpb25zXG4pID0+IHtcbiAgICBjb25zdCBiZWZvcmVQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleCAtIDFdO1xuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXhdO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMV07XG4gICAgY29uc3QgYWZ0ZXJQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleCArIDJdO1xuICAgIGNvbnN0IGJlZm9yZVNlZ21lbnQgPSBbYmVmb3JlUG9pbnQsIHN0YXJ0UG9pbnRdO1xuICAgIGNvbnN0IGFmdGVyU2VnbWVudCA9IFtlbmRQb2ludCwgYWZ0ZXJQb2ludF07XG4gICAgY29uc3QgaXNTdHJhaWdodFdpdGhCZWZvcmUgPSBQb2ludC5pc0FsaWduKGJlZm9yZVNlZ21lbnQpO1xuICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQWZ0ZXIgPSBQb2ludC5pc0FsaWduKGFmdGVyU2VnbWVudCk7XG4gICAgbGV0IGlzQWRqdXN0U3RhcnQgPSBmYWxzZTtcbiAgICBsZXQgaXNBZGp1c3RFbmQgPSBmYWxzZTtcbiAgICBpZiAoIWlzU3RyYWlnaHRXaXRoQmVmb3JlIHx8ICFpc1N0cmFpZ2h0V2l0aEFmdGVyKSB7XG4gICAgICAgIGNvbnN0IG1pZEtleVBvaW50c1dpdGhCZWZvcmUgPSBnZXRNaWRLZXlQb2ludHMobmV4dEtleVBvaW50cywgYmVmb3JlU2VnbWVudFswXSwgYmVmb3JlU2VnbWVudFsxXSk7XG4gICAgICAgIGNvbnN0IG1pZEtleVBvaW50c1dpdGhBZnRlciA9IGdldE1pZEtleVBvaW50cyhuZXh0S2V5UG9pbnRzLCBhZnRlclNlZ21lbnRbMF0sIGFmdGVyU2VnbWVudFsxXSk7XG4gICAgICAgIGNvbnN0IGhhc01pZEtleVBvaW50cyA9IG1pZEtleVBvaW50c1dpdGhCZWZvcmUubGVuZ3RoID4gMCAmJiBtaWRLZXlQb2ludHNXaXRoQWZ0ZXIubGVuZ3RoID4gMDtcbiAgICAgICAgaXNBZGp1c3RTdGFydCA9ICFpc1N0cmFpZ2h0V2l0aEJlZm9yZSAmJiAhaGFzTWlkS2V5UG9pbnRzO1xuICAgICAgICBpc0FkanVzdEVuZCA9ICFpc1N0cmFpZ2h0V2l0aEFmdGVyICYmICFoYXNNaWRLZXlQb2ludHM7XG4gICAgfVxuICAgIGlmIChpc0FkanVzdFN0YXJ0IHx8IGlzQWRqdXN0RW5kKSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsU2VnbWVudCA9IFtzdGFydFBvaW50LCBlbmRQb2ludF0gYXMgW1BvaW50LCBQb2ludF07XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsU2VnbWVudHMgPSBmaW5kT3J0aG9nb25hbFBhcmFsbGVsU2VnbWVudHMocGFyYWxsZWxTZWdtZW50LCBuZXh0S2V5UG9pbnRzKTtcbiAgICAgICAgY29uc3QgbWlycm9yU2VnbWVudHMgPSBmaW5kTWlycm9yU2VnbWVudHMoYm9hcmQsIHBhcmFsbGVsU2VnbWVudCwgcGFyYWxsZWxTZWdtZW50cywgcGFyYW1zLnNvdXJjZVJlY3RhbmdsZSwgcGFyYW1zLnRhcmdldFJlY3RhbmdsZSk7XG4gICAgICAgIGlmIChtaXJyb3JTZWdtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pcnJvclNlZ21lbnQgPSBtaXJyb3JTZWdtZW50c1swXTtcbiAgICAgICAgICAgIGlmIChpc0FkanVzdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCwgMSwgbWlycm9yU2VnbWVudFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMSwgMSwgbWlycm9yU2VnbWVudFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgYWRqdXN0SW5kZXggPSBpc0hvcml6b250YWwgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChpc0FkanVzdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhcnRQb2ludCA9IFtzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdXSBhcyBQb2ludDtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFBvaW50W2FkanVzdEluZGV4XSA9IGJlZm9yZVBvaW50W2FkanVzdEluZGV4XTtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4LCAxLCBuZXdTdGFydFBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FkanVzdEVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0VuZFBvaW50ID0gW2VuZFBvaW50WzBdLCBlbmRQb2ludFsxXV0gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgbmV3RW5kUG9pbnRbYWRqdXN0SW5kZXhdID0gYWZ0ZXJQb2ludFthZGp1c3RJbmRleF07XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCArIDEsIDEsIG5ld0VuZFBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VwZGF0ZWRIYW5kbGVJbmRleChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBlbGVtZW50OiBQbGFpdExpbmUsXG4gICAgZGF0YVBvaW50czogUG9pbnRbXSxcbiAgICBuZXh0UmVuZGVyUG9pbnRzOiBQb2ludFtdLFxuICAgIGhhbmRsZUluZGV4OiBudW1iZXJcbikge1xuICAgIGNvbnN0IHsgZGVsZXRlQ291bnQgfSA9IGdldEluZGV4QW5kRGVsZXRlQ291bnRCeUtleVBvaW50KGJvYXJkLCBlbGVtZW50LCBkYXRhUG9pbnRzLCBuZXh0UmVuZGVyUG9pbnRzLCBoYW5kbGVJbmRleCk7XG4gICAgaWYgKGRlbGV0ZUNvdW50ICE9PSBudWxsICYmIGRlbGV0ZUNvdW50ID4gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlkS2V5UG9pbnRzKHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzOiBQb2ludFtdLCBzdGFydFBvaW50OiBQb2ludCwgZW5kUG9pbnQ6IFBvaW50KSB7XG4gICAgbGV0IG1pZEVsYm93UG9pbnRzOiBQb2ludFtdID0gW107XG4gICAgbGV0IHN0YXJ0UG9pbnRJbmRleCA9IC0xO1xuICAgIGxldCBlbmRQb2ludEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaW1wbGlmaWVkTmV4dEtleVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbc2ltcGxpZmllZE5leHRLZXlQb2ludHNbaV0sIHN0YXJ0UG9pbnRdKSkge1xuICAgICAgICAgICAgc3RhcnRQb2ludEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRQb2ludEluZGV4ID4gLTEgJiYgUG9pbnQuaXNBbGlnbihbc2ltcGxpZmllZE5leHRLZXlQb2ludHNbaV0sIGVuZFBvaW50XSkpIHtcbiAgICAgICAgICAgIGVuZFBvaW50SW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0UG9pbnRJbmRleCA+IC0xICYmIGVuZFBvaW50SW5kZXggPiAtMSkge1xuICAgICAgICBtaWRFbGJvd1BvaW50cyA9IHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzLnNsaWNlKHN0YXJ0UG9pbnRJbmRleCwgZW5kUG9pbnRJbmRleCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbWlkRWxib3dQb2ludHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRPcnRob2dvbmFsUGFyYWxsZWxTZWdtZW50cyhzZWdtZW50OiBbUG9pbnQsIFBvaW50XSwga2V5UG9pbnRzOiBQb2ludFtdKTogW1BvaW50LCBQb2ludF1bXSB7XG4gICAgY29uc3QgaXNIb3Jpem9udGFsU2VnbWVudCA9IFBvaW50LmlzSG9yaXpvbnRhbChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleVBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGtleVBvaW50c1tpXTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGtleVBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChjdXJyZW50LCBuZXh0LCAwLjEpO1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsU2VnbWVudCAmJiBpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHBhcmFsbGVsU2VnbWVudHMucHVzaChbY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNIb3Jpem9udGFsU2VnbWVudCAmJiAhaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBwYXJhbGxlbFNlZ21lbnRzLnB1c2goW2N1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbGxlbFNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBmaW5kTWlycm9yU2VnbWVudHMoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgc2VnbWVudDogW1BvaW50LCBQb2ludF0sXG4gICAgcGFyYWxsZWxTZWdtZW50czogW1BvaW50LCBQb2ludF1bXSxcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCxcbiAgICB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudFxuKSB7XG4gICAgY29uc3QgbWlycm9yU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYWxsZWxTZWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxQYXRoID0gcGFyYWxsZWxTZWdtZW50c1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBbc2VnbWVudFswXVswXSwgc2VnbWVudFswXVsxXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gW3NlZ21lbnRbMV1bMF0sIHNlZ21lbnRbMV1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgICAgICBjb25zdCBhZGp1c3REYXRhSW5kZXggPSBpc0hvcml6b250YWwgPyAwIDogMTtcbiAgICAgICAgc3RhcnRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzBdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGVuZFBvaW50W2FkanVzdERhdGFJbmRleF0gPSBwYXJhbGxlbFBhdGhbMV1bYWRqdXN0RGF0YUluZGV4XTtcbiAgICAgICAgY29uc3QgZmFrZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbc3RhcnRQb2ludCwgZW5kUG9pbnQsIC4uLnBhcmFsbGVsUGF0aF0pO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gIVJlY3RhbmdsZUNsaWVudC5pc0hpdChmYWtlUmVjdGFuZ2xlLCBzb3VyY2VSZWN0YW5nbGUpICYmICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgIG1pcnJvclNlZ21lbnRzLnB1c2goW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSk7XG4gICAgICAgICAgICAvLyBjb25zdCBmYWtlUmVjdGFuZ2xlRyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLnJlY3RhbmdsZShcbiAgICAgICAgICAgIC8vICAgICBmYWtlUmVjdGFuZ2xlLngsXG4gICAgICAgICAgICAvLyAgICAgZmFrZVJlY3RhbmdsZS55LFxuICAgICAgICAgICAgLy8gICAgIGZha2VSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAvLyAgICAgZmFrZVJlY3RhbmdsZS5oZWlnaHQsXG4gICAgICAgICAgICAvLyAgICAgeyBzdHJva2U6ICdibHVlJyB9XG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgLy8gUGxhaXRCb2FyZC5nZXRFbGVtZW50QWN0aXZlSG9zdChib2FyZCkuYXBwZW5kKGZha2VSZWN0YW5nbGVHKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWlycm9yU2VnbWVudHM7XG59XG5cbmV4cG9ydCBjb25zdCBoYXNJbGxlZ2FsRWxib3dQb2ludCA9IChtaWREYXRhUG9pbnRzOiBQb2ludFtdKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKG1pZERhdGFQb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbWlkRGF0YVBvaW50cy5zb21lKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IG1pZERhdGFQb2ludHNbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgYWZ0ZXJQb2ludCA9IG1pZERhdGFQb2ludHNbaW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgYmVmb3JlU2VnbWVudCA9IGJlZm9yZVBvaW50ICYmIFtiZWZvcmVQb2ludCwgaXRlbV07XG4gICAgICAgIGNvbnN0IGFmdGVyU2VnbWVudCA9IGFmdGVyUG9pbnQgJiYgW2l0ZW0sIGFmdGVyUG9pbnRdO1xuICAgICAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEJlZm9yZSA9IGJlZm9yZVNlZ21lbnQgJiYgUG9pbnQuaXNBbGlnbihiZWZvcmVTZWdtZW50KTtcbiAgICAgICAgY29uc3QgaXNTdHJhaWdodFdpdGhBZnRlciA9IGFmdGVyU2VnbWVudCAmJiBQb2ludC5pc0FsaWduKGFmdGVyU2VnbWVudCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQmVmb3JlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhCZWZvcmUgJiYgIWlzU3RyYWlnaHRXaXRoQWZ0ZXI7XG4gICAgfSk7XG59O1xuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getCrossingPointsBetweenPointAndSegment, isPointOnSegment } from '@plait/common';
|
|
2
|
+
export const getCenterPointsOnPolygon = (points) => {
|
|
3
|
+
const centerPoints = [];
|
|
4
|
+
for (let i = 0; i < points.length; i++) {
|
|
5
|
+
let j = i == points.length - 1 ? 0 : i + 1;
|
|
6
|
+
centerPoints.push([(points[i][0] + points[j][0]) / 2, (points[i][1] + points[j][1]) / 2]);
|
|
7
|
+
}
|
|
8
|
+
return centerPoints;
|
|
9
|
+
};
|
|
10
|
+
export const getCrossingPointBetweenPointAndPolygon = (corners, point) => {
|
|
11
|
+
const result = [];
|
|
12
|
+
for (let index = 1; index <= corners.length; index++) {
|
|
13
|
+
let start = corners[index - 1];
|
|
14
|
+
let end = index === corners.length ? corners[0] : corners[index];
|
|
15
|
+
const crossingPoint = getCrossingPointsBetweenPointAndSegment(point, start, end);
|
|
16
|
+
result.push(...crossingPoint);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
export const getPolygonEdgeByConnectionPoint = (corners, point) => {
|
|
21
|
+
for (let index = 1; index <= corners.length; index++) {
|
|
22
|
+
let start = corners[index - 1];
|
|
23
|
+
let end = index === corners.length ? corners[0] : corners[index];
|
|
24
|
+
if (isPointOnSegment(point, start, end)) {
|
|
25
|
+
return [start, end];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWdvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL3BvbHlnb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7SUFDeEQsTUFBTSxZQUFZLEdBQVksRUFBRSxDQUFDO0lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3RjtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLENBQUMsT0FBZ0IsRUFBRSxLQUFZLEVBQUUsRUFBRTtJQUNyRixNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFDM0IsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDbEQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEdBQUcsR0FBRyxLQUFLLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsTUFBTSxhQUFhLEdBQUcsdUNBQXVDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7S0FDakM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDOUUsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDbEQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEdBQUcsR0FBRyxLQUFLLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFtQixDQUFDO1NBQ3pDO0tBQ0o7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDcm9zc2luZ1BvaW50c0JldHdlZW5Qb2ludEFuZFNlZ21lbnQsIGlzUG9pbnRPblNlZ21lbnQgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2VudGVyUG9pbnRzT25Qb2x5Z29uID0gKHBvaW50czogUG9pbnRbXSkgPT4ge1xuICAgIGNvbnN0IGNlbnRlclBvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBqID0gaSA9PSBwb2ludHMubGVuZ3RoIC0gMSA/IDAgOiBpICsgMTtcbiAgICAgICAgY2VudGVyUG9pbnRzLnB1c2goWyhwb2ludHNbaV1bMF0gKyBwb2ludHNbal1bMF0pIC8gMiwgKHBvaW50c1tpXVsxXSArIHBvaW50c1tqXVsxXSkgLyAyXSk7XG4gICAgfVxuICAgIHJldHVybiBjZW50ZXJQb2ludHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3Jvc3NpbmdQb2ludEJldHdlZW5Qb2ludEFuZFBvbHlnb24gPSAoY29ybmVyczogUG9pbnRbXSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBQb2ludFtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBjb3JuZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBsZXQgc3RhcnQgPSBjb3JuZXJzW2luZGV4IC0gMV07XG4gICAgICAgIGxldCBlbmQgPSBpbmRleCA9PT0gY29ybmVycy5sZW5ndGggPyBjb3JuZXJzWzBdIDogY29ybmVyc1tpbmRleF07XG4gICAgICAgIGNvbnN0IGNyb3NzaW5nUG9pbnQgPSBnZXRDcm9zc2luZ1BvaW50c0JldHdlZW5Qb2ludEFuZFNlZ21lbnQocG9pbnQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICByZXN1bHQucHVzaCguLi5jcm9zc2luZ1BvaW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb2x5Z29uRWRnZUJ5Q29ubmVjdGlvblBvaW50ID0gKGNvcm5lcnM6IFBvaW50W10sIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPD0gY29ybmVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gY29ybmVyc1tpbmRleCAtIDFdO1xuICAgICAgICBsZXQgZW5kID0gaW5kZXggPT09IGNvcm5lcnMubGVuZ3RoID8gY29ybmVyc1swXSA6IGNvcm5lcnNbaW5kZXhdO1xuICAgICAgICBpZiAoaXNQb2ludE9uU2VnbWVudChwb2ludCwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3RhcnQsIGVuZF0gYXMgW1BvaW50LCBQb2ludF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuIl19
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { RectangleClient, depthFirstRecursion, getIsRecursionFunc } from '@plait/core';
|
|
2
2
|
import { PlaitDrawElement } from '../../interfaces';
|
|
3
|
-
import { RESIZE_HANDLE_DIAMETER,
|
|
3
|
+
import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs } from '@plait/common';
|
|
4
4
|
import { getEngine } from '../../engines';
|
|
5
5
|
import { getShape } from '../shape';
|
|
6
|
-
export const
|
|
7
|
-
const rectangle = getRectangleByPoints(element.points);
|
|
6
|
+
export const getHitRectangleResizeHandleRef = (board, rectangle, point) => {
|
|
8
7
|
const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER);
|
|
9
8
|
const result = resizeHandleRefs.find(resizeHandleRef => {
|
|
10
|
-
return RectangleClient.isHit(RectangleClient.
|
|
9
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), resizeHandleRef.rectangle);
|
|
11
10
|
});
|
|
12
11
|
return result;
|
|
13
12
|
};
|
|
@@ -15,7 +14,7 @@ export const getHitOutlineGeometry = (board, point, offset = 0) => {
|
|
|
15
14
|
let geometry = null;
|
|
16
15
|
depthFirstRecursion(board, node => {
|
|
17
16
|
if (PlaitDrawElement.isGeometry(node) || PlaitDrawElement.isImage(node)) {
|
|
18
|
-
let client = getRectangleByPoints(node.points);
|
|
17
|
+
let client = RectangleClient.getRectangleByPoints(node.points);
|
|
19
18
|
client = RectangleClient.getOutlineRectangle(client, offset);
|
|
20
19
|
const shape = getShape(node);
|
|
21
20
|
const isHit = getEngine(shape).isHit(client, point);
|
|
@@ -26,4 +25,4 @@ export const getHitOutlineGeometry = (board, point, offset = 0) => {
|
|
|
26
25
|
}, getIsRecursionFunc(board), true);
|
|
27
26
|
return geometry;
|
|
28
27
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQStCLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN6RixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBaUIsRUFBRSxLQUFZLEVBQUUsU0FBaUIsQ0FBQyxFQUF3QixFQUFFO0lBQy9HLElBQUksUUFBUSxHQUFzQyxJQUFJLENBQUM7SUFDdkQsbUJBQW1CLENBQ2YsS0FBSyxFQUNMLElBQUksQ0FBQyxFQUFFO1FBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JFLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsTUFBTSxHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELElBQUksS0FBSyxFQUFFO2dCQUNQLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDbkI7U0FDSjtJQUNMLENBQUMsRUFDRCxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDekIsSUFBSSxDQUNQLENBQUM7SUFDRixPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmNlc3RvciwgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgZGVwdGhGaXJzdFJlY3Vyc2lvbiwgZ2V0SXNSZWN1cnNpb25GdW5jIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiwgZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcywgUmVzaXplSGFuZGxlIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi8uLi9lbmdpbmVzJztcbmltcG9ydCB7IFBsYWl0SW1hZ2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ltYWdlJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi4vc2hhcGUnO1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmID0gKGJvYXJkOiBQbGFpdEJvYXJkLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlUmVmcyA9IGdldFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZnMocmVjdGFuZ2xlLCBSRVNJWkVfSEFORExFX0RJQU1FVEVSKTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNpemVIYW5kbGVSZWZzLmZpbmQocmVzaXplSGFuZGxlUmVmID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3BvaW50LCBwb2ludF0pLCByZXNpemVIYW5kbGVSZWYucmVjdGFuZ2xlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdE91dGxpbmVHZW9tZXRyeSA9IChib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50LCBvZmZzZXQ6IG51bWJlciA9IDApOiBQbGFpdEdlb21ldHJ5IHwgbnVsbCA9PiB7XG4gICAgbGV0IGdlb21ldHJ5OiBQbGFpdEdlb21ldHJ5IHwgUGxhaXRJbWFnZSB8IG51bGwgPSBudWxsO1xuICAgIGRlcHRoRmlyc3RSZWN1cnNpb248QW5jZXN0b3I+KFxuICAgICAgICBib2FyZCxcbiAgICAgICAgbm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KG5vZGUpIHx8IFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGxldCBjbGllbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMobm9kZS5wb2ludHMpO1xuICAgICAgICAgICAgICAgIGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRPdXRsaW5lUmVjdGFuZ2xlKGNsaWVudCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSGl0ID0gZ2V0RW5naW5lKHNoYXBlKS5pc0hpdChjbGllbnQsIHBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNIaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG4gICAgcmV0dXJuIGdlb21ldHJ5O1xufTtcbiJdfQ==
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { RectangleClient } from '@plait/core';
|
|
2
|
-
import { PlaitLine } from '../../interfaces';
|
|
3
|
-
import { RESIZE_HANDLE_DIAMETER } from '@plait/common';
|
|
4
|
-
import { getMiddlePoints } from '
|
|
2
|
+
import { LineShape, PlaitLine } from '../../interfaces';
|
|
3
|
+
import { RESIZE_HANDLE_DIAMETER, getPointOnPolyline } from '@plait/common';
|
|
4
|
+
import { getLinePoints, getMiddlePoints } from '../line/line-basic';
|
|
5
5
|
export var LineResizeHandle;
|
|
6
6
|
(function (LineResizeHandle) {
|
|
7
7
|
LineResizeHandle["source"] = "source";
|
|
@@ -9,25 +9,32 @@ export var LineResizeHandle;
|
|
|
9
9
|
LineResizeHandle["addHandle"] = "addHandle";
|
|
10
10
|
})(LineResizeHandle || (LineResizeHandle = {}));
|
|
11
11
|
export const getHitLineResizeHandleRef = (board, element, point) => {
|
|
12
|
-
|
|
13
|
-
const index = getHitPointIndex(
|
|
12
|
+
let dataPoints = PlaitLine.getPoints(board, element);
|
|
13
|
+
const index = getHitPointIndex(dataPoints, point);
|
|
14
14
|
if (index !== -1) {
|
|
15
|
+
const handleIndex = index;
|
|
15
16
|
if (index === 0) {
|
|
16
|
-
return { handle: LineResizeHandle.source,
|
|
17
|
+
return { handle: LineResizeHandle.source, handleIndex };
|
|
17
18
|
}
|
|
18
|
-
if (index ===
|
|
19
|
-
return { handle: LineResizeHandle.target,
|
|
19
|
+
if (index === dataPoints.length - 1) {
|
|
20
|
+
return { handle: LineResizeHandle.target, handleIndex };
|
|
21
|
+
}
|
|
22
|
+
// elbow line, data points only verify source connection point and target connection point
|
|
23
|
+
if (element.shape !== LineShape.elbow) {
|
|
24
|
+
return { handleIndex };
|
|
20
25
|
}
|
|
21
|
-
return { index };
|
|
22
26
|
}
|
|
23
27
|
const middlePoints = getMiddlePoints(board, element);
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
return {
|
|
28
|
+
const indexOfMiddlePoints = getHitPointIndex(middlePoints, point);
|
|
29
|
+
if (indexOfMiddlePoints !== -1) {
|
|
30
|
+
return {
|
|
31
|
+
handle: LineResizeHandle.addHandle,
|
|
32
|
+
handleIndex: indexOfMiddlePoints
|
|
33
|
+
};
|
|
27
34
|
}
|
|
28
35
|
return undefined;
|
|
29
36
|
};
|
|
30
|
-
function getHitPointIndex(points, movingPoint) {
|
|
37
|
+
export function getHitPointIndex(points, movingPoint) {
|
|
31
38
|
const rectangles = points.map(point => {
|
|
32
39
|
return {
|
|
33
40
|
x: point[0] - RESIZE_HANDLE_DIAMETER / 2,
|
|
@@ -37,8 +44,24 @@ function getHitPointIndex(points, movingPoint) {
|
|
|
37
44
|
};
|
|
38
45
|
});
|
|
39
46
|
const rectangle = rectangles.find(rectangle => {
|
|
40
|
-
return RectangleClient.isHit(RectangleClient.
|
|
47
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([movingPoint, movingPoint]), rectangle);
|
|
41
48
|
});
|
|
42
49
|
return rectangle ? rectangles.indexOf(rectangle) : -1;
|
|
43
50
|
}
|
|
44
|
-
|
|
51
|
+
export const getHitLineTextIndex = (board, element, point) => {
|
|
52
|
+
const texts = element.texts;
|
|
53
|
+
if (!texts.length)
|
|
54
|
+
return -1;
|
|
55
|
+
const points = getLinePoints(board, element);
|
|
56
|
+
return texts.findIndex(text => {
|
|
57
|
+
const center = getPointOnPolyline(points, text.position);
|
|
58
|
+
const rectangle = {
|
|
59
|
+
x: center[0] - text.width / 2,
|
|
60
|
+
y: center[1] - text.height / 2,
|
|
61
|
+
width: text.width,
|
|
62
|
+
height: text.height
|
|
63
|
+
};
|
|
64
|
+
return RectangleClient.isHit(rectangle, RectangleClient.getRectangleByPoints([point, point]));
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL3Bvc2l0aW9uL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixlQUFlLEVBQW1DLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEUsTUFBTSxDQUFOLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBbUIsQ0FBQTtJQUNuQiwyQ0FBeUIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUkzQjtBQUVELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEtBQVksRUFBRSxFQUFFO0lBQzdGLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUMzRDtRQUNELElBQUksS0FBSyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO1NBQzNEO1FBQ0QsMEZBQTBGO1FBQzFGLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUMxQjtLQUNKO0lBQ0QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxJQUFJLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVCLE9BQU87WUFDSCxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsU0FBUztZQUNsQyxXQUFXLEVBQUUsbUJBQW1CO1NBQ25DLENBQUM7S0FDTDtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFlLEVBQUUsV0FBa0I7SUFDaEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNsQyxPQUFPO1lBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxDQUFDO1lBQ3hDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsQ0FBQztZQUN4QyxLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLE1BQU0sRUFBRSxzQkFBc0I7U0FDakMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUMxQyxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEtBQVksRUFBRSxFQUFFO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU3QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHO1lBQ2QsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBTSxHQUFHLENBQUM7WUFDOUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTyxHQUFHLENBQUM7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFNO1lBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTztTQUN2QixDQUFDO1FBQ0YsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IExpbmVTaGFwZSwgUGxhaXRMaW5lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBnZXRQb2ludE9uUG9seWxpbmUgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IGdldExpbmVQb2ludHMsIGdldE1pZGRsZVBvaW50cyB9IGZyb20gJy4uL2xpbmUvbGluZS1iYXNpYyc7XG5cbmV4cG9ydCBlbnVtIExpbmVSZXNpemVIYW5kbGUge1xuICAgICdzb3VyY2UnID0gJ3NvdXJjZScsXG4gICAgJ3RhcmdldCcgPSAndGFyZ2V0JyxcbiAgICAnYWRkSGFuZGxlJyA9ICdhZGRIYW5kbGUnXG59XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRMaW5lUmVzaXplSGFuZGxlUmVmID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGxldCBkYXRhUG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgaW5kZXggPSBnZXRIaXRQb2ludEluZGV4KGRhdGFQb2ludHMsIHBvaW50KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlOiBMaW5lUmVzaXplSGFuZGxlLnNvdXJjZSwgaGFuZGxlSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IGRhdGFQb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlOiBMaW5lUmVzaXplSGFuZGxlLnRhcmdldCwgaGFuZGxlSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbGJvdyBsaW5lLCBkYXRhIHBvaW50cyBvbmx5IHZlcmlmeSBzb3VyY2UgY29ubmVjdGlvbiBwb2ludCBhbmQgdGFyZ2V0IGNvbm5lY3Rpb24gcG9pbnRcbiAgICAgICAgaWYgKGVsZW1lbnQuc2hhcGUgIT09IExpbmVTaGFwZS5lbGJvdykge1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlSW5kZXggfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtaWRkbGVQb2ludHMgPSBnZXRNaWRkbGVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGluZGV4T2ZNaWRkbGVQb2ludHMgPSBnZXRIaXRQb2ludEluZGV4KG1pZGRsZVBvaW50cywgcG9pbnQpO1xuICAgIGlmIChpbmRleE9mTWlkZGxlUG9pbnRzICE9PSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFuZGxlOiBMaW5lUmVzaXplSGFuZGxlLmFkZEhhbmRsZSxcbiAgICAgICAgICAgIGhhbmRsZUluZGV4OiBpbmRleE9mTWlkZGxlUG9pbnRzXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGl0UG9pbnRJbmRleChwb2ludHM6IFBvaW50W10sIG1vdmluZ1BvaW50OiBQb2ludCkge1xuICAgIGNvbnN0IHJlY3RhbmdsZXMgPSBwb2ludHMubWFwKHBvaW50ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHBvaW50WzBdIC0gUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiAvIDIsXG4gICAgICAgICAgICB5OiBwb2ludFsxXSAtIFJFU0laRV9IQU5ETEVfRElBTUVURVIgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IFJFU0laRV9IQU5ETEVfRElBTUVURVIsXG4gICAgICAgICAgICBoZWlnaHQ6IFJFU0laRV9IQU5ETEVfRElBTUVURVJcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCByZWN0YW5nbGUgPSByZWN0YW5nbGVzLmZpbmQocmVjdGFuZ2xlID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW21vdmluZ1BvaW50LCBtb3ZpbmdQb2ludF0pLCByZWN0YW5nbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZWN0YW5nbGUgPyByZWN0YW5nbGVzLmluZGV4T2YocmVjdGFuZ2xlKSA6IC0xO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0SGl0TGluZVRleHRJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCB0ZXh0cyA9IGVsZW1lbnQudGV4dHM7XG4gICAgaWYgKCF0ZXh0cy5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIHJldHVybiB0ZXh0cy5maW5kSW5kZXgodGV4dCA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGdldFBvaW50T25Qb2x5bGluZShwb2ludHMsIHRleHQucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByZWN0YW5nbGUgPSB7XG4gICAgICAgICAgICB4OiBjZW50ZXJbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgICAgICB5OiBjZW50ZXJbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0LmhlaWdodCFcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChyZWN0YW5nbGUsIFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcG9pbnQsIHBvaW50XSkpO1xuICAgIH0pO1xufTtcbiJdfQ==
|