@plait/core 0.77.3 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/fesm2022/plait-core.mjs.map +1 -1
  2. package/package.json +1 -3
  3. package/esm2022/constants/cursor.mjs +0 -13
  4. package/esm2022/constants/index.mjs +0 -20
  5. package/esm2022/constants/keycodes.mjs +0 -127
  6. package/esm2022/constants/selection.mjs +0 -6
  7. package/esm2022/constants/zoom.mjs +0 -4
  8. package/esm2022/context.mjs +0 -23
  9. package/esm2022/core/element/context-change.mjs +0 -13
  10. package/esm2022/core/element/context.mjs +0 -2
  11. package/esm2022/core/element/element-flavour.mjs +0 -140
  12. package/esm2022/core/element/element-ref.mjs +0 -2
  13. package/esm2022/core/list-render.mjs +0 -217
  14. package/esm2022/differs/default_iterable_differ.mjs +0 -614
  15. package/esm2022/differs/iterable_differs.mjs +0 -9
  16. package/esm2022/interfaces/board.mjs +0 -108
  17. package/esm2022/interfaces/custom-types.mjs +0 -5
  18. package/esm2022/interfaces/direction.mjs +0 -8
  19. package/esm2022/interfaces/element.mjs +0 -43
  20. package/esm2022/interfaces/group.mjs +0 -6
  21. package/esm2022/interfaces/history.mjs +0 -5
  22. package/esm2022/interfaces/index.mjs +0 -19
  23. package/esm2022/interfaces/node.mjs +0 -57
  24. package/esm2022/interfaces/operation.mjs +0 -96
  25. package/esm2022/interfaces/path-ref.mjs +0 -15
  26. package/esm2022/interfaces/path.mjs +0 -183
  27. package/esm2022/interfaces/plugin.mjs +0 -6
  28. package/esm2022/interfaces/point.mjs +0 -27
  29. package/esm2022/interfaces/pointer.mjs +0 -6
  30. package/esm2022/interfaces/rectangle-client.mjs +0 -171
  31. package/esm2022/interfaces/selection.mjs +0 -13
  32. package/esm2022/interfaces/svg-arc-command.mjs +0 -2
  33. package/esm2022/interfaces/theme.mjs +0 -49
  34. package/esm2022/interfaces/viewport.mjs +0 -7
  35. package/esm2022/plait-core.mjs +0 -5
  36. package/esm2022/plugins/create-board.mjs +0 -122
  37. package/esm2022/plugins/index.mjs +0 -11
  38. package/esm2022/plugins/with-board.mjs +0 -20
  39. package/esm2022/plugins/with-hand.mjs +0 -113
  40. package/esm2022/plugins/with-history.mjs +0 -91
  41. package/esm2022/plugins/with-hotkey.mjs +0 -96
  42. package/esm2022/plugins/with-i18n.mjs +0 -13
  43. package/esm2022/plugins/with-moving.mjs +0 -282
  44. package/esm2022/plugins/with-options.mjs +0 -13
  45. package/esm2022/plugins/with-related-fragment.mjs +0 -23
  46. package/esm2022/plugins/with-selection.mjs +0 -230
  47. package/esm2022/public-api.mjs +0 -16
  48. package/esm2022/testing/core/create-board.mjs +0 -15
  49. package/esm2022/testing/core/fake-weak-map.mjs +0 -18
  50. package/esm2022/testing/core/index.mjs +0 -3
  51. package/esm2022/testing/fake-events/event-objects.mjs +0 -131
  52. package/esm2022/testing/fake-events/index.mjs +0 -2
  53. package/esm2022/testing/index.mjs +0 -3
  54. package/esm2022/testing/test-element.mjs +0 -9
  55. package/esm2022/transforms/board.mjs +0 -137
  56. package/esm2022/transforms/element.mjs +0 -22
  57. package/esm2022/transforms/general.mjs +0 -146
  58. package/esm2022/transforms/group.mjs +0 -64
  59. package/esm2022/transforms/index.mjs +0 -17
  60. package/esm2022/transforms/node.mjs +0 -37
  61. package/esm2022/transforms/selection.mjs +0 -26
  62. package/esm2022/transforms/theme.mjs +0 -8
  63. package/esm2022/transforms/viewport.mjs +0 -8
  64. package/esm2022/transforms/z-index.mjs +0 -20
  65. package/esm2022/utils/angle.mjs +0 -164
  66. package/esm2022/utils/board.mjs +0 -18
  67. package/esm2022/utils/clipboard/clipboard.mjs +0 -40
  68. package/esm2022/utils/clipboard/common.mjs +0 -82
  69. package/esm2022/utils/clipboard/data-transfer.mjs +0 -33
  70. package/esm2022/utils/clipboard/index.mjs +0 -3
  71. package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -71
  72. package/esm2022/utils/clipboard/types.mjs +0 -13
  73. package/esm2022/utils/common.mjs +0 -79
  74. package/esm2022/utils/debug.mjs +0 -91
  75. package/esm2022/utils/dnd.mjs +0 -8
  76. package/esm2022/utils/dom/common.mjs +0 -75
  77. package/esm2022/utils/dom/environment.mjs +0 -2
  78. package/esm2022/utils/dom/foreign.mjs +0 -26
  79. package/esm2022/utils/dom/index.mjs +0 -4
  80. package/esm2022/utils/drawing/arrow.mjs +0 -23
  81. package/esm2022/utils/drawing/circle.mjs +0 -4
  82. package/esm2022/utils/drawing/line.mjs +0 -47
  83. package/esm2022/utils/drawing/rectangle.mjs +0 -36
  84. package/esm2022/utils/element.mjs +0 -90
  85. package/esm2022/utils/environment.mjs +0 -14
  86. package/esm2022/utils/fragment.mjs +0 -27
  87. package/esm2022/utils/group.mjs +0 -239
  88. package/esm2022/utils/helper.mjs +0 -68
  89. package/esm2022/utils/history.mjs +0 -96
  90. package/esm2022/utils/hotkeys.mjs +0 -109
  91. package/esm2022/utils/id-creator.mjs +0 -11
  92. package/esm2022/utils/index.mjs +0 -35
  93. package/esm2022/utils/iterable.mjs +0 -32
  94. package/esm2022/utils/math.mjs +0 -480
  95. package/esm2022/utils/mobile.mjs +0 -6
  96. package/esm2022/utils/moving-element.mjs +0 -17
  97. package/esm2022/utils/pointer.mjs +0 -13
  98. package/esm2022/utils/position.mjs +0 -9
  99. package/esm2022/utils/selected-element.mjs +0 -145
  100. package/esm2022/utils/selection.mjs +0 -151
  101. package/esm2022/utils/snap/snap-moving.mjs +0 -199
  102. package/esm2022/utils/snap/snap.mjs +0 -211
  103. package/esm2022/utils/to-image.mjs +0 -204
  104. package/esm2022/utils/to-point.mjs +0 -74
  105. package/esm2022/utils/tree.mjs +0 -22
  106. package/esm2022/utils/viewport.mjs +0 -227
  107. package/esm2022/utils/weak-maps.mjs +0 -27
  108. package/esm2022/utils/z-index.mjs +0 -166
@@ -1,227 +0,0 @@
1
- import { SCROLL_BAR_WIDTH } from '../constants';
2
- import { MAX_ZOOM, MIN_ZOOM } from '../constants/zoom';
3
- import { PlaitBoard, Point } from '../interfaces';
4
- import { BoardTransforms } from '../transforms/board';
5
- import { getRectangleByElements } from './element';
6
- import { approximately } from './math';
7
- import { getViewBox, toHostPointFromViewBoxPoint, toViewBoxPoint } from './to-point';
8
- import { BOARD_TO_VIEWPORT_ORIGINATION } from './weak-maps';
9
- export const VIEWPORT_PADDING_RATIO = 0.75;
10
- const IS_FROM_SCROLLING = new WeakMap();
11
- const IS_FROM_VIEWPORT_CHANGE = new WeakMap();
12
- export function getViewportContainerRect(board) {
13
- const { hideScrollbar } = board.options;
14
- const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
15
- const viewportRect = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
16
- return {
17
- width: viewportRect.width + scrollBarWidth,
18
- height: viewportRect.height + scrollBarWidth
19
- };
20
- }
21
- export function getElementHostBBox(board, zoom) {
22
- const childrenRect = getRectangleByElements(board, board.children, true);
23
- let left;
24
- let right;
25
- let top;
26
- let bottom;
27
- left = childrenRect.x;
28
- right = childrenRect.x + childrenRect.width;
29
- top = childrenRect.y;
30
- bottom = childrenRect.y + childrenRect.height;
31
- return {
32
- left,
33
- right,
34
- top,
35
- bottom
36
- };
37
- }
38
- /**
39
- * Normalize the scaling ratio, or return the corrected scaling ratio if the limit is exceeded
40
- */
41
- export function clampZoomLevel(zoom, minZoom = MIN_ZOOM, maxZoom = MAX_ZOOM) {
42
- return zoom < minZoom ? minZoom : zoom > maxZoom ? maxZoom : zoom;
43
- }
44
- /**
45
- * Prepares element bounding box with minimum size constraints
46
- */
47
- export function prepareElementBBox(board, zoom) {
48
- const boardContainerRectangle = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
49
- const elementHostBBox = getElementHostBBox(board, zoom);
50
- const containerWidth = boardContainerRectangle.width;
51
- const containerHeight = boardContainerRectangle.height;
52
- // Calculate bounding box dimensions
53
- let width = elementHostBBox.right - elementHostBBox.left;
54
- let height = elementHostBBox.bottom - elementHostBBox.top;
55
- // If elementHostBBox dimensions are smaller than container dimensions,
56
- // use half of container dimensions as minimum size
57
- const minWidth = containerWidth / 2;
58
- const minHeight = containerHeight / 2;
59
- if (width < minWidth / zoom) {
60
- // Center the content horizontally if applying minimum width
61
- const center = elementHostBBox.left + width / 2;
62
- elementHostBBox.left = center - minWidth / 2 / zoom;
63
- elementHostBBox.right = center + minWidth / 2 / zoom;
64
- width = minWidth / zoom;
65
- }
66
- if (height < minHeight / zoom) {
67
- // Center the content vertically if applying minimum height
68
- const center = elementHostBBox.top + height / 2;
69
- elementHostBBox.top = center - minHeight / 2 / zoom;
70
- elementHostBBox.bottom = center + minHeight / 2 / zoom;
71
- height = minHeight / zoom;
72
- }
73
- return {
74
- elementHostBBox,
75
- containerWidth,
76
- containerHeight,
77
- width,
78
- height
79
- };
80
- }
81
- /**
82
- * Calculates viewBox based on element bounding box with padding
83
- */
84
- export function calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, paddingRatio = VIEWPORT_PADDING_RATIO) {
85
- const horizontalPaddingInViewBox = (containerWidth * paddingRatio) / zoom;
86
- const verticalPaddingInViewBox = (containerHeight * paddingRatio) / zoom;
87
- return [
88
- elementHostBBox.left - horizontalPaddingInViewBox,
89
- elementHostBBox.top - verticalPaddingInViewBox,
90
- width + horizontalPaddingInViewBox * 2,
91
- height + verticalPaddingInViewBox * 2
92
- ];
93
- }
94
- export function calcNewViewBox(board, zoom) {
95
- const { elementHostBBox, containerWidth, containerHeight, width, height } = prepareElementBBox(board, zoom);
96
- return calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom);
97
- }
98
- export function getViewBoxCenterPoint(board) {
99
- const childrenRectangle = getRectangleByElements(board, board.children, true);
100
- return [childrenRectangle.x + childrenRectangle.width / 2, childrenRectangle.y + childrenRectangle.height / 2];
101
- }
102
- export function setSVGViewBox(board, viewBox) {
103
- const zoom = board.viewport.zoom;
104
- const hostElement = PlaitBoard.getHost(board);
105
- hostElement.style.display = 'block';
106
- hostElement.style.width = `${viewBox[2] * zoom}px`;
107
- hostElement.style.height = `${viewBox[3] * zoom}px`;
108
- if (viewBox && viewBox[2] > 0 && viewBox[3] > 0) {
109
- hostElement.setAttribute('viewBox', viewBox.join(' '));
110
- }
111
- }
112
- export function updateViewportOffset(board) {
113
- const origination = getViewportOrigination(board);
114
- if (!origination) {
115
- return;
116
- }
117
- const [scrollLeft, scrollTop] = toHostPointFromViewBoxPoint(board, origination);
118
- updateViewportContainerScroll(board, scrollLeft, scrollTop);
119
- }
120
- export function updateViewportContainerScroll(board, left, top, isFromViewportChange = true) {
121
- const viewportContainer = PlaitBoard.getViewportContainer(board);
122
- const previousScrollLeft = viewportContainer.scrollLeft;
123
- const previousScrollTop = viewportContainer.scrollTop;
124
- // scrollTop assign 11.8 will get 11.5 in chrome
125
- // scrollTop assign 11.8 will get 11 in firefox, safari
126
- // scrollTop assign 11.4 will get 11 in chrome, firefox, safari
127
- // use approximately method to determine the new value is valid updating to avoid debouncing
128
- if (!approximately(viewportContainer.scrollLeft, left, 1) || !approximately(viewportContainer.scrollTop, top, 1)) {
129
- viewportContainer.scrollLeft = left;
130
- viewportContainer.scrollTop = top;
131
- const offsetWidth = viewportContainer.offsetWidth;
132
- const offsetHeight = viewportContainer.offsetHeight;
133
- if (previousScrollLeft === viewportContainer.scrollLeft && previousScrollTop === viewportContainer.scrollTop) {
134
- // The scroll event cannot be triggered, so the origination is modified directly based on the scroll distance.
135
- updateViewportByScrolling(board, previousScrollLeft, previousScrollTop);
136
- }
137
- else {
138
- const isValidLeftOrTop = left > 0 &&
139
- top > 0 &&
140
- left < viewportContainer.scrollWidth - offsetWidth &&
141
- top < viewportContainer.scrollHeight - offsetHeight;
142
- if (isFromViewportChange && isValidLeftOrTop) {
143
- setIsFromViewportChange(board, true);
144
- }
145
- }
146
- }
147
- }
148
- export function updateViewportByScrolling(board, scrollLeft, scrollTop) {
149
- const origination = toViewBoxPoint(board, [scrollLeft, scrollTop]);
150
- if (Point.isEquals(origination, getViewportOrigination(board))) {
151
- return;
152
- }
153
- BoardTransforms.updateViewport(board, origination);
154
- setIsFromScrolling(board, true);
155
- }
156
- export function initializeViewportContainer(board) {
157
- const { width, height } = getViewportContainerRect(board);
158
- const viewportContainer = PlaitBoard.getViewportContainer(board);
159
- viewportContainer.style.width = `${width}px`;
160
- viewportContainer.style.height = `${height}px`;
161
- }
162
- export function initializeViewBox(board) {
163
- const zoom = board.viewport.zoom;
164
- const viewBox = calcNewViewBox(board, zoom);
165
- setSVGViewBox(board, viewBox);
166
- }
167
- export function updateViewBox(board) {
168
- const zoom = board.viewport.zoom;
169
- const { elementHostBBox, containerWidth, containerHeight, width, height } = prepareElementBBox(board, zoom);
170
- // Use 0.5 ratio to check if contents are within current viewBox
171
- const checkViewBox = calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, 0.5 // Use smaller padding ratio for checking
172
- );
173
- // Get current viewBox
174
- const currentViewBox = getViewBox(board);
175
- // Only update if new viewBox is NOT contained within current viewBox
176
- if (checkViewBox[0] < currentViewBox.x ||
177
- checkViewBox[1] < currentViewBox.y ||
178
- checkViewBox[0] + checkViewBox[2] > currentViewBox.x + currentViewBox.width ||
179
- checkViewBox[1] + checkViewBox[3] > currentViewBox.y + currentViewBox.height) {
180
- // Update with larger padding ratio
181
- const newViewBox = calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, VIEWPORT_PADDING_RATIO);
182
- setSVGViewBox(board, newViewBox);
183
- }
184
- }
185
- export function initializeViewportOffset(board) {
186
- if (!board.viewport?.origination) {
187
- const zoom = board.viewport.zoom;
188
- const viewportContainerRect = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
189
- const viewBox = calcNewViewBox(board, zoom);
190
- const centerX = viewBox[0] + viewBox[2] / 2;
191
- const centerY = viewBox[1] + viewBox[3] / 2;
192
- const origination = [centerX - viewportContainerRect.width / 2 / zoom, centerY - viewportContainerRect.height / 2 / zoom];
193
- updateViewportOrigination(board, origination);
194
- updateViewportOffset(board);
195
- return;
196
- }
197
- updateViewportOffset(board);
198
- }
199
- export const updateViewportOrigination = (board, origination) => {
200
- BOARD_TO_VIEWPORT_ORIGINATION.set(board, origination);
201
- };
202
- export const clearViewportOrigination = (board) => {
203
- BOARD_TO_VIEWPORT_ORIGINATION.delete(board);
204
- };
205
- export const getViewportOrigination = (board) => {
206
- const origination = BOARD_TO_VIEWPORT_ORIGINATION.get(board);
207
- if (origination) {
208
- return origination;
209
- }
210
- else {
211
- return board.viewport.origination;
212
- }
213
- };
214
- export const isFromScrolling = (board) => {
215
- return !!IS_FROM_SCROLLING.get(board);
216
- };
217
- export const setIsFromScrolling = (board, state) => {
218
- IS_FROM_SCROLLING.set(board, state);
219
- };
220
- export const isFromViewportChange = (board) => {
221
- return !!IS_FROM_VIEWPORT_CHANGE.get(board);
222
- };
223
- export const setIsFromViewportChange = (board, state) => {
224
- IS_FROM_VIEWPORT_CHANGE.set(board, state);
225
- };
226
- export function scrollToRectangle(board, client) { }
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy92aWV3cG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsMkJBQTJCLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFTM0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUU3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFpQjtJQUN0RCxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUN4QyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFakYsT0FBTztRQUNILEtBQUss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QyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxNQUF1QixJQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTQ1JPTExfQkFSX1dJRFRIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9aT09NLCBNSU5fWk9PTSB9IGZyb20gJy4uL2NvbnN0YW50cy96b29tJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJvYXJkVHJhbnNmb3JtcyB9IGZyb20gJy4uL3RyYW5zZm9ybXMvYm9hcmQnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyB9IGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgeyBhcHByb3hpbWF0ZWx5IH0gZnJvbSAnLi9tYXRoJztcbmltcG9ydCB7IGdldFZpZXdCb3gsIHRvSG9zdFBvaW50RnJvbVZpZXdCb3hQb2ludCwgdG9WaWV3Qm94UG9pbnQgfSBmcm9tICcuL3RvLXBvaW50JztcbmltcG9ydCB7IEJPQVJEX1RPX1ZJRVdQT1JUX09SSUdJTkFUSU9OIH0gZnJvbSAnLi93ZWFrLW1hcHMnO1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfUEFERElOR19SQVRJTyA9IDAuNzU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEhvc3RCQm94IHtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgcmlnaHQ6IG51bWJlcjtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBib3R0b206IG51bWJlcjtcbn1cblxuY29uc3QgSVNfRlJPTV9TQ1JPTExJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG5jb25zdCBJU19GUk9NX1ZJRVdQT1JUX0NIQU5HRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydENvbnRhaW5lclJlY3QoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB7IGhpZGVTY3JvbGxiYXIgfSA9IGJvYXJkLm9wdGlvbnM7XG4gICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBoaWRlU2Nyb2xsYmFyID8gU0NST0xMX0JBUl9XSURUSCA6IDA7XG4gICAgY29uc3Qgdmlld3BvcnRSZWN0ID0gUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdmlld3BvcnRSZWN0LndpZHRoICsgc2Nyb2xsQmFyV2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnRSZWN0LmhlaWdodCArIHNjcm9sbEJhcldpZHRoXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRIb3N0QkJveChib2FyZDogUGxhaXRCb2FyZCwgem9vbTogbnVtYmVyKTogRWxlbWVudEhvc3RCQm94IHtcbiAgICBjb25zdCBjaGlsZHJlblJlY3QgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBib2FyZC5jaGlsZHJlbiwgdHJ1ZSk7XG4gICAgbGV0IGxlZnQ6IG51bWJlcjtcbiAgICBsZXQgcmlnaHQ6IG51bWJlcjtcbiAgICBsZXQgdG9wOiBudW1iZXI7XG4gICAgbGV0IGJvdHRvbTogbnVtYmVyO1xuICAgIGxlZnQgPSBjaGlsZHJlblJlY3QueDtcbiAgICByaWdodCA9IGNoaWxkcmVuUmVjdC54ICsgY2hpbGRyZW5SZWN0LndpZHRoO1xuICAgIHRvcCA9IGNoaWxkcmVuUmVjdC55O1xuICAgIGJvdHRvbSA9IGNoaWxkcmVuUmVjdC55ICsgY2hpbGRyZW5SZWN0LmhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0LFxuICAgICAgICByaWdodCxcbiAgICAgICAgdG9wLFxuICAgICAgICBib3R0b21cbiAgICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2NhbGluZyByYXRpbywgb3IgcmV0dXJuIHRoZSBjb3JyZWN0ZWQgc2NhbGluZyByYXRpbyBpZiB0aGUgbGltaXQgaXMgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wWm9vbUxldmVsKHpvb206IG51bWJlciwgbWluWm9vbSA9IE1JTl9aT09NLCBtYXhab29tID0gTUFYX1pPT00pIHtcbiAgICByZXR1cm4gem9vbSA8IG1pblpvb20gPyBtaW5ab29tIDogem9vbSA+IG1heFpvb20gPyBtYXhab29tIDogem9vbTtcbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBlbGVtZW50IGJvdW5kaW5nIGJveCB3aXRoIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkOiBQbGFpdEJvYXJkLCB6b29tOiBudW1iZXIpOiB7XG4gICAgZWxlbWVudEhvc3RCQm94OiBFbGVtZW50SG9zdEJCb3g7XG4gICAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgICBjb250YWluZXJIZWlnaHQ6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufSB7XG4gICAgY29uc3QgYm9hcmRDb250YWluZXJSZWN0YW5nbGUgPSBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50SG9zdEJCb3g6IEVsZW1lbnRIb3N0QkJveCA9IGdldEVsZW1lbnRIb3N0QkJveChib2FyZCwgem9vbSk7XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBib2FyZENvbnRhaW5lclJlY3RhbmdsZS53aWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBib2FyZENvbnRhaW5lclJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveCBkaW1lbnNpb25zXG4gICAgbGV0IHdpZHRoID0gZWxlbWVudEhvc3RCQm94LnJpZ2h0IC0gZWxlbWVudEhvc3RCQm94LmxlZnQ7XG4gICAgbGV0IGhlaWdodCA9IGVsZW1lbnRIb3N0QkJveC5ib3R0b20gLSBlbGVtZW50SG9zdEJCb3gudG9wO1xuICAgIFxuICAgIC8vIElmIGVsZW1lbnRIb3N0QkJveCBkaW1lbnNpb25zIGFyZSBzbWFsbGVyIHRoYW4gY29udGFpbmVyIGRpbWVuc2lvbnMsXG4gICAgLy8gdXNlIGhhbGYgb2YgY29udGFpbmVyIGRpbWVuc2lvbnMgYXMgbWluaW11bSBzaXplXG4gICAgY29uc3QgbWluV2lkdGggPSBjb250YWluZXJXaWR0aCAvIDI7XG4gICAgY29uc3QgbWluSGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0IC8gMjtcbiAgICBcbiAgICBpZiAod2lkdGggPCBtaW5XaWR0aCAvIHpvb20pIHtcbiAgICAgICAgLy8gQ2VudGVyIHRoZSBjb250ZW50IGhvcml6b250YWxseSBpZiBhcHBseWluZyBtaW5pbXVtIHdpZHRoXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGVsZW1lbnRIb3N0QkJveC5sZWZ0ICsgd2lkdGggLyAyO1xuICAgICAgICBlbGVtZW50SG9zdEJCb3gubGVmdCA9IGNlbnRlciAtIG1pbldpZHRoIC8gMiAvIHpvb207XG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC5yaWdodCA9IGNlbnRlciArIG1pbldpZHRoIC8gMiAvIHpvb207XG4gICAgICAgIHdpZHRoID0gbWluV2lkdGggLyB6b29tO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaGVpZ2h0IDwgbWluSGVpZ2h0IC8gem9vbSkge1xuICAgICAgICAvLyBDZW50ZXIgdGhlIGNvbnRlbnQgdmVydGljYWxseSBpZiBhcHBseWluZyBtaW5pbXVtIGhlaWdodFxuICAgICAgICBjb25zdCBjZW50ZXIgPSBlbGVtZW50SG9zdEJCb3gudG9wICsgaGVpZ2h0IC8gMjtcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LnRvcCA9IGNlbnRlciAtIG1pbkhlaWdodCAvIDIgLyB6b29tO1xuICAgICAgICBlbGVtZW50SG9zdEJCb3guYm90dG9tID0gY2VudGVyICsgbWluSGVpZ2h0IC8gMiAvIHpvb207XG4gICAgICAgIGhlaWdodCA9IG1pbkhlaWdodCAvIHpvb207XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRIb3N0QkJveCxcbiAgICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICAgIGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB2aWV3Qm94IGJhc2VkIG9uIGVsZW1lbnQgYm91bmRpbmcgYm94IHdpdGggcGFkZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVmlld0JveChcbiAgICBlbGVtZW50SG9zdEJCb3g6IEVsZW1lbnRIb3N0QkJveCxcbiAgICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuICAgIGNvbnRhaW5lckhlaWdodDogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgem9vbTogbnVtYmVyLFxuICAgIHBhZGRpbmdSYXRpbzogbnVtYmVyID0gVklFV1BPUlRfUEFERElOR19SQVRJT1xuKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGhvcml6b250YWxQYWRkaW5nSW5WaWV3Qm94ID0gKGNvbnRhaW5lcldpZHRoICogcGFkZGluZ1JhdGlvKSAvIHpvb207XG4gICAgY29uc3QgdmVydGljYWxQYWRkaW5nSW5WaWV3Qm94ID0gKGNvbnRhaW5lckhlaWdodCAqIHBhZGRpbmdSYXRpbykgLyB6b29tO1xuICAgIFxuICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC5sZWZ0IC0gaG9yaXpvbnRhbFBhZGRpbmdJblZpZXdCb3gsXG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC50b3AgLSB2ZXJ0aWNhbFBhZGRpbmdJblZpZXdCb3gsXG4gICAgICAgIHdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmdJblZpZXdCb3ggKiAyLFxuICAgICAgICBoZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmdJblZpZXdCb3ggKiAyXG4gICAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNOZXdWaWV3Qm94KGJvYXJkOiBQbGFpdEJvYXJkLCB6b29tOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGVsZW1lbnRIb3N0QkJveCwgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCwgd2lkdGgsIGhlaWdodCB9ID0gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkLCB6b29tKTtcbiAgICBcbiAgICByZXR1cm4gY2FsY3VsYXRlVmlld0JveChcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICBjb250YWluZXJXaWR0aCxcbiAgICAgICAgY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB6b29tXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdCb3hDZW50ZXJQb2ludChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuUmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgYm9hcmQuY2hpbGRyZW4sIHRydWUpO1xuICAgIHJldHVybiBbY2hpbGRyZW5SZWN0YW5nbGUueCArIGNoaWxkcmVuUmVjdGFuZ2xlLndpZHRoIC8gMiwgY2hpbGRyZW5SZWN0YW5nbGUueSArIGNoaWxkcmVuUmVjdGFuZ2xlLmhlaWdodCAvIDJdIGFzIFBvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U1ZHVmlld0JveChib2FyZDogUGxhaXRCb2FyZCwgdmlld0JveDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB6b29tID0gYm9hcmQudmlld3BvcnQuem9vbTtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCk7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt2aWV3Qm94WzJdICogem9vbX1weGA7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld0JveFszXSAqIHpvb219cHhgO1xuXG4gICAgaWYgKHZpZXdCb3ggJiYgdmlld0JveFsyXSA+IDAgJiYgdmlld0JveFszXSA+IDApIHtcbiAgICAgICAgaG9zdEVsZW1lbnQuc2V0QXR0cmlidXRlKCd2aWV3Qm94Jywgdmlld0JveC5qb2luKCcgJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0T2Zmc2V0KGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3Qgb3JpZ2luYXRpb24gPSBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uKGJvYXJkKTtcbiAgICBpZiAoIW9yaWdpbmF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3Njcm9sbExlZnQsIHNjcm9sbFRvcF0gPSB0b0hvc3RQb2ludEZyb21WaWV3Qm94UG9pbnQoYm9hcmQsIG9yaWdpbmF0aW9uKTtcbiAgICB1cGRhdGVWaWV3cG9ydENvbnRhaW5lclNjcm9sbChib2FyZCwgc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0Q29udGFpbmVyU2Nyb2xsKGJvYXJkOiBQbGFpdEJvYXJkLCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBpc0Zyb21WaWV3cG9ydENoYW5nZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCB2aWV3cG9ydENvbnRhaW5lciA9IFBsYWl0Qm9hcmQuZ2V0Vmlld3BvcnRDb250YWluZXIoYm9hcmQpO1xuICAgIGNvbnN0IHByZXZpb3VzU2Nyb2xsTGVmdCA9IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcHJldmlvdXNTY3JvbGxUb3AgPSB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgLy8gc2Nyb2xsVG9wIGFzc2lnbiAxMS44IHdpbGwgZ2V0IDExLjUgaW4gY2hyb21lXG4gICAgLy8gc2Nyb2xsVG9wIGFzc2lnbiAxMS44IHdpbGwgZ2V0IDExIGluIGZpcmVmb3gsIHNhZmFyaVxuICAgIC8vIHNjcm9sbFRvcCBhc3NpZ24gMTEuNCB3aWxsIGdldCAxMSBpbiBjaHJvbWUsIGZpcmVmb3gsIHNhZmFyaVxuICAgIC8vIHVzZSBhcHByb3hpbWF0ZWx5IG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIG5ldyB2YWx1ZSBpcyB2YWxpZCB1cGRhdGluZyB0byBhdm9pZCBkZWJvdW5jaW5nXG4gICAgaWYgKCFhcHByb3hpbWF0ZWx5KHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQsIGxlZnQsIDEpIHx8ICFhcHByb3hpbWF0ZWx5KHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFRvcCwgdG9wLCAxKSkge1xuICAgICAgICB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgdmlld3BvcnRDb250YWluZXIuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHZpZXdwb3J0Q29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB2aWV3cG9ydENvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGlmIChwcmV2aW91c1Njcm9sbExlZnQgPT09IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQgJiYgcHJldmlvdXNTY3JvbGxUb3AgPT09IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICAgICAgLy8gVGhlIHNjcm9sbCBldmVudCBjYW5ub3QgYmUgdHJpZ2dlcmVkLCBzbyB0aGUgb3JpZ2luYXRpb24gaXMgbW9kaWZpZWQgZGlyZWN0bHkgYmFzZWQgb24gdGhlIHNjcm9sbCBkaXN0YW5jZS5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXdwb3J0QnlTY3JvbGxpbmcoYm9hcmQsIHByZXZpb3VzU2Nyb2xsTGVmdCwgcHJldmlvdXNTY3JvbGxUb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZExlZnRPclRvcCA9XG4gICAgICAgICAgICAgICAgbGVmdCA+IDAgJiZcbiAgICAgICAgICAgICAgICB0b3AgPiAwICYmXG4gICAgICAgICAgICAgICAgbGVmdCA8IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGggJiZcbiAgICAgICAgICAgICAgICB0b3AgPCB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBvZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaXNGcm9tVmlld3BvcnRDaGFuZ2UgJiYgaXNWYWxpZExlZnRPclRvcCkge1xuICAgICAgICAgICAgICAgIHNldElzRnJvbVZpZXdwb3J0Q2hhbmdlKGJvYXJkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0QnlTY3JvbGxpbmcoYm9hcmQ6IFBsYWl0Qm9hcmQsIHNjcm9sbExlZnQ6IG51bWJlciwgc2Nyb2xsVG9wOiBudW1iZXIpIHtcbiAgICBjb25zdCBvcmlnaW5hdGlvbiA9IHRvVmlld0JveFBvaW50KGJvYXJkLCBbc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wXSk7XG4gICAgaWYgKFBvaW50LmlzRXF1YWxzKG9yaWdpbmF0aW9uLCBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uKGJvYXJkKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBCb2FyZFRyYW5zZm9ybXMudXBkYXRlVmlld3BvcnQoYm9hcmQsIG9yaWdpbmF0aW9uKTtcbiAgICBzZXRJc0Zyb21TY3JvbGxpbmcoYm9hcmQsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVZpZXdwb3J0Q29udGFpbmVyKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRWaWV3cG9ydENvbnRhaW5lclJlY3QoYm9hcmQpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q29udGFpbmVyID0gUGxhaXRCb2FyZC5nZXRWaWV3cG9ydENvbnRhaW5lcihib2FyZCk7XG4gICAgdmlld3BvcnRDb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdmlld3BvcnRDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVWaWV3Qm94KGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3Qgem9vbSA9IGJvYXJkLnZpZXdwb3J0Lnpvb207XG4gICAgY29uc3Qgdmlld0JveCA9IGNhbGNOZXdWaWV3Qm94KGJvYXJkLCB6b29tKTtcbiAgICBzZXRTVkdWaWV3Qm94KGJvYXJkLCB2aWV3Qm94KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdCb3goYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB6b29tID0gYm9hcmQudmlld3BvcnQuem9vbTtcbiAgICBjb25zdCB7IGVsZW1lbnRIb3N0QkJveCwgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCwgd2lkdGgsIGhlaWdodCB9ID0gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkLCB6b29tKTtcbiAgICBcbiAgICAvLyBVc2UgMC41IHJhdGlvIHRvIGNoZWNrIGlmIGNvbnRlbnRzIGFyZSB3aXRoaW4gY3VycmVudCB2aWV3Qm94XG4gICAgY29uc3QgY2hlY2tWaWV3Qm94ID0gY2FsY3VsYXRlVmlld0JveChcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICBjb250YWluZXJXaWR0aCxcbiAgICAgICAgY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB6b29tLFxuICAgICAgICAwLjUgLy8gVXNlIHNtYWxsZXIgcGFkZGluZyByYXRpbyBmb3IgY2hlY2tpbmdcbiAgICApO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IHZpZXdCb3hcbiAgICBjb25zdCBjdXJyZW50Vmlld0JveCA9IGdldFZpZXdCb3goYm9hcmQpO1xuICAgIFxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIG5ldyB2aWV3Qm94IGlzIE5PVCBjb250YWluZWQgd2l0aGluIGN1cnJlbnQgdmlld0JveFxuICAgIGlmIChcbiAgICAgICAgY2hlY2tWaWV3Qm94WzBdIDwgY3VycmVudFZpZXdCb3gueCB8fFxuICAgICAgICBjaGVja1ZpZXdCb3hbMV0gPCBjdXJyZW50Vmlld0JveC55IHx8XG4gICAgICAgIGNoZWNrVmlld0JveFswXSArIGNoZWNrVmlld0JveFsyXSA+IGN1cnJlbnRWaWV3Qm94LnggKyBjdXJyZW50Vmlld0JveC53aWR0aCB8fFxuICAgICAgICBjaGVja1ZpZXdCb3hbMV0gKyBjaGVja1ZpZXdCb3hbM10gPiBjdXJyZW50Vmlld0JveC55ICsgY3VycmVudFZpZXdCb3guaGVpZ2h0XG4gICAgKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB3aXRoIGxhcmdlciBwYWRkaW5nIHJhdGlvXG4gICAgICAgIGNvbnN0IG5ld1ZpZXdCb3ggPSBjYWxjdWxhdGVWaWV3Qm94KFxuICAgICAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICAgICAgICBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBWSUVXUE9SVF9QQURESU5HX1JBVElPXG4gICAgICAgICk7XG4gICAgICAgIHNldFNWR1ZpZXdCb3goYm9hcmQsIG5ld1ZpZXdCb3gpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVWaWV3cG9ydE9mZnNldChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGlmICghYm9hcmQudmlld3BvcnQ/Lm9yaWdpbmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHpvb20gPSBib2FyZC52aWV3cG9ydC56b29tO1xuICAgICAgICBjb25zdCB2aWV3cG9ydENvbnRhaW5lclJlY3QgPSBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgdmlld0JveCA9IGNhbGNOZXdWaWV3Qm94KGJvYXJkLCB6b29tKTtcbiAgICAgICAgY29uc3QgY2VudGVyWCA9IHZpZXdCb3hbMF0gKyB2aWV3Qm94WzJdIC8gMjtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHZpZXdCb3hbMV0gKyB2aWV3Qm94WzNdIC8gMjtcbiAgICAgICAgY29uc3Qgb3JpZ2luYXRpb24gPSBbY2VudGVyWCAtIHZpZXdwb3J0Q29udGFpbmVyUmVjdC53aWR0aCAvIDIgLyB6b29tLCBjZW50ZXJZIC0gdmlld3BvcnRDb250YWluZXJSZWN0LmhlaWdodCAvIDIgLyB6b29tXSBhcyBQb2ludDtcbiAgICAgICAgdXBkYXRlVmlld3BvcnRPcmlnaW5hdGlvbihib2FyZCwgb3JpZ2luYXRpb24pO1xuICAgICAgICB1cGRhdGVWaWV3cG9ydE9mZnNldChib2FyZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlVmlld3BvcnRPZmZzZXQoYm9hcmQpO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlVmlld3BvcnRPcmlnaW5hdGlvbiA9IChib2FyZDogUGxhaXRCb2FyZCwgb3JpZ2luYXRpb246IFBvaW50KSA9PiB7XG4gICAgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04uc2V0KGJvYXJkLCBvcmlnaW5hdGlvbik7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJWaWV3cG9ydE9yaWdpbmF0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04uZGVsZXRlKGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYXRpb24gPSBCT0FSRF9UT19WSUVXUE9SVF9PUklHSU5BVElPTi5nZXQoYm9hcmQpO1xuICAgIGlmIChvcmlnaW5hdGlvbikge1xuICAgICAgICByZXR1cm4gb3JpZ2luYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJvYXJkLnZpZXdwb3J0Lm9yaWdpbmF0aW9uO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc0Zyb21TY3JvbGxpbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gISFJU19GUk9NX1NDUk9MTElORy5nZXQoYm9hcmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldElzRnJvbVNjcm9sbGluZyA9IChib2FyZDogUGxhaXRCb2FyZCwgc3RhdGU6IGJvb2xlYW4pID0+IHtcbiAgICBJU19GUk9NX1NDUk9MTElORy5zZXQoYm9hcmQsIHN0YXRlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Zyb21WaWV3cG9ydENoYW5nZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiAhIUlTX0ZST01fVklFV1BPUlRfQ0hBTkdFLmdldChib2FyZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0SXNGcm9tVmlld3BvcnRDaGFuZ2UgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHN0YXRlOiBib29sZWFuKSA9PiB7XG4gICAgSVNfRlJPTV9WSUVXUE9SVF9DSEFOR0Uuc2V0KGJvYXJkLCBzdGF0ZSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9SZWN0YW5nbGUoYm9hcmQ6IFBsYWl0Qm9hcmQsIGNsaWVudDogUmVjdGFuZ2xlQ2xpZW50KSB7fVxuIl19
@@ -1,27 +0,0 @@
1
- // record richtext type status
2
- export const IS_BOARD_CACHE = new WeakMap();
3
- export const FLUSHING = new WeakMap();
4
- export const NODE_TO_INDEX = new WeakMap();
5
- export const NODE_TO_PARENT = new WeakMap();
6
- export const KEY_TO_ELEMENT_MAP = new WeakMap();
7
- export const NODE_TO_G = new WeakMap();
8
- export const NODE_TO_CONTAINER_G = new WeakMap();
9
- export const IS_TEXT_EDITABLE = new WeakMap();
10
- export const BOARD_TO_ON_CHANGE = new WeakMap();
11
- export const BOARD_TO_AFTER_CHANGE = new WeakMap();
12
- export const BOARD_TO_ROUGH_SVG = new WeakMap();
13
- export const BOARD_TO_HOST = new WeakMap();
14
- export const BOARD_TO_CONTEXT = new WeakMap();
15
- export const IS_BOARD_ALIVE = new WeakMap();
16
- export const BOARD_TO_ELEMENT_HOST = new WeakMap();
17
- export const BOARD_TO_SELECTED_ELEMENT = new WeakMap();
18
- export const BOARD_TO_MOVING_POINT_IN_BOARD = new WeakMap();
19
- export const BOARD_TO_MOVING_POINT = new WeakMap();
20
- export const BOARD_TO_VIEWPORT_ORIGINATION = new WeakMap();
21
- export const BOARD_TO_IS_SELECTION_MOVING = new WeakMap();
22
- // save no standard selected elements
23
- export const BOARD_TO_TEMPORARY_ELEMENTS = new WeakMap();
24
- export const BOARD_TO_MOVING_ELEMENT = new WeakMap();
25
- export const PATH_REFS = new WeakMap();
26
- export const ELEMENT_TO_REF = new WeakMap();
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vhay1tYXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvd2Vhay1tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQXlDLENBQUM7QUFFdkYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXpFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF3QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBaUMsQ0FBQztBQUU3RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBVzdDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBOEIsQ0FBQztBQUVuRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUvRSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQTRELENBQUM7QUFFbkgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFzQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBMkMsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ib2FyZCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IsIFBsYWl0Tm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBQYXRoUmVmIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYXRoLXJlZic7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnRSZWYgfSBmcm9tICcuLi9jb3JlL2VsZW1lbnQvZWxlbWVudC1yZWYnO1xuaW1wb3J0IHsgUGxhaXRCb2FyZENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcblxuLy8gcmVjb3JkIHJpY2h0ZXh0IHR5cGUgc3RhdHVzXG5leHBvcnQgY29uc3QgSVNfQk9BUkRfQ0FDSEUgPSBuZXcgV2Vha01hcDxPYmplY3QsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBGTFVTSElORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBOT0RFX1RPX0lOREVYID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBudW1iZXI+KCk7XG5cbmV4cG9ydCBjb25zdCBOT0RFX1RPX1BBUkVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Tm9kZSwgQW5jZXN0b3I+KCk7XG5cbmV4cG9ydCBjb25zdCBLRVlfVE9fRUxFTUVOVF9NQVAgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBNYXA8U3RyaW5nLCBQbGFpdEVsZW1lbnQ+PigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19HID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBTVkdHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fQ09OVEFJTkVSX0cgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIFNWR0dFbGVtZW50PigpO1xuXG5leHBvcnQgY29uc3QgSVNfVEVYVF9FRElUQUJMRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19PTl9DSEFOR0UgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCAoKSA9PiB2b2lkPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fQUZURVJfQ0hBTkdFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgKCkgPT4gdm9pZD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1JPVUdIX1NWRyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFJvdWdoU1ZHPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fSE9TVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFNWR1NWR0VsZW1lbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19DT05URVhUID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRCb2FyZENvbnRleHQ+KCk7XG5cbmV4cG9ydCBjb25zdCBJU19CT0FSRF9BTElWRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19FTEVNRU5UX0hPU1QgPSBuZXcgV2Vha01hcDxcbiAgICBQbGFpdEJvYXJkLFxuICAgIHtcbiAgICAgICAgbG93ZXJIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgaG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIHVwcGVySG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIHRvcEhvc3Q6IFNWR0dFbGVtZW50O1xuICAgICAgICBhY3RpdmVIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgdmlld3BvcnRDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIH1cbj4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1NFTEVDVEVEX0VMRU1FTlQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnRbXT4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19QT0lOVF9JTl9CT0FSRCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fTU9WSU5HX1BPSU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUG9pbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19WSUVXUE9SVF9PUklHSU5BVElPTiA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fSVNfU0VMRUNUSU9OX01PVklORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbi8vIHNhdmUgbm8gc3RhbmRhcmQgc2VsZWN0ZWQgZWxlbWVudHNcbmV4cG9ydCBjb25zdCBCT0FSRF9UT19URU1QT1JBUllfRUxFTUVOVFMgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCB7IGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXTsgdGltZW91dElkOiBhbnkgfT4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19FTEVNRU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50W10+KCk7XG5cbmV4cG9ydCBjb25zdCBQQVRIX1JFRlM6IFdlYWtNYXA8UGxhaXRCb2FyZCwgU2V0PFBhdGhSZWY+PiA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBFTEVNRU5UX1RPX1JFRjogV2Vha01hcDxQbGFpdEVsZW1lbnQsIFBsYWl0RWxlbWVudFJlZj4gPSBuZXcgV2Vha01hcCgpO1xuIl19
@@ -1,166 +0,0 @@
1
- import { PlaitGroupElement } from '../interfaces';
2
- import { getElementsIndices } from './common';
3
- import { getEditingGroup, getElementsInGroup, getGroupByElement, getHighestGroup, isSelectedAllElementsInGroup } from './group';
4
- import { findIndex, findLastIndex } from './helper';
5
- import { sortElements } from './position';
6
- import { getSelectedElements } from './selected-element';
7
- export const getOneMoveOptions = (board, direction) => {
8
- const indicesToMove = getElementsIndices(board, getSelectedElements(board));
9
- let groupedIndices = toContiguousGroups(board, indicesToMove);
10
- if (direction === 'up') {
11
- groupedIndices = groupedIndices.reverse();
12
- }
13
- let moveContents = [];
14
- groupedIndices.forEach((indices, i) => {
15
- const leadingIndex = indices[0];
16
- const trailingIndex = indices[indices.length - 1];
17
- const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
18
- const targetIndex = getTargetIndex(board, boundaryIndex, direction);
19
- if (targetIndex === -1 || boundaryIndex === targetIndex) {
20
- return;
21
- }
22
- if (direction === 'down') {
23
- indices = indices.reverse();
24
- }
25
- moveContents.push(...indices.map(path => {
26
- return {
27
- element: board.children[path],
28
- newPath: [targetIndex]
29
- };
30
- }));
31
- });
32
- return moveContents;
33
- };
34
- export const getAllMoveOptions = (board, direction) => {
35
- const indicesToMove = getElementsIndices(board, getSelectedElements(board));
36
- let groupedIndices = toContiguousGroups(board, indicesToMove);
37
- let moveContents = [];
38
- if (direction === 'down') {
39
- groupedIndices = groupedIndices.reverse();
40
- }
41
- groupedIndices.forEach(indices => {
42
- const leadingIndex = indices[0];
43
- const trailingIndex = indices[indices.length - 1];
44
- const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
45
- const sourceElement = board.children[boundaryIndex];
46
- const editingGroup = getEditingGroup(board, sourceElement);
47
- let targetIndex = direction === 'down' ? 0 : board.children.length - 1;
48
- if (editingGroup) {
49
- const elementsInGroup = sortElements(board, getElementsInGroup(board, editingGroup, true, true));
50
- targetIndex =
51
- direction === 'down'
52
- ? board.children.indexOf(elementsInGroup[0])
53
- : board.children.indexOf(elementsInGroup[elementsInGroup.length - 1]);
54
- }
55
- if (direction === 'down') {
56
- indices = indices.reverse();
57
- }
58
- moveContents.push(...indices.map(path => {
59
- return {
60
- element: board.children[path],
61
- newPath: [targetIndex]
62
- };
63
- }));
64
- });
65
- return moveContents;
66
- };
67
- export const canSetZIndex = (board) => {
68
- const selectedElements = getSelectedElements(board).filter(item => board.canSetZIndex(item));
69
- return selectedElements.length > 0;
70
- };
71
- const toContiguousGroups = (board, array) => {
72
- let cursor = 0;
73
- return array.reduce((acc, value, index) => {
74
- if (index > 0) {
75
- const currentElement = board.children[value];
76
- const previousElement = board.children[array[index - 1]];
77
- const isContiguous = value - 1 === array[index - 1]
78
- ? true
79
- : board.children.every((item, childIndex) => {
80
- if (childIndex > array[index - 1] && childIndex <= value - 1) {
81
- return PlaitGroupElement.isGroup(item);
82
- }
83
- return true;
84
- });
85
- let isPartialSelectGroupElement = false;
86
- if (previousElement?.groupId || (currentElement?.groupId && previousElement?.groupId !== currentElement?.groupId)) {
87
- let isPartialSelectPreviousGroup = false;
88
- let isPartialSelectCurrentElement = false;
89
- if (previousElement.groupId) {
90
- const highestGroup = getHighestGroup(board, previousElement);
91
- isPartialSelectPreviousGroup = !isSelectedAllElementsInGroup(board, highestGroup);
92
- }
93
- if (currentElement.groupId) {
94
- const highestGroup = getHighestGroup(board, currentElement);
95
- isPartialSelectCurrentElement = !isSelectedAllElementsInGroup(board, highestGroup);
96
- }
97
- isPartialSelectGroupElement = isPartialSelectPreviousGroup || isPartialSelectCurrentElement;
98
- }
99
- if (!isContiguous || isPartialSelectGroupElement) {
100
- cursor = ++cursor;
101
- }
102
- }
103
- (acc[cursor] || (acc[cursor] = [])).push(value);
104
- return acc;
105
- }, []);
106
- };
107
- /**
108
- * Returns next candidate index that's available to be moved to. Currently that
109
- * is a non-deleted element, and not inside a group (unless we're editing it).
110
- */
111
- const getTargetIndex = (board, boundaryIndex, direction) => {
112
- if ((boundaryIndex === 0 && direction === 'down') || (boundaryIndex === board.children.length - 1 && direction === 'up')) {
113
- return -1;
114
- }
115
- const indexFilter = (element) => {
116
- if (element.isDeleted || PlaitGroupElement.isGroup(element)) {
117
- return false;
118
- }
119
- return true;
120
- };
121
- const candidateIndex = direction === 'down'
122
- ? findLastIndex(board.children, el => indexFilter(el), Math.max(0, boundaryIndex - 1))
123
- : findIndex(board.children, el => indexFilter(el), boundaryIndex + 1);
124
- const nextElement = board.children[candidateIndex];
125
- if (!nextElement) {
126
- return -1;
127
- }
128
- const elements = [...board.children];
129
- const sourceElement = elements[boundaryIndex];
130
- const editingGroup = getEditingGroup(board, sourceElement);
131
- const nextElementGroups = (getGroupByElement(board, nextElement, true) || []);
132
- // candidate element is a sibling in current editing group → return
133
- if (editingGroup && sourceElement?.groupId !== nextElement?.groupId) {
134
- // candidate element is outside current editing group → prevent
135
- if (!nextElementGroups.find(item => item.id === editingGroup.id)) {
136
- return -1;
137
- }
138
- }
139
- if (!nextElement.groupId) {
140
- return candidateIndex;
141
- }
142
- let siblingGroup;
143
- if (editingGroup) {
144
- siblingGroup = nextElementGroups[nextElementGroups.indexOf(editingGroup) - 1];
145
- }
146
- else {
147
- siblingGroup = nextElementGroups[nextElementGroups.length - 1];
148
- }
149
- if (siblingGroup) {
150
- let elementsInSiblingGroup = getElementsInGroup(board, siblingGroup, true, false);
151
- if (elementsInSiblingGroup.length) {
152
- elementsInSiblingGroup.sort((a, b) => {
153
- const indexA = board.children.findIndex(child => child.id === a.id);
154
- const indexB = board.children.findIndex(child => child.id === b.id);
155
- return indexA - indexB;
156
- });
157
- // assumes getElementsInGroup() returned elements are sorted
158
- // by zIndex (ascending)
159
- return direction === 'down'
160
- ? elements.indexOf(elementsInSiblingGroup[0])
161
- : elements.indexOf(elementsInSiblingGroup[elementsInSiblingGroup.length - 1]);
162
- }
163
- }
164
- return candidateIndex;
165
- };
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiei1pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3otaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQWtCLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQXdCLEVBQW9CLEVBQUU7SUFDL0YsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksWUFBWSxHQUFxQixFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8s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SixZQUFZLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2YsSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNERBQTREO1lBQzVELHdCQUF3QjtZQUN4QixPQUFPLFNBQVMsS0FBSyxNQUFNO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0R3JvdXBFbGVtZW50LCBQbGFpdEdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb3ZlTm9kZU9wdGlvbiwgZ2V0RWxlbWVudHNJbmRpY2VzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RWRpdGluZ0dyb3VwLCBnZXRFbGVtZW50c0luR3JvdXAsIGdldEdyb3VwQnlFbGVtZW50LCBnZXRIaWdoZXN0R3JvdXAsIGlzU2VsZWN0ZWRBbGxFbGVtZW50c0luR3JvdXAgfSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCwgZmluZExhc3RJbmRleCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IHNvcnRFbGVtZW50cyB9IGZyb20gJy4vcG9zaXRpb24nO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4vc2VsZWN0ZWQtZWxlbWVudCc7XG5cbmV4cG9ydCBjb25zdCBnZXRPbmVNb3ZlT3B0aW9ucyA9IChib2FyZDogUGxhaXRCb2FyZCwgZGlyZWN0aW9uOiAnZG93bicgfCAndXAnKTogTW92ZU5vZGVPcHRpb25bXSA9PiB7XG4gICAgY29uc3QgaW5kaWNlc1RvTW92ZSA9IGdldEVsZW1lbnRzSW5kaWNlcyhib2FyZCwgZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkpO1xuICAgIGxldCBncm91cGVkSW5kaWNlcyA9IHRvQ29udGlndW91c0dyb3Vwcyhib2FyZCwgaW5kaWNlc1RvTW92ZSk7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBncm91cGVkSW5kaWNlcyA9IGdyb3VwZWRJbmRpY2VzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgbGV0IG1vdmVDb250ZW50czogTW92ZU5vZGVPcHRpb25bXSA9IFtdO1xuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goKGluZGljZXMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGVhZGluZ0luZGV4ID0gaW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlJbmRleCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gbGVhZGluZ0luZGV4IDogdHJhaWxpbmdJbmRleDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBnZXRUYXJnZXRJbmRleChib2FyZCwgYm91bmRhcnlJbmRleCwgZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBib3VuZGFyeUluZGV4ID09PSB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICAgICAgaW5kaWNlcyA9IGluZGljZXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdmVDb250ZW50cy5wdXNoKFxuICAgICAgICAgICAgLi4uaW5kaWNlcy5tYXAocGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogYm9hcmQuY2hpbGRyZW5bcGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGg6IFt0YXJnZXRJbmRleF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtb3ZlQ29udGVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsTW92ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJyk6IE1vdmVOb2RlT3B0aW9uW10gPT4ge1xuICAgIGNvbnN0IGluZGljZXNUb01vdmUgPSBnZXRFbGVtZW50c0luZGljZXMoYm9hcmQsIGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpKTtcbiAgICBsZXQgZ3JvdXBlZEluZGljZXMgPSB0b0NvbnRpZ3VvdXNHcm91cHMoYm9hcmQsIGluZGljZXNUb01vdmUpO1xuICAgIGxldCBtb3ZlQ29udGVudHM6IE1vdmVOb2RlT3B0aW9uW10gPSBbXTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgZ3JvdXBlZEluZGljZXMgPSBncm91cGVkSW5kaWNlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goaW5kaWNlcyA9PiB7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdJbmRleCA9IGluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGJvdW5kYXJ5SW5kZXggPSBkaXJlY3Rpb24gPT09ICdkb3duJyA/IGxlYWRpbmdJbmRleCA6IHRyYWlsaW5nSW5kZXg7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBib2FyZC5jaGlsZHJlbltib3VuZGFyeUluZGV4XTtcbiAgICAgICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gZGlyZWN0aW9uID09PSAnZG93bicgPyAwIDogYm9hcmQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gc29ydEVsZW1lbnRzKGJvYXJkLCBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGVkaXRpbmdHcm91cCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPVxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2Rvd24nXG4gICAgICAgICAgICAgICAgICAgID8gYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbMF0pXG4gICAgICAgICAgICAgICAgICAgIDogYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbZWxlbWVudHNJbkdyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBpbmRpY2VzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlQ29udGVudHMucHVzaChcbiAgICAgICAgICAgIC4uLmluZGljZXMubWFwKHBhdGggPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGJvYXJkLmNoaWxkcmVuW3BhdGhdLFxuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoOiBbdGFyZ2V0SW5kZXhdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW92ZUNvbnRlbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldFpJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKS5maWx0ZXIoaXRlbSA9PiBib2FyZC5jYW5TZXRaSW5kZXgoaXRlbSkpO1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDA7XG59O1xuXG5jb25zdCB0b0NvbnRpZ3VvdXNHcm91cHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGFycmF5OiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bdmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bYXJyYXlbaW5kZXggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBpc0NvbnRpZ3VvdXMgPVxuICAgICAgICAgICAgICAgIHZhbHVlIC0gMSA9PT0gYXJyYXlbaW5kZXggLSAxXVxuICAgICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgICAgOiBib2FyZC5jaGlsZHJlbi5ldmVyeSgoaXRlbSwgY2hpbGRJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGFycmF5W2luZGV4IC0gMV0gJiYgY2hpbGRJbmRleCA8PSB2YWx1ZSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudD8uZ3JvdXBJZCB8fCAoY3VycmVudEVsZW1lbnQ/Lmdyb3VwSWQgJiYgcHJldmlvdXNFbGVtZW50Py5ncm91cElkICE9PSBjdXJyZW50RWxlbWVudD8uZ3JvdXBJZCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXN0R3JvdXAgPSBnZXRIaWdoZXN0R3JvdXAoYm9hcmQsIHByZXZpb3VzRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFNlbGVjdFByZXZpb3VzR3JvdXAgPSAhaXNTZWxlY3RlZEFsbEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGlnaGVzdEdyb3VwISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RHcm91cCA9IGdldEhpZ2hlc3RHcm91cChib2FyZCwgY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9ICFpc1NlbGVjdGVkQWxsRWxlbWVudHNJbkdyb3VwKGJvYXJkLCBoaWdoZXN0R3JvdXAhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQYXJ0aWFsU2VsZWN0R3JvdXBFbGVtZW50ID0gaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCB8fCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb250aWd1b3VzIHx8IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGN1cnNvciA9ICsrY3Vyc29yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChhY2NbY3Vyc29yXSB8fCAoYWNjW2N1cnNvcl0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIG51bWJlcltdW10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIG5leHQgY2FuZGlkYXRlIGluZGV4IHRoYXQncyBhdmFpbGFibGUgdG8gYmUgbW92ZWQgdG8uIEN1cnJlbnRseSB0aGF0XG4gKiAgaXMgYSBub24tZGVsZXRlZCBlbGVtZW50LCBhbmQgbm90IGluc2lkZSBhIGdyb3VwICh1bmxlc3Mgd2UncmUgZWRpdGluZyBpdCkuXG4gKi9cbmNvbnN0IGdldFRhcmdldEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBib3VuZGFyeUluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJykgPT4ge1xuICAgIGlmICgoYm91bmRhcnlJbmRleCA9PT0gMCAmJiBkaXJlY3Rpb24gPT09ICdkb3duJykgfHwgKGJvdW5kYXJ5SW5kZXggPT09IGJvYXJkLmNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID09PSAndXAnKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4RmlsdGVyID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5pc0RlbGV0ZWQgfHwgUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgY29uc3QgY2FuZGlkYXRlSW5kZXggPVxuICAgICAgICBkaXJlY3Rpb24gPT09ICdkb3duJ1xuICAgICAgICAgICAgPyBmaW5kTGFzdEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIE1hdGgubWF4KDAsIGJvdW5kYXJ5SW5kZXggLSAxKSlcbiAgICAgICAgICAgIDogZmluZEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIGJvdW5kYXJ5SW5kZXggKyAxKTtcblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bY2FuZGlkYXRlSW5kZXhdO1xuICAgIGlmICghbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmJvYXJkLmNoaWxkcmVuXTtcbiAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gZWxlbWVudHNbYm91bmRhcnlJbmRleF07XG4gICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0RWxlbWVudEdyb3VwcyA9IChnZXRHcm91cEJ5RWxlbWVudChib2FyZCwgbmV4dEVsZW1lbnQsIHRydWUpIHx8IFtdKSBhcyBQbGFpdEdyb3VwW107XG4gICAgLy8gY2FuZGlkYXRlIGVsZW1lbnQgaXMgYSBzaWJsaW5nIGluIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcmV0dXJuXG4gICAgaWYgKGVkaXRpbmdHcm91cCAmJiBzb3VyY2VFbGVtZW50Py5ncm91cElkICE9PSBuZXh0RWxlbWVudD8uZ3JvdXBJZCkge1xuICAgICAgICAvLyBjYW5kaWRhdGUgZWxlbWVudCBpcyBvdXRzaWRlIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcHJldmVudFxuICAgICAgICBpZiAoIShuZXh0RWxlbWVudEdyb3VwcyBhcyBQbGFpdEdyb3VwW10pLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBlZGl0aW5nR3JvdXAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5leHRFbGVtZW50Lmdyb3VwSWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZUluZGV4O1xuICAgIH1cblxuICAgIGxldCBzaWJsaW5nR3JvdXA6IFBsYWl0R3JvdXA7XG4gICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5pbmRleE9mKGVkaXRpbmdHcm91cCkgLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgaWYgKHNpYmxpbmdHcm91cCkge1xuICAgICAgICBsZXQgZWxlbWVudHNJblNpYmxpbmdHcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgc2libGluZ0dyb3VwLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGlmIChlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHNJblNpYmxpbmdHcm91cC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhBID0gYm9hcmQuY2hpbGRyZW4uZmluZEluZGV4KGNoaWxkID0+IGNoaWxkLmlkID09PSBhLmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleEIgPSBib2FyZC5jaGlsZHJlbi5maW5kSW5kZXgoY2hpbGQgPT4gY2hpbGQuaWQgPT09IGIuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGFzc3VtZXMgZ2V0RWxlbWVudHNJbkdyb3VwKCkgcmV0dXJuZWQgZWxlbWVudHMgYXJlIHNvcnRlZFxuICAgICAgICAgICAgLy8gYnkgekluZGV4IChhc2NlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnZG93bidcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFswXSlcbiAgICAgICAgICAgICAgICA6IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFtlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDtcbn07XG4iXX0=