@libs-ui/services-grid-layout 0.2.357-19 → 0.2.357-21

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.
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Checks whether the rectangular region [x, x + cols) x [y, y + rows)
3
+ * is completely vacant among existing items.
4
+ */
5
+ export const isRegionFree = (children, x, y, cols, rows, ignoredId) => {
6
+ for (const child of children) {
7
+ if (ignoredId && child.id === ignoredId) {
8
+ continue;
9
+ }
10
+ const hOverlap = !(child.x + child.cols <= x || child.x >= x + cols);
11
+ const vOverlap = !(child.y + child.rows <= y || child.y >= y + rows);
12
+ if (hOverlap && vOverlap) {
13
+ return false;
14
+ }
15
+ }
16
+ return true;
17
+ };
18
+ /**
19
+ * Computes optimal (col, row) inside a group container.
20
+ * Snaps flush to adjacent card right edge if slot is vacant.
21
+ */
22
+ export const findSnapPositionInsideGroup = (children, rawCol, rawRow, innerCols, innerRows, totalCols = 24) => {
23
+ let bestCandidate;
24
+ for (const child of children) {
25
+ const rightEdge = child.x + child.cols;
26
+ const canFit = rightEdge + innerCols <= totalCols;
27
+ const isFree = canFit && isRegionFree(children, rightEdge, child.y, innerCols, innerRows);
28
+ if (!isFree) {
29
+ continue;
30
+ }
31
+ const nearX = Math.abs(rawCol - rightEdge) <= 2 || (rawCol >= child.x + Math.floor(child.cols / 2) && rawCol <= rightEdge + 1);
32
+ const nearY = Math.abs(rawRow - child.y) <= 2;
33
+ if (nearX && nearY) {
34
+ const dist = Math.abs(rawCol - rightEdge) + Math.abs(rawRow - child.y);
35
+ if (!bestCandidate || dist < bestCandidate.dist) {
36
+ bestCandidate = { col: rightEdge, row: child.y, dist };
37
+ }
38
+ }
39
+ }
40
+ if (bestCandidate) {
41
+ return { col: bestCandidate.col, row: bestCandidate.row };
42
+ }
43
+ const clampedCol = Math.max(0, Math.min(totalCols - innerCols, rawCol));
44
+ const clampedRow = Math.max(0, rawRow);
45
+ return { col: clampedCol, row: clampedRow };
46
+ };
47
+ /**
48
+ * Adjusts position of pair if horizontal overlap occurs.
49
+ */
50
+ const adjustItemPair = (a, b) => {
51
+ const hOverlap = !(a.x + a.cols <= b.x || a.x >= b.x + b.cols);
52
+ if (hOverlap && b.y < a.y + a.rows) {
53
+ b.y = a.y + a.rows;
54
+ return true;
55
+ }
56
+ return false;
57
+ };
58
+ /**
59
+ * Resolves vertical collisions when inserting a new card at (newNode.x, newNode.y).
60
+ * Any existing card that horizontally overlaps and whose vertical span overlaps
61
+ * or is below the insertion point is pushed down so there is no overlap.
62
+ */
63
+ export const resolveCollisionsAndInsert = (children, newNode) => {
64
+ const items = [...children];
65
+ for (const item of items) {
66
+ const hOverlap = !(item.x + item.cols <= newNode.x || item.x >= newNode.x + newNode.cols);
67
+ const vOverlap = !(item.y + item.rows <= newNode.y || item.y >= newNode.y + newNode.rows);
68
+ if (hOverlap && vOverlap) {
69
+ item.y = newNode.y + newNode.rows;
70
+ }
71
+ }
72
+ items.sort((a, b) => a.y - b.y);
73
+ let changed = true;
74
+ while (changed) {
75
+ changed = false;
76
+ for (let i = 0; i < items.length; i++) {
77
+ for (let j = i + 1; j < items.length; j++) {
78
+ changed = adjustItemPair(items[i], items[j]) || changed;
79
+ }
80
+ }
81
+ }
82
+ children.push(newNode);
83
+ };
84
+ export function parseDropPayload(activePayload, dataTransfer) {
85
+ if (activePayload) {
86
+ return activePayload;
87
+ }
88
+ if (dataTransfer) {
89
+ try {
90
+ const raw = dataTransfer.getData('application/json');
91
+ if (raw) {
92
+ return JSON.parse(raw);
93
+ }
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ export const findHoveredGroup = (elements, canvasContainer, root) => {
102
+ const rootGridster = canvasContainer.querySelector('gridster');
103
+ for (const el of elements) {
104
+ const gridsterEl = (el.tagName.toLowerCase() === 'gridster' ? el : el.closest('gridster'));
105
+ if (gridsterEl && gridsterEl !== rootGridster) {
106
+ const outerItem = gridsterEl.closest('gridster-item');
107
+ const rootItems = rootGridster ? Array.from(rootGridster.querySelectorAll(':scope > gridster-item')) : [];
108
+ const idx = outerItem ? rootItems.indexOf(outerItem) : -1;
109
+ if (idx >= 0 && root.children?.[idx]) {
110
+ return { groupNode: root.children[idx], groupGridster: gridsterEl };
111
+ }
112
+ }
113
+ }
114
+ for (const el of elements) {
115
+ const itemEl = el.tagName.toLowerCase() === 'gridster-item' ? el : el.closest('gridster-item');
116
+ if (!itemEl) {
117
+ continue;
118
+ }
119
+ const rootItems = rootGridster ? Array.from(rootGridster.querySelectorAll(':scope > gridster-item')) : [];
120
+ const idx = rootItems.indexOf(itemEl);
121
+ if (idx >= 0 && root.children?.[idx]) {
122
+ const node = root.children[idx];
123
+ if ((node.children?.length ?? 0) > 0) {
124
+ return { groupNode: node, groupGridster: itemEl.querySelector('gridster') ?? itemEl };
125
+ }
126
+ }
127
+ }
128
+ return undefined;
129
+ };
130
+ /**
131
+ * Calculates snapped spatial coordinates and pixel dimensions for drop ghost preview box.
132
+ */
133
+ export const calculateDropGhost = (event, canvasContainer, root, payload, totalCols = 24) => {
134
+ if (typeof document === 'undefined' || !canvasContainer) {
135
+ return undefined;
136
+ }
137
+ const cardTitle = payload.title || 'Thẻ';
138
+ const cardIconClass = payload.iconClass;
139
+ const cardIconText = payload.iconText;
140
+ const payloadAny = payload;
141
+ let defaultCols = typeof payload.cols === 'number'
142
+ ? payload.cols
143
+ : (typeof payloadAny['defaultCols'] === 'number' ? payloadAny['defaultCols'] : (totalCols >= 24 ? 12 : 6));
144
+ let defaultRows = typeof payload.rows === 'number'
145
+ ? payload.rows
146
+ : (typeof payloadAny['defaultRows'] === 'number' ? payloadAny['defaultRows'] : 4);
147
+ if (typeof payloadAny['resolveNode'] === 'function') {
148
+ try {
149
+ const sample = payloadAny['resolveNode'](false);
150
+ if (sample) {
151
+ if (typeof sample.cols === 'number') {
152
+ defaultCols = sample.cols;
153
+ }
154
+ if (typeof sample.rows === 'number') {
155
+ defaultRows = sample.rows;
156
+ }
157
+ }
158
+ }
159
+ catch {
160
+ // fallback to default cols and rows
161
+ }
162
+ }
163
+ const stageEl = canvasContainer.querySelector('#bi-canvas-stage') ?? canvasContainer;
164
+ const stageRect = stageEl.getBoundingClientRect();
165
+ const rootGridster = stageEl.querySelector('gridster');
166
+ const gridsterEl = rootGridster ?? stageEl;
167
+ const gridsterRect = gridsterEl.getBoundingClientRect();
168
+ const unscaledWidth = gridsterEl.offsetWidth || gridsterEl.clientWidth || 0;
169
+ const zoom = (gridsterRect.width && unscaledWidth > 0)
170
+ ? Math.max(0.2, Math.min(3, gridsterRect.width / unscaledWidth))
171
+ : 1;
172
+ const elements = typeof document.elementsFromPoint === 'function'
173
+ ? document.elementsFromPoint(event.clientX, event.clientY)
174
+ : [];
175
+ const hovered = findHoveredGroup(elements, canvasContainer, root);
176
+ const stageMouseX = (event.clientX - stageRect.left) / zoom;
177
+ const stageMouseY = (event.clientY - stageRect.top) / zoom;
178
+ if (hovered) {
179
+ const { groupNode, groupGridster } = hovered;
180
+ const groupGridsterRect = groupGridster.getBoundingClientRect();
181
+ const groupStageLeft = (groupGridsterRect.left - stageRect.left) / zoom;
182
+ const groupStageTop = (groupGridsterRect.top - stageRect.top) / zoom;
183
+ let innerCols = defaultCols;
184
+ let innerRows = defaultRows;
185
+ if (typeof payloadAny['resolveNode'] === 'function') {
186
+ try {
187
+ const sampleInside = payloadAny['resolveNode'](true);
188
+ if (sampleInside) {
189
+ if (typeof sampleInside.cols === 'number') {
190
+ innerCols = sampleInside.cols;
191
+ }
192
+ if (typeof sampleInside.rows === 'number') {
193
+ innerRows = sampleInside.rows;
194
+ }
195
+ }
196
+ }
197
+ catch {
198
+ // fallback to default cols and rows
199
+ }
200
+ }
201
+ innerCols = Math.min(innerCols, totalCols);
202
+ const groupWidth = groupGridster.clientWidth || (groupGridsterRect.width / zoom) || 400;
203
+ const colStep = (groupWidth + 2) / totalCols;
204
+ const rowStep = 18;
205
+ const relX = (event.clientX - groupGridsterRect.left) / zoom + groupGridster.scrollLeft;
206
+ const relY = (event.clientY - groupGridsterRect.top) / zoom + groupGridster.scrollTop;
207
+ const rawCol = Math.floor(relX / colStep);
208
+ const rawRow = Math.floor(relY / rowStep);
209
+ const snap = findSnapPositionInsideGroup(groupNode.children ?? [], rawCol, rawRow, innerCols, innerRows, totalCols);
210
+ return {
211
+ col: snap.col,
212
+ row: snap.row,
213
+ cols: innerCols,
214
+ rows: innerRows,
215
+ pixelLeft: groupStageLeft + snap.col * colStep,
216
+ pixelTop: groupStageTop + snap.row * rowStep,
217
+ pixelWidth: Math.max(30, innerCols * colStep - 2),
218
+ pixelHeight: Math.max(20, innerRows * rowStep - 2),
219
+ isInsideGroup: true,
220
+ targetParentId: groupNode.id,
221
+ groupTitle: 'Khối ghép',
222
+ cardTitle,
223
+ cardIconClass,
224
+ cardIconText,
225
+ hoveredGridster: groupGridster,
226
+ };
227
+ }
228
+ const margin = 12;
229
+ const rowStep = 68;
230
+ const gridsterWidth = unscaledWidth || gridsterEl.clientWidth || 1200;
231
+ const colStep = Math.max(20, (gridsterWidth - margin) / totalCols);
232
+ const gridsterStageLeft = (gridsterRect.left - stageRect.left) / zoom;
233
+ const gridsterStageTop = (gridsterRect.top - stageRect.top) / zoom;
234
+ const relX = stageMouseX - gridsterStageLeft + gridsterEl.scrollLeft - margin;
235
+ const relY = stageMouseY - gridsterStageTop + gridsterEl.scrollTop - margin;
236
+ const itemCols = Math.min(defaultCols, totalCols);
237
+ const col = Math.max(0, Math.min(totalCols - itemCols, Math.floor(relX / colStep)));
238
+ const row = Math.max(0, Math.floor(relY / rowStep));
239
+ return {
240
+ col,
241
+ row,
242
+ cols: itemCols,
243
+ rows: defaultRows,
244
+ pixelLeft: gridsterStageLeft + margin + col * colStep,
245
+ pixelTop: gridsterStageTop + margin + row * rowStep,
246
+ pixelWidth: itemCols * colStep - margin,
247
+ pixelHeight: defaultRows * rowStep - margin,
248
+ isInsideGroup: false,
249
+ cardTitle,
250
+ cardIconClass,
251
+ cardIconText,
252
+ hoveredGridster: rootGridster ?? undefined,
253
+ };
254
+ };
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGlzaW9uLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvY29sbGlzaW9uLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FDMUIsUUFBa0MsRUFDbEMsQ0FBUyxFQUNULENBQVMsRUFDVCxJQUFZLEVBQ1osSUFBWSxFQUNaLFNBQWtCLEVBQ1QsRUFBRTtJQUNYLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXJFLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLFFBQWtDLEVBQ2xDLE1BQWMsRUFDZCxNQUFjLEVBQ2QsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsU0FBUyxHQUFHLEVBQUUsRUFDZ0IsRUFB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LElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELE9BQU87UUFDTCxHQUFHO1FBQ0gsR0FBRztRQUNILElBQUksRUFBRSxRQUFRO1FBQ2QsSUFBSSxFQUFFLFdBQVc7UUFDakIsU0FBUyxFQUFFLGlCQUFpQixHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTztRQUNyRCxRQUFRLEVBQUUsZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPO1FBQ25ELFVBQVUsRUFBRSxRQUFRLEdBQUcsT0FBTyxHQUFHLE1BQU07UUFDdkMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLEdBQUcsTUFBTTtRQUMzQyxhQUFhLEVBQUUsS0FBSztRQUNwQixTQUFTO1FBQ1QsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlLEVBQUcsWUFBNEIsSUFBSSxTQUFTO0tBQzVELENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25ld05vZGUsXG4gIFRfZ3JpZExheW91dF9ub2RlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyaWQtbGF5b3V0LmludGVyZmFjZSc7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBbeCwgeCArIGNvbHMpIHggW3ksIHkgKyByb3dzKVxuICogaXMgY29tcGxldGVseSB2YWNhbnQgYW1vbmcgZXhpc3RpbmcgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JlZ2lvbkZyZWUgPSAoXG4gIGNoaWxkcmVuOiBBcnJheTxUX2dyaWRMYXlvdXRfbm9kZT4sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBjb2xzOiBudW1iZXIsXG4gIHJvd3M6IG51bWJlcixcbiAgaWdub3JlZElkPzogc3RyaW5nLFxuKTogYm9vbGVhbiA9PiB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICBpZiAoaWdub3JlZElkICYmIGNoaWxkLmlkID09PSBpZ25vcmVkSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBoT3ZlcmxhcCA9ICEoY2hpbGQueCArIGNoaWxkLmNvbHMgPD0geCB8fCBjaGlsZC54ID49IHggKyBjb2xzKTtcbiAgICBjb25zdCB2T3ZlcmxhcCA9ICEoY2hpbGQueSArIGNoaWxkLnJvd3MgPD0geSB8fCBjaGlsZC55ID49IHkgKyByb3dzKTtcblxuICAgIGlmIChoT3ZlcmxhcCAmJiB2T3ZlcmxhcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyBvcHRpbWFsIChjb2wsIHJvdykgaW5zaWRlIGEgZ3JvdXAgY29udGFpbmVyLlxuICogU25hcHMgZmx1c2ggdG8gYWRqYWNlbnQgY2FyZCByaWdodCBlZGdlIGlmIHNsb3QgaXMgdmFjYW50LlxuICovXG5leHBvcnQgY29uc3QgZmluZFNuYXBQb3NpdGlvbkluc2lkZUdyb3VwID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICByYXdDb2w6IG51bWJlcixcbiAgcmF3Um93OiBudW1iZXIsXG4gIGlubmVyQ29sczogbnVtYmVyLFxuICBpbm5lclJvd3M6IG51bWJlcixcbiAgdG90YWxDb2xzID0gMjQsXG4pOiB7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9ID0+IHtcbiAgbGV0IGJlc3RDYW5kaWRhdGU6IHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBkaXN0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgcmlnaHRFZGdlID0gY2hpbGQueCArIGNoaWxkLmNvbHM7XG4gICAgY29uc3QgY2FuRml0ID0gcmlnaHRFZGdlICsgaW5uZXJDb2xzIDw9IHRvdGFsQ29scztcbiAgICBjb25zdCBpc0ZyZWUgPSBjYW5GaXQgJiYgaXNSZWdpb25GcmVlKGNoaWxkcmVuLCByaWdodEVkZ2UsIGNoaWxkLnksIGlubmVyQ29scywgaW5uZXJSb3dzKTtcblxuICAgIGlmICghaXNGcmVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZWFyWCA9IE1hdGguYWJzKHJhd0NvbCAtIHJpZ2h0RWRnZSkgPD0gMiB8fCAocmF3Q29sID49IGNoaWxkLnggKyBNYXRoLmZsb29yKGNoaWxkLmNvbHMgLyAyKSAmJiByYXdDb2wgPD0gcmlnaHRFZGdlICsgMSk7XG4gICAgY29uc3QgbmVhclkgPSBNYXRoLmFicyhyYXdSb3cgLSBjaGlsZC55KSA8PSAyO1xuXG4gICAgaWYgKG5lYXJYICYmIG5lYXJZKSB7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5hYnMocmF3Q29sIC0gcmlnaHRFZGdlKSArIE1hdGguYWJzKHJhd1JvdyAtIGNoaWxkLnkpO1xuXG4gICAgICBpZiAoIWJlc3RDYW5kaWRhdGUgfHwgZGlzdCA8IGJlc3RDYW5kaWRhdGUuZGlzdCkge1xuICAgICAgICBiZXN0Q2FuZGlkYXRlID0geyBjb2w6IHJpZ2h0RWRnZSwgcm93OiBjaGlsZC55LCBkaXN0IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGJlc3RDYW5kaWRhdGUpIHtcbiAgICByZXR1cm4geyBjb2w6IGJlc3RDYW5kaWRhdGUuY29sLCByb3c6IGJlc3RDYW5kaWRhdGUucm93IH07XG4gIH1cblxuICBjb25zdCBjbGFtcGVkQ29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG90YWxDb2xzIC0gaW5uZXJDb2xzLCByYXdDb2wpKTtcbiAgY29uc3QgY2xhbXBlZFJvdyA9IE1hdGgubWF4KDAsIHJhd1Jvdyk7XG5cbiAgcmV0dXJuIHsgY29sOiBjbGFtcGVkQ29sLCByb3c6IGNsYW1wZWRSb3cgfTtcbn07XG5cbi8qKlxuICogQWRqdXN0cyBwb3NpdGlvbiBvZiBwYWlyIGlmIGhvcml6b250YWwgb3ZlcmxhcCBvY2N1cnMuXG4gKi9cbmNvbnN0IGFkanVzdEl0ZW1QYWlyID0gKGE6IFRfZ3JpZExheW91dF9ub2RlLCBiOiBUX2dyaWRMYXlvdXRfbm9kZSk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBoT3ZlcmxhcCA9ICEoYS54ICsgYS5jb2xzIDw9IGIueCB8fCBhLnggPj0gYi54ICsgYi5jb2xzKTtcblxuICBpZiAoaE92ZXJsYXAgJiYgYi55IDwgYS55ICsgYS5yb3dzKSB7XG4gICAgYi55ID0gYS55ICsgYS5yb3dzO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHZlcnRpY2FsIGNvbGxpc2lvbnMgd2hlbiBpbnNlcnRpbmcgYSBuZXcgY2FyZCBhdCAobmV3Tm9kZS54LCBuZXdOb2RlLnkpLlxuICogQW55IGV4aXN0aW5nIGNhcmQgdGhhdCBob3Jpem9udGFsbHkgb3ZlcmxhcHMgYW5kIHdob3NlIHZlcnRpY2FsIHNwYW4gb3ZlcmxhcHNcbiAqIG9yIGlzIGJlbG93IHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgcHVzaGVkIGRvd24gc28gdGhlcmUgaXMgbm8gb3ZlcmxhcC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDb2xsaXNpb25zQW5kSW5zZXJ0ID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICBuZXdOb2RlOiBUX2dyaWRMYXlvdXRfbm9kZSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBpdGVtcyA9IFsuLi5jaGlsZHJlbl07XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgaE92ZXJsYXAgPSAhKGl0ZW0ueCArIGl0ZW0uY29scyA8PSBuZXdOb2RlLnggfHwgaXRlbS54ID49IG5ld05vZGUueCArIG5ld05vZGUuY29scyk7XG4gICAgY29uc3Qgdk92ZXJsYXAgPSAhKGl0ZW0ueSArIGl0ZW0ucm93cyA8PSBuZXdOb2RlLnkgfHwgaXRlbS55ID49IG5ld05vZGUueSArIG5ld05vZGUucm93cyk7XG5cbiAgICBpZiAoaE92ZXJsYXAgJiYgdk92ZXJsYXApIHtcbiAgICAgIGl0ZW0ueSA9IG5ld05vZGUueSArIG5ld05vZGUucm93cztcbiAgICB9XG4gIH1cblxuICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xuICBsZXQgY2hhbmdlZCA9IHRydWU7XG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hhbmdlZCA9IGFkanVzdEl0ZW1QYWlyKGl0ZW1zW2ldLCBpdGVtc1tqXSkgfHwgY2hhbmdlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHJvcFBheWxvYWQ8VD4oYWN0aXZlUGF5bG9hZDogVCB8IHVuZGVmaW5lZCwgZGF0YVRyYW5zZmVyOiBEYXRhVHJhbnNmZXIgfCBudWxsKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmIChhY3RpdmVQYXlsb2FkKSB7XG4gICAgcmV0dXJuIGFjdGl2ZVBheWxvYWQ7XG4gIH1cbiAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicpO1xuXG4gICAgICBpZiAocmF3KSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElfaG92ZXJlZEdyb3VwIHtcbiAgZ3JvdXBOb2RlOiBUX2dyaWRMYXlvdXRfbm9kZTtcbiAgZ3JvdXBHcmlkc3RlcjogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kSG92ZXJlZEdyb3VwID0gKFxuICBlbGVtZW50czogRWxlbWVudFtdLFxuICBjYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50LFxuICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSxcbik6IElfaG92ZXJlZEdyb3VwIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3Qgcm9vdEdyaWRzdGVyID0gY2FudmFzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJyk7XG5cbiAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGdyaWRzdGVyRWwgPSAoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ3JpZHN0ZXInID8gZWwgOiBlbC5jbG9zZXN0KCdncmlkc3RlcicpKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoZ3JpZHN0ZXJFbCAmJiBncmlkc3RlckVsICE9PSByb290R3JpZHN0ZXIpIHtcbiAgICAgIGNvbnN0IG91dGVySXRlbSA9IGdyaWRzdGVyRWwuY2xvc2VzdCgnZ3JpZHN0ZXItaXRlbScpO1xuICAgICAgY29uc3Qgcm9vdEl0ZW1zID0gcm9vdEdyaWRzdGVyID8gQXJyYXkuZnJvbShyb290R3JpZHN0ZXIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gZ3JpZHN0ZXItaXRlbScpKSA6IFtdO1xuICAgICAgY29uc3QgaWR4ID0gb3V0ZXJJdGVtID8gcm9vdEl0ZW1zLmluZGV4T2Yob3V0ZXJJdGVtKSA6IC0xO1xuXG4gICAgICBpZiAoaWR4ID49IDAgJiYgcm9vdC5jaGlsZHJlbj8uW2lkeF0pIHtcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBOb2RlOiByb290LmNoaWxkcmVuW2lkeF0sIGdyb3VwR3JpZHN0ZXI6IGdyaWRzdGVyRWwgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgaXRlbUVsID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ3JpZHN0ZXItaXRlbScgPyBlbCA6IGVsLmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcbiAgICBpZiAoIWl0ZW1FbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJvb3RJdGVtcyA9IHJvb3RHcmlkc3RlciA/IEFycmF5LmZyb20ocm9vdEdyaWRzdGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IGdyaWRzdGVyLWl0ZW0nKSkgOiBbXTtcbiAgICBjb25zdCBpZHggPSByb290SXRlbXMuaW5kZXhPZihpdGVtRWwpO1xuICAgIGlmIChpZHggPj0gMCAmJiByb290LmNoaWxkcmVuPy5baWR4XSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHJvb3QuY2hpbGRyZW5baWR4XTtcbiAgICAgIGlmICgobm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgICAgICByZXR1cm4geyBncm91cE5vZGU6IG5vZGUsIGdyb3VwR3JpZHN0ZXI6IChpdGVtRWwucXVlcnlTZWxlY3RvcignZ3JpZHN0ZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpID8/IChpdGVtRWwgYXMgSFRNTEVsZW1lbnQpIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBzbmFwcGVkIHNwYXRpYWwgY29vcmRpbmF0ZXMgYW5kIHBpeGVsIGRpbWVuc2lvbnMgZm9yIGRyb3AgZ2hvc3QgcHJldmlldyBib3guXG4gKi9cbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVEcm9wR2hvc3QgPSAoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGNhbnZhc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gIHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlLFxuICBwYXlsb2FkOiBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgdG90YWxDb2xzID0gMjQsXG4pOiBUX2dyaWRMYXlvdXRfZHJvcEdob3N0IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWNhbnZhc0NvbnRhaW5lcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjYXJkVGl0bGUgPSBwYXlsb2FkLnRpdGxlIHx8ICdUaOG6uyc7XG4gIGNvbnN0IGNhcmRJY29uQ2xhc3MgPSBwYXlsb2FkLmljb25DbGFzcztcbiAgY29uc3QgY2FyZEljb25UZXh0ID0gcGF5bG9hZC5pY29uVGV4dDtcbiAgY29uc3QgcGF5bG9hZEFueSA9IHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxldCBkZWZhdWx0Q29scyA9IHR5cGVvZiBwYXlsb2FkLmNvbHMgPT09ICdudW1iZXInXG4gICAgPyBwYXlsb2FkLmNvbHNcbiAgICA6ICh0eXBlb2YgcGF5bG9hZEFueVsnZGVmYXVsdENvbHMnXSA9PT0gJ251bWJlcicgPyAocGF5bG9hZEFueVsnZGVmYXVsdENvbHMnXSBhcyBudW1iZXIpIDogKHRvdGFsQ29scyA+PSAyNCA/IDEyIDogNikpO1xuICBsZXQgZGVmYXVsdFJvd3MgPSB0eXBlb2YgcGF5bG9hZC5yb3dzID09PSAnbnVtYmVyJ1xuICAgID8gcGF5bG9hZC5yb3dzXG4gICAgOiAodHlwZW9mIHBheWxvYWRBbnlbJ2RlZmF1bHRSb3dzJ10gPT09ICdudW1iZXInID8gKHBheWxvYWRBbnlbJ2RlZmF1bHRSb3dzJ10gYXMgbnVtYmVyKSA6IDQpO1xuXG4gIGlmICh0eXBlb2YgcGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW1wbGUgPSAocGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSBhcyAoaW5zaWRlOiBib29sZWFuKSA9PiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSB8IHVuZGVmaW5lZCkoZmFsc2UpO1xuICAgICAgaWYgKHNhbXBsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNhbXBsZS5jb2xzID09PSAnbnVtYmVyJykgeyBkZWZhdWx0Q29scyA9IHNhbXBsZS5jb2xzOyB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlLnJvd3MgPT09ICdudW1iZXInKSB7IGRlZmF1bHRSb3dzID0gc2FtcGxlLnJvd3M7IH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgY29scyBhbmQgcm93c1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YWdlRWwgPSAoY2FudmFzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNiaS1jYW52YXMtc3RhZ2UnKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpID8/IGNhbnZhc0NvbnRhaW5lcjtcbiAgY29uc3Qgc3RhZ2VSZWN0ID0gc3RhZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCByb290R3JpZHN0ZXIgPSBzdGFnZUVsLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBncmlkc3RlckVsID0gcm9vdEdyaWRzdGVyID8/IHN0YWdlRWw7XG4gIGNvbnN0IGdyaWRzdGVyUmVjdCA9IGdyaWRzdGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHVuc2NhbGVkV2lkdGggPSBncmlkc3RlckVsLm9mZnNldFdpZHRoIHx8IGdyaWRzdGVyRWwuY2xpZW50V2lkdGggfHwgMDtcbiAgY29uc3Qgem9vbSA9IChncmlkc3RlclJlY3Qud2lkdGggJiYgdW5zY2FsZWRXaWR0aCA+IDApXG4gICAgPyBNYXRoLm1heCgwLjIsIE1hdGgubWluKDMsIGdyaWRzdGVyUmVjdC53aWR0aCAvIHVuc2NhbGVkV2lkdGgpKVxuICAgIDogMTtcblxuICBjb25zdCBlbGVtZW50cyA9IHR5cGVvZiBkb2N1bWVudC5lbGVtZW50c0Zyb21Qb2ludCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcbiAgICA6IFtdO1xuICBjb25zdCBob3ZlcmVkID0gZmluZEhvdmVyZWRHcm91cChlbGVtZW50cywgY2FudmFzQ29udGFpbmVyLCByb290KTtcblxuICBjb25zdCBzdGFnZU1vdXNlWCA9IChldmVudC5jbGllbnRYIC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgY29uc3Qgc3RhZ2VNb3VzZVkgPSAoZXZlbnQuY2xpZW50WSAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcblxuICBpZiAoaG92ZXJlZCkge1xuICAgIGNvbnN0IHsgZ3JvdXBOb2RlLCBncm91cEdyaWRzdGVyIH0gPSBob3ZlcmVkO1xuICAgIGNvbnN0IGdyb3VwR3JpZHN0ZXJSZWN0ID0gZ3JvdXBHcmlkc3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBncm91cFN0YWdlTGVmdCA9IChncm91cEdyaWRzdGVyUmVjdC5sZWZ0IC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgICBjb25zdCBncm91cFN0YWdlVG9wID0gKGdyb3VwR3JpZHN0ZXJSZWN0LnRvcCAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcblxuICAgIGxldCBpbm5lckNvbHMgPSBkZWZhdWx0Q29scztcbiAgICBsZXQgaW5uZXJSb3dzID0gZGVmYXVsdFJvd3M7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkQW55WydyZXNvbHZlTm9kZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzYW1wbGVJbnNpZGUgPSAocGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSBhcyAoaW5zaWRlOiBib29sZWFuKSA9PiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSB8IHVuZGVmaW5lZCkodHJ1ZSk7XG4gICAgICAgIGlmIChzYW1wbGVJbnNpZGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZUluc2lkZS5jb2xzID09PSAnbnVtYmVyJykgeyBpbm5lckNvbHMgPSBzYW1wbGVJbnNpZGUuY29sczsgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlSW5zaWRlLnJvd3MgPT09ICdudW1iZXInKSB7IGlubmVyUm93cyA9IHNhbXBsZUluc2lkZS5yb3dzOyB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IGNvbHMgYW5kIHJvd3NcbiAgICAgIH1cbiAgICB9XG4gICAgaW5uZXJDb2xzID0gTWF0aC5taW4oaW5uZXJDb2xzLCB0b3RhbENvbHMpO1xuXG4gICAgY29uc3QgZ3JvdXBXaWR0aCA9IGdyb3VwR3JpZHN0ZXIuY2xpZW50V2lkdGggfHwgKGdyb3VwR3JpZHN0ZXJSZWN0LndpZHRoIC8gem9vbSkgfHwgNDAwO1xuICAgIGNvbnN0IGNvbFN0ZXAgPSAoZ3JvdXBXaWR0aCArIDIpIC8gdG90YWxDb2xzO1xuICAgIGNvbnN0IHJvd1N0ZXAgPSAxODtcbiAgICBjb25zdCByZWxYID0gKGV2ZW50LmNsaWVudFggLSBncm91cEdyaWRzdGVyUmVjdC5sZWZ0KSAvIHpvb20gKyBncm91cEdyaWRzdGVyLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcmVsWSA9IChldmVudC5jbGllbnRZIC0gZ3JvdXBHcmlkc3RlclJlY3QudG9wKSAvIHpvb20gKyBncm91cEdyaWRzdGVyLnNjcm9sbFRvcDtcbiAgICBjb25zdCByYXdDb2wgPSBNYXRoLmZsb29yKHJlbFggLyBjb2xTdGVwKTtcbiAgICBjb25zdCByYXdSb3cgPSBNYXRoLmZsb29yKHJlbFkgLyByb3dTdGVwKTtcbiAgICBjb25zdCBzbmFwID0gZmluZFNuYXBQb3NpdGlvbkluc2lkZUdyb3VwKFxuICAgICAgZ3JvdXBOb2RlLmNoaWxkcmVuID8/IFtdLFxuICAgICAgcmF3Q29sLFxuICAgICAgcmF3Um93LFxuICAgICAgaW5uZXJDb2xzLFxuICAgICAgaW5uZXJSb3dzLFxuICAgICAgdG90YWxDb2xzLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBzbmFwLmNvbCxcbiAgICAgIHJvdzogc25hcC5yb3csXG4gICAgICBjb2xzOiBpbm5lckNvbHMsXG4gICAgICByb3dzOiBpbm5lclJvd3MsXG4gICAgICBwaXhlbExlZnQ6IGdyb3VwU3RhZ2VMZWZ0ICsgc25hcC5jb2wgKiBjb2xTdGVwLFxuICAgICAgcGl4ZWxUb3A6IGdyb3VwU3RhZ2VUb3AgKyBzbmFwLnJvdyAqIHJvd1N0ZXAsXG4gICAgICBwaXhlbFdpZHRoOiBNYXRoLm1heCgzMCwgaW5uZXJDb2xzICogY29sU3RlcCAtIDIpLFxuICAgICAgcGl4ZWxIZWlnaHQ6IE1hdGgubWF4KDIwLCBpbm5lclJvd3MgKiByb3dTdGVwIC0gMiksXG4gICAgICBpc0luc2lkZUdyb3VwOiB0cnVlLFxuICAgICAgdGFyZ2V0UGFyZW50SWQ6IGdyb3VwTm9kZS5pZCxcbiAgICAgIGdyb3VwVGl0bGU6ICdLaOG7kWkgZ2jDqXAnLFxuICAgICAgY2FyZFRpdGxlLFxuICAgICAgY2FyZEljb25DbGFzcyxcbiAgICAgIGNhcmRJY29uVGV4dCxcbiAgICAgIGhvdmVyZWRHcmlkc3RlcjogZ3JvdXBHcmlkc3RlciBhcyBIVE1MRWxlbWVudCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWFyZ2luID0gMTI7XG4gIGNvbnN0IHJvd1N0ZXAgPSA2ODtcbiAgY29uc3QgZ3JpZHN0ZXJXaWR0aCA9IHVuc2NhbGVkV2lkdGggfHwgZ3JpZHN0ZXJFbC5jbGllbnRXaWR0aCB8fCAxMjAwO1xuICBjb25zdCBjb2xTdGVwID0gTWF0aC5tYXgoMjAsIChncmlkc3RlcldpZHRoIC0gbWFyZ2luKSAvIHRvdGFsQ29scyk7XG4gIGNvbnN0IGdyaWRzdGVyU3RhZ2VMZWZ0ID0gKGdyaWRzdGVyUmVjdC5sZWZ0IC0gc3RhZ2VSZWN0LmxlZnQpIC8gem9vbTtcbiAgY29uc3QgZ3JpZHN0ZXJTdGFnZVRvcCA9IChncmlkc3RlclJlY3QudG9wIC0gc3RhZ2VSZWN0LnRvcCkgLyB6b29tO1xuICBjb25zdCByZWxYID0gc3RhZ2VNb3VzZVggLSBncmlkc3RlclN0YWdlTGVmdCArIGdyaWRzdGVyRWwuc2Nyb2xsTGVmdCAtIG1hcmdpbjtcbiAgY29uc3QgcmVsWSA9IHN0YWdlTW91c2VZIC0gZ3JpZHN0ZXJTdGFnZVRvcCArIGdyaWRzdGVyRWwuc2Nyb2xsVG9wIC0gbWFyZ2luO1xuICBjb25zdCBpdGVtQ29scyA9IE1hdGgubWluKGRlZmF1bHRDb2xzLCB0b3RhbENvbHMpO1xuICBjb25zdCBjb2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0b3RhbENvbHMgLSBpdGVtQ29scywgTWF0aC5mbG9vcihyZWxYIC8gY29sU3RlcCkpKTtcbiAgY29uc3Qgcm93ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZWxZIC8gcm93U3RlcCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29sLFxuICAgIHJvdyxcbiAgICBjb2xzOiBpdGVtQ29scyxcbiAgICByb3dzOiBkZWZhdWx0Um93cyxcbiAgICBwaXhlbExlZnQ6IGdyaWRzdGVyU3RhZ2VMZWZ0ICsgbWFyZ2luICsgY29sICogY29sU3RlcCxcbiAgICBwaXhlbFRvcDogZ3JpZHN0ZXJTdGFnZVRvcCArIG1hcmdpbiArIHJvdyAqIHJvd1N0ZXAsXG4gICAgcGl4ZWxXaWR0aDogaXRlbUNvbHMgKiBjb2xTdGVwIC0gbWFyZ2luLFxuICAgIHBpeGVsSGVpZ2h0OiBkZWZhdWx0Um93cyAqIHJvd1N0ZXAgLSBtYXJnaW4sXG4gICAgaXNJbnNpZGVHcm91cDogZmFsc2UsXG4gICAgY2FyZFRpdGxlLFxuICAgIGNhcmRJY29uQ2xhc3MsXG4gICAgY2FyZEljb25UZXh0LFxuICAgIGhvdmVyZWRHcmlkc3RlcjogKHJvb3RHcmlkc3RlciBhcyBIVE1MRWxlbWVudCkgPz8gdW5kZWZpbmVkLFxuICB9O1xufTtcbiJdfQ==
@@ -32,10 +32,9 @@ export const gridLayoutRootConfig = () => ({
32
32
  swapWhileDragging: true,
33
33
  draggable: {
34
34
  enabled: true,
35
- // 🔴 KHÔNG được bỏ. Không thì gridster vào chế độ kéo ngay từ `mousedown`, nên chỉ bấm
36
- // CHỌN một khối đã nhích theo chuột đứng yên. Lib tự huỷ kéo khi nhả chuột trước mốc
37
- // này nên cú bấm chọn vẫn ăn nguyên vẹn.
38
- delayStart: 160,
35
+ // delayStart: 0 kéo qua tay cầm chuyên dụng (dragHandleClass) ignoreContent: true.
36
+ // Khi người dùng bấm vào thanh tay cầm chủ động kéo, không cần trễ 160ms tránh huỷ kéo.
37
+ delayStart: 0,
39
38
  // 🔴 `checkDragHandleClass` duyệt DOM từ chỗ bấm NGƯỢC LÊN CHA, và trên MỖI node nó kiểm
40
39
  // `dragHandleClass` TRƯỚC `ignoreContentClass`. Vì vậy một phần tử KHÔNG được mang cả hai class
41
40
  // cùng lúc — mang cả hai thì lib gặp tay cầm trước, trả `true`, class chặn không tới lượt.
@@ -120,4 +119,4 @@ export const gridLayoutNestedConfig = () => ({
120
119
  * Xảy ra trong nhịp giữa lúc component dựng và lúc `init()` chạy.
121
120
  */
122
121
  export const emptyRootNode = () => ({ id: 'root', x: 0, y: 0, cols: 12, rows: 0, children: [] });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItY29uZmlnLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsMERBQTBEO0lBQzFELG1HQUFtRztJQUNuRyxtR0FBbUc7SUFDbkcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0lBRWhDLG9DQUFvQztJQUNwQyxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZFQUE2RTtJQUM3RSxnR0FBZ0c7SUFDaEcsaUNBQWlDO0lBQ2pDLGdEQUFnRDtJQUNoRCxXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7SUFDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlO0lBRXhDLHFDQUFxQztJQUNyQyxpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLGlHQUFpRztJQUNqRyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLElBQUk7SUFDZixxRUFBcUU7SUFDckUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN2RSxlQUFlLEVBQUUsSUFBSTtJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLGlCQUFpQixFQUFFLElBQUk7SUFFdkIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYiw2RkFBNkY7UUFDN0YsOEZBQThGO1FBQzlGLHlDQUF5QztRQUN6QyxVQUFVLEVBQUUsR0FBRztRQUNmLHlGQUF5RjtRQUN6RixnR0FBZ0c7UUFDaEcsMkZBQTJGO1FBQzNGLGtCQUFrQixFQUFFLHVDQUF1QztRQUMzRCxhQUFhLEVBQUUsSUFBSTtRQUNuQixlQUFlLEVBQUUsaUNBQWlDO0tBQ25EO0lBRUQsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYix1RUFBdUU7UUFDdkUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFO0tBQ3hGO0lBRUQsTUFBTSxFQUFFLEVBQUU7SUFDVixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsT0FBTyxFQUFFLEVBQUU7SUFDWCxPQUFPLEVBQUUsQ0FBQztJQUVWLGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLHFEQUFxRDtJQUNyRCxPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFFbEIsaUdBQWlHO0lBQ2pHLDhGQUE4RjtJQUM5Riw0Q0FBNEM7SUFDNUMsYUFBYSxFQUFFLElBQUk7SUFFbkIsV0FBVyxFQUFFLElBQUk7SUFDakIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Q0FDckIsQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFtQixFQUFFLENBQUMsQ0FBQztJQUMzRCxHQUFHLG9CQUFvQixFQUFFO0lBRXpCLGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsdUVBQXVFO0lBQ3ZFLFdBQVcsRUFBRSxLQUFLO0lBRWxCLG1HQUFtRztJQUNuRyxNQUFNLEVBQUUsQ0FBQztJQUNULGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsNkVBQTZFO0lBQzdFLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLGlCQUFpQixFQUFFLENBQUM7SUFFcEIsa0ZBQWtGO0lBQ2xGLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsV0FBVyxFQUFFLENBQUM7SUFDZCxlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUVsQix3REFBd0Q7SUFDeEQsaUdBQWlHO0lBQ2pHLHFFQUFxRTtJQUNyRSxTQUFTLEVBQUU7UUFDVCxHQUFHLG9CQUFvQixFQUFFLENBQUMsU0FBUztRQUNuQyxlQUFlLEVBQUUsdUNBQXVDO0tBQ3pEO0lBRUQsa0dBQWtHO0lBQ2xHLGtHQUFrRztJQUNsRywwRkFBMEY7SUFDMUYsZUFBZSxFQUFFLEtBQUs7SUFFdEIsZ0ZBQWdGO0lBQ2hGLG1HQUFtRztJQUNuRyxrREFBa0Q7SUFDbEQsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixxQkFBcUIsRUFBRSxJQUFJO0NBQzVCLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFzQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBhY3RUeXBlLCBEaXNwbGF5R3JpZCwgR3JpZHN0ZXJDb25maWcsIEdyaWRUeXBlIH0gZnJvbSAnZ3JpZHN0ZXIxOCc7XG5pbXBvcnQgeyBUX2dyaWRMYXlvdXRfbm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JpZC1sYXlvdXQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBD4bqldSBow6xuaCBncmlkc3RlciBjaG8gbMaw4bubaSBD4bqkUCBUUkFORy5cbiAqXG4gKiBN4buNaSBnacOhIHRy4buLIGTGsOG7m2kgxJHDonkgxJHhu4F1IMSR4bq/biB04burIG3hu5l0IGzhu5dpIMSRw6MgxJFvIMSRxrDhu6NjIHRyw6puIHPhuqNuIHBo4bqpbSB0aOG6rXQsIGtow7RuZyBwaOG6o2kgY2jhu41uIHRoZW8gY+G6o21cbiAqIHTDrW5oLiDEkOG7lWkgYuG6pXQga+G7syBkw7JuZyBuw6BvIGPDsyBk4bqldSDwn5S0IHPhur0gbMOgbSBz4buRbmcgbOG6oWkgxJHDum5nIGzhu5dpIGdoaSB0cm9uZyBjb21tZW50LlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dFJvb3RDb25maWcgPSAoKTogR3JpZHN0ZXJDb25maWcgPT4gKHtcbiAgLy8g8J+UtCBWZXJ0aWNhbEZpeGVkIOKAlCBD4bqkTSDEkeG7lWkgc2FuZyBGaXQgaGF5IFNjcm9sbFZlcnRpY2FsLlxuICAvLyBgRml0YCBjaGlhIMSR4buBdSBjaGnhu4F1IGNhbyBraHVuZyBjaG8gc+G7kSBow6BuZyDEkWFuZyBkw7luZywgbsOqbiBjYXJkIGtoYWkgYHJvd3M6IDJgIHBow6xuaCB04burIDEyNHB4IGzDqm5cbiAgLy8gMjQ3cHguIGBTY3JvbGxWZXJ0aWNhbGAgS0jDlE5HIMSR4buNYyBgZml4ZWRSb3dIZWlnaHRgIChtw6MgbGliOiBjaOG7iSBgRml4ZWRgIHbDoCBgVmVydGljYWxGaXhlZGAgxJHhu41jKS5cbiAgZ3JpZFR5cGU6IEdyaWRUeXBlLlZlcnRpY2FsRml4ZWQsXG5cbiAgLy8g8J+UtCBOb25lIOKAlCBD4bqkTSBxdWF5IGzhuqFpIENvbXBhY3RVcC5cbiAgLy8gYENvbXBhY3RVcGAgaMO6dCBt4buNaSBraOG7kWkgbMOqbiBzw6F0IG5oYXUgTkdBWSBzYXUgbeG7l2kgdGhhbyB0w6FjLCBuw6puOlxuICAvLyAgwrcga8OpbyBtw6lwIGTGsOG7m2kgY2hvIGto4buRaSBjYW8gdGjDqm0g4oaSIGNo4buXIGto4buRaSBkxrDhu5tpIHbhu6thIG5oxrDhu51uZyBi4buLIGjDunQgbOG6pXAgbOG6oWkgdOG7qWMgdGjDrCwgY8O6IGvDqW8gYuG7i1xuICAvLyAgICBgY2hlY2tHcmlkQ29sbGlzaW9uYCBiw6FvIHZhIGNo4bqhbSBy4buTaSBIT8OATiBOR1VZw4pOIChraOG7kWkgxJHhu6luZyBpbSBkw7kga8Opbyk7XG4gIC8vICDCtyBrw6lvIHRo4bqjIMSR4buVaSB24buLIHRyw60g4oaSIGto4buRaSB24burYSBuaMaw4budbmcgY2jhu5cgYuG7iyBow7p0IHbhu4EgbmdheSwga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIGPDsyBjaOG7lyDEkeG6t3QgdsOgXG4gIC8vICAgIHRyZW8gbMahIGzhu61uZyBnaeG7r2EgaGFpIGto4buRaS5cbiAgLy8gTXXhu5FuIGThu5NuIGtow610IHRow6wgZ+G7jWkgYHNhcEdvbigpYCBj4bunYSBzZXJ2aWNlLlxuICBjb21wYWN0VHlwZTogQ29tcGFjdFR5cGUuTm9uZSxcbiAgZGlzcGxheUdyaWQ6IERpc3BsYXlHcmlkLk9uRHJhZ0FuZFJlc2l6ZSxcblxuICAvLyDwn5S0IHB1c2hJdGVtczogdHJ1ZSDigJQgQ+G6pE0gxJHhu4MgZmFsc2UuXG4gIC8vIGBzd2FwYCBj4bunYSBsaWIgQ0jhu4ggaG/DoW4gduG7iyDEkcaw4bujYyBIQUkgS0jhu5BJIEPDmU5HIEvDjUNIIFRIxq/hu5pDIChtw6MgbGliIGBjaGVja1N3YXBgOiB0w61uaCBkaWZmWC9kaWZmWVxuICAvLyBy4buTaSBob8OhbiB24buLLCBs4buHY2gga8OtY2ggdGjGsOG7m2MgdGjDrCBgY2hlY2tDb2xsaXNpb25gIGLDoW8gdmEgY2jhuqFtIHbDoCBob8OgbiBuZ3V5w6puKS4gS2jhu5FpIDN4MiBn4bq3cFxuICAvLyBjb250YWluZXIgN3g1IG7Dqm4ga2jDtG5nIHN3YXAgxJHGsOG7o2MsIG3DoCBgcHVzaEl0ZW1zOiBmYWxzZWAgY8Wpbmcga2jDtG5nIGNobyBjb250YWluZXIgbmjGsOG7nW5nIMSRxrDhu51uZ1xuICAvLyDihpIgQuG6viBU4bquQzoga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIMSR4bq3dCDEkcaw4bujYyDhu58gxJHDonUuXG4gIHB1c2hJdGVtczogdHJ1ZSxcbiAgLy8gY2jhu4kgxJHhuql5IFhV4buQTkc6IMSR4bqpeSBuZ2FuZyBsw6BtIHjDtCBs4buHY2ggYuG7kSBj4bulYyBj4buZdCBuZ8aw4budaSBkw7luZyB24burYSDEkeG6t3RcbiAgcHVzaERpcmVjdGlvbnM6IHsgbm9ydGg6IGZhbHNlLCBlYXN0OiBmYWxzZSwgc291dGg6IHRydWUsIHdlc3Q6IGZhbHNlIH0sXG4gIHB1c2hSZXNpemVJdGVtczogdHJ1ZSxcbiAgc3dhcDogdHJ1ZSxcbiAgc3dhcFdoaWxlRHJhZ2dpbmc6IHRydWUsXG5cbiAgZHJhZ2dhYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDwn5S0IEtIw5RORyDEkcaw4bujYyBi4buPLiBLaMO0bmcgY8OzIG7DsyB0aMOsIGdyaWRzdGVyIHbDoG8gY2jhur8gxJHhu5kga8OpbyBuZ2F5IHThu6sgYG1vdXNlZG93bmAsIG7Dqm4gY2jhu4kgYuG6pW1cbiAgICAvLyBDSOG7jE4gbeG7mXQga2jhu5FpIGzDoCBuw7MgxJHDoyBuaMOtY2ggdGhlbyBkw7kgY2h14buZdCDEkeG7qW5nIHnDqm4uIExpYiB04buxIGh14bu3IGvDqW8ga2hpIG5o4bqjIGNodeG7mXQgdHLGsOG7m2MgbeG7kWNcbiAgICAvLyBuw6B5IG7Dqm4gY8O6IGLhuqVtIGNo4buNbiB24bqrbiDEg24gbmd1ecOqbiB24bq5bi5cbiAgICBkZWxheVN0YXJ0OiAxNjAsXG4gICAgLy8g8J+UtCBgY2hlY2tEcmFnSGFuZGxlQ2xhc3NgIGR1eeG7h3QgRE9NIHThu6sgY2jhu5cgYuG6pW0gTkfGr+G7okMgTMOKTiBDSEEsIHbDoCB0csOqbiBN4buWSSBub2RlIG7DsyBraeG7g21cbiAgICAvLyBgZHJhZ0hhbmRsZUNsYXNzYCBUUsav4buaQyBgaWdub3JlQ29udGVudENsYXNzYC4gVsOsIHbhuq15IG3hu5l0IHBo4bqnbiB04butIEtIw5RORyDEkcaw4bujYyBtYW5nIGPhuqMgaGFpIGNsYXNzXG4gICAgLy8gY8O5bmcgbMO6YyDigJQgbWFuZyBj4bqjIGhhaSB0aMOsIGxpYiBn4bq3cCB0YXkgY+G6p20gdHLGsOG7m2MsIHRy4bqjIGB0cnVlYCwgY2xhc3MgY2jhurduIGtow7RuZyB04bubaSBsxrDhu6N0LlxuICAgIGlnbm9yZUNvbnRlbnRDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtYmxvY2stcGFyZW50LWRyYWcnLFxuICAgIGlnbm9yZUNvbnRlbnQ6IHRydWUsXG4gICAgZHJhZ0hhbmRsZUNsYXNzOiAnbGlicy11aS1ncmlkLWxheW91dC1kcmFnLWhhbmRsZScsXG4gIH0sXG5cbiAgcmVzaXphYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDEkeG7pyA4IGjGsOG7m25nIG5oxrAgY+G7rWEgc+G7lSB0aMaw4budbmc7IGNo4buJIGPDsyBnw7NjIGTGsOG7m2ktcGjhuqNpIHRow6wgcXXDoSBraMOzIHRyw7puZ1xuICAgIGhhbmRsZXM6IHsgczogdHJ1ZSwgZTogdHJ1ZSwgbjogdHJ1ZSwgdzogdHJ1ZSwgc2U6IHRydWUsIG5lOiB0cnVlLCBzdzogdHJ1ZSwgbnc6IHRydWUgfSxcbiAgfSxcblxuICBtYXJnaW46IDEyLFxuICBvdXRlck1hcmdpbjogdHJ1ZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDQwLFxuICBtaW5Db2xzOiAxMixcbiAgbWF4Q29sczogMTIsXG4gIG1pblJvd3M6IDIsXG5cbiAgLy8g8J+UtCBLSMOUTkcgZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIGto4buRaS4gTGliIGPDsyBCQSB0cuG6p24gbeG6t2MgxJHhu4tuaCBwaOG6o2kgdsO0IGhp4buHdSBob8OhIEPDmU5HIEzDmkMsIHRoaeG6v3UgbeG7mXRcbiAgLy8gY8OhaSBsw6AgduG6q24gYuG7iyBjaOG6t246IGBtYXhJdGVtUm93czogNTBgIMK3IGBtYXhJdGVtQ29sczogNTBgIMK3IGBtYXhJdGVtQXJlYTogMjUwMGAgKHRy4bqnbiBESeG7hk4gVMONQ0hcbiAgLy8gY29scyDDlyByb3dzIOKAlCBraMOzIHRo4bqleSBuaOG6pXQ6IGto4buRaSAxMiBj4buZdCBjaOG7iSBj4bqnbiAyMDkgaMOgbmcgbMOgIMSR4bulbmcgdHLhuqduIGTDuSBoYWkgdHLhuqduIGtpYSBjw7JuIGTGsCkuXG4gIC8vIGBtYXhSb3dzYCBsw6AgdHLhuqduIGPhu6dhIEPhuqIgTMav4buaSSwgY8WpbmcgcGjhuqNpIG7hu5tpIHRoZW8uXG4gIG1heFJvd3M6IDUwMDAsXG4gIG1heEl0ZW1Sb3dzOiA1MDAwLFxuICBtYXhJdGVtQ29sczogMTIsXG4gIG1heEl0ZW1BcmVhOiA2MDAwMCxcblxuICAvLyDwn5S0IFRy4bqnbiBM4buaUCBDSOG7kk5HLiBN4bq3YyDEkeG7i25oIGPhu6dhIGxpYiBsw6AgMiDigJQgcXXDoSB0aOG6pXA6IGtoaSBi4bqtdCBjaOG7k25nIGto4buRaSwgdGjGsCB2aeG7h24gZ8OhbiBt4buXaSBraOG7kWlcbiAgLy8gbeG7mXQgbOG7m3AgcmnDqm5nIMSR4buDIGNow7puZyBraMOhYyBuaGF1LCBuw6puIGNo4buJIDMga2jhu5FpIGzDoCDEkcOjIMSR4bulbmcgdHLhuqduIHbDoCBjw6FjIGto4buRaSBzYXUgbOG6oWkgcsahaSB24buBXG4gIC8vIGPDuW5nIGzhu5twLCB04bupYyBjaOG7k25nIG5oYXUgYuG7iyBjaOG6t24gdHLhu58gbOG6oWkuXG4gIG1heExheWVySW5kZXg6IDUwMDAsXG5cbiAgc2V0R3JpZFNpemU6IHRydWUsXG4gIGZpeGVkUm93SGVpZ2h0OiA1NixcbiAgZGVmYXVsdEl0ZW1Db2xzOiAzLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG4gIG1pbkl0ZW1Sb3dzOiAxLFxuICBtb2JpbGVCcmVha3BvaW50OiAtMSxcbn0pO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGNobyBsxrDhu5tpIEzhu5JORyAocnXhu5l0IG3hu5l0IGNvbnRhaW5lcikuXG4gKlxuICogS+G6vyB0aOG7q2EgbMaw4bubaSB0cmFuZyBy4buTaSBnaGkgxJHDqCBwaOG6p24ga2jDoWMgYmnhu4d0LiBCYSDEkWnhu4NtIHF1YW4gdHLhu41uZyBuaOG6pXQ6IGBzZXRHcmlkU2l6ZWAgcGjhuqNpIFThuq5ULFxuICogdGF5IGPhuqdtIHBo4bqjaSBtYW5nIFTDik4gUknDik5HLCB2w6AgdOG7sS1jdeG7mW4ta2hpLWvDqW8gcGjhuqNpIFThuq5ULlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dE5lc3RlZENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAuLi5ncmlkTGF5b3V0Um9vdENvbmZpZygpLFxuXG4gIC8vIPCflLQgUEjhuqJJIHThuq90IGNobyBsxrDhu5tpIGzhu5NuZy4gYHNldEdyaWRTaXplYCBsw6BtIGdyaWRzdGVyIHThu7EgZ2hpIHN0eWxlIHdpZHRoL2hlaWdodCBsw6puIENIw41OSCBuw7MsXG4gIC8vIHNpbmggdsOybmcgbOG6t3AgxJFvLXLhu5NpLWdoaSB24bubaSBSZXNpemVPYnNlcnZlciBj4bunYSBraHVuZyBuZ2/DoGkgKGtodW5nIMSR4buVaSDihpIgb25SZXNpemUgeG/DoSBzdHlsZSDihpJcbiAgLy8gc2V0R3JpZFNpemUgZ2hpIGzhuqFpKSDihpIgbMaw4bubaSBjb24gY28gZOG6p24gduG7gSA2NHg2NHB4IHRyb25nIGtodW5nIDg2OHB4LlxuICBzZXRHcmlkU2l6ZTogZmFsc2UsXG5cbiAgLy8ga2hlIDJweDoga2jhu5FpIGNvbiBsw6AgY8OhYyBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIEPDmU5HIG3hu5l0IGNhcmQsIGtoZSBy4buZbmcgbMOgbSBjaMO6bmcgdHLDtG5nIG5oxrAgY2FyZCBy4budaVxuICBtYXJnaW46IDIsXG4gIC8vIEzGsOG7m2kgbOG7k25nIEtIw5RORyB04buxIGNo4burYSBs4buBIOKAlCBs4buBIGzDoCBj4bunYSBW4buOIGNvbnRhaW5lciAoYGNvbnRhaW5lclBhZGRpbmdgKSwga2jDtG5nIHBo4bqjaSBj4bunYSBsxrDhu5tpLlxuICAvLyDEkOG6t3Qg4bufIHbhu48gdGjDrCBydeG7mXQgY28gbOG6oWkgxJHDum5nIGLhurFuZyBwaOG6p24gY8OybiBs4bqhaSwgdGF5IGPhuqdtIHJlc2l6ZSBj4bunYSBraOG7kWkgY29uIGx1w7RuIG7hurFtIHRyb25nIHThuqdtXG4gIC8vIGNodeG7mXQgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2OiBcImzGsOG7m2kgY2hhIGPDsyBwYWRkaW5nIGNo4bupIGtvIHBo4bqjaSBjb25cIikuXG4gIG91dGVyTWFyZ2luOiBmYWxzZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDAsXG5cbiAgLy8gaMOgbmcgMTZweCBjaG8gYsaw4bubYyBrw6lvIG3hu4tuLCB2w6Agc8OgbiAxIGjDoG5nID0gMTZweCBuw6puIGto4buRaSBjbyDEkcaw4bujYyBuaOG7jyBoxqFuIG5oaeG7gXVcbiAgZml4ZWRSb3dIZWlnaHQ6IDE2LFxuICBtaW5Sb3dzOiAxLFxuICBtaW5JdGVtUm93czogMSxcbiAgZGVmYXVsdEl0ZW1Db2xzOiAyLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG5cbiAgLy8g8J+UtCBUYXkgY+G6p20gUknDik5HIOKAlCBD4bqkTSBkw7luZyBjaHVuZyB0w6puIHbhu5tpIGzGsOG7m2kgdHJhbmcuXG4gIC8vIGBjaGVja0RyYWdIYW5kbGVDbGFzc2AgdHLhuqMgYHRydWVgIOG7nyBub2RlIMSQ4bqmVSBUScOKTiBjw7MgYGRyYWdIYW5kbGVDbGFzc2AuIETDuW5nIGNodW5nIG3hu5l0IHTDqm4gdGjDrFxuICAvLyBsxrDhu5tpIENIQSBjxaluZyBuaOG6rW4gcmEgdGF5IGPhuqdtIGPhu6dhIGto4buRaSBjb24gdsOgIG5o4bqlYyBsdcO0biBjb250YWluZXIuXG4gIGRyYWdnYWJsZToge1xuICAgIC4uLmdyaWRMYXlvdXRSb290Q29uZmlnKCkuZHJhZ2dhYmxlLFxuICAgIGRyYWdIYW5kbGVDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtZHJhZy1oYW5kbGUtY2hpbGQnLFxuICB9LFxuXG4gIC8vIPCflLQgS8OJTyBNw4lQIHRow6wga2jhu5FpIGTGsOG7m2kgxJDhu6hORyBZw4pOLCBjaOG7iSBraG/huqNuZyB0cuG7kW5nIGdp4buvYSBoYWkga2jhu5FpIGNvIGdpw6NuLiBC4bqtdCAoa+G6vyB0aOG7q2EgdOG7qyBsxrDhu5tpXG4gIC8vIHRyYW5nKSB0aMOsIG3hu5dpIGPDuiBrw6lvIMSR4bqpeSBk4buTbiBj4bqjIGPhu5l0IHh14buRbmcg4oCUIG5nxrDhu51pIGTDuW5nIGNo4buJIG114buRbiBt4buZdCBraOG7kWkgdG8gaMahbiBt4buZdCBjaMO6dCBtw6AgY+G6o1xuICAvLyBjYXJkIGTDoGkgcmEuIGBwdXNoSXRlbXNgIHbhuqtuIGdp4buvOiBuw7MgbG8gdmnhu4djIEvDiU8gVEjhuqIgxJHhu5VpIGNo4buXLCBraMOhYyB2aeG7h2MgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICBwdXNoUmVzaXplSXRlbXM6IGZhbHNlLFxuXG4gIC8vIPCflLQgVOG6r3QgdOG7sSBjdeG7mW4ga2hpIGvDqW8gdOG7m2kgc8OhdCBtw6lwLiBMaWIgdGjhuqV5IGNodeG7mXQgZ+G6p24gYmnDqm4gbMOgIGN14buZbiBsxrDhu5tpIHRoZW9cbiAgLy8gKGBzY3JvbGxTZW5zaXRpdml0eWApLCBuaMawbmcgbMaw4bubaSBjb24gbuG6sW0gdHJvbmcgY2FyZCBjw7MgYG92ZXJmbG93OiBoaWRkZW5gIOKAlCBjdeG7mW4g4bufIMSRw6J5IMSR4bqpeSBraOG7kWlcbiAgLy8gY29uIHJhIE5HT8OASSBraHVuZyBjb250YWluZXIgcuG7k2kga+G6uXQgbHXDtG4g4bufIMSRw7MuXG4gIGRpc2FibGVTY3JvbGxIb3Jpem9udGFsOiB0cnVlLFxuICBkaXNhYmxlU2Nyb2xsVmVydGljYWw6IHRydWUsXG59KTtcblxuLyoqXG4gKiBDw6J5IHLhu5duZyBkw7luZyBraGkgY2jGsGEgY8OzIGThu68gbGnhu4d1IOKAlCBt4bq3dCBwaOG6s25nIHbhur0gcmEgbeG7mXQgbMaw4bubaSB0cuG7kW5nIHRoYXkgdsOsIHbhu6EuXG4gKiBY4bqjeSByYSB0cm9uZyBuaOG7i3AgZ2nhu69hIGzDumMgY29tcG9uZW50IGThu7FuZyB2w6AgbMO6YyBgaW5pdCgpYCBjaOG6oXkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbXB0eVJvb3ROb2RlID0gKCk6IFRfZ3JpZExheW91dF9ub2RlID0+ICh7IGlkOiAncm9vdCcsIHg6IDAsIHk6IDAsIGNvbHM6IDEyLCByb3dzOiAwLCBjaGlsZHJlbjogW10gfSk7XG4iXX0=
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItY29uZmlnLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsMERBQTBEO0lBQzFELG1HQUFtRztJQUNuRyxtR0FBbUc7SUFDbkcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0lBRWhDLG9DQUFvQztJQUNwQyxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZFQUE2RTtJQUM3RSxnR0FBZ0c7SUFDaEcsaUNBQWlDO0lBQ2pDLGdEQUFnRDtJQUNoRCxXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7SUFDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlO0lBRXhDLHFDQUFxQztJQUNyQyxpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLGlHQUFpRztJQUNqRyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLElBQUk7SUFDZixxRUFBcUU7SUFDckUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN2RSxlQUFlLEVBQUUsSUFBSTtJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLGlCQUFpQixFQUFFLElBQUk7SUFFdkIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYix5RkFBeUY7UUFDekYsMkZBQTJGO1FBQzNGLFVBQVUsRUFBRSxDQUFDO1FBQ2IseUZBQXlGO1FBQ3pGLGdHQUFnRztRQUNoRywyRkFBMkY7UUFDM0Ysa0JBQWtCLEVBQUUsdUNBQXVDO1FBQzNELGFBQWEsRUFBRSxJQUFJO1FBQ25CLGVBQWUsRUFBRSxpQ0FBaUM7S0FDbkQ7SUFFRCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLHVFQUF1RTtRQUN2RSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUU7S0FDeEY7SUFFRCxNQUFNLEVBQUUsRUFBRTtJQUNWLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLEVBQUU7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxPQUFPLEVBQUUsRUFBRTtJQUNYLE9BQU8sRUFBRSxDQUFDO0lBRVYsaUdBQWlHO0lBQ2pHLGtHQUFrRztJQUNsRyxrR0FBa0c7SUFDbEcscURBQXFEO0lBQ3JELE9BQU8sRUFBRSxJQUFJO0lBQ2IsV0FBVyxFQUFFLElBQUk7SUFDakIsV0FBVyxFQUFFLEVBQUU7SUFDZixXQUFXLEVBQUUsS0FBSztJQUVsQixpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLDRDQUE0QztJQUM1QyxhQUFhLEVBQUUsSUFBSTtJQUVuQixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsRUFBRTtJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUNsQixXQUFXLEVBQUUsQ0FBQztJQUNkLGdCQUFnQixFQUFFLENBQUMsQ0FBQztDQUNyQixDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzNELEdBQUcsb0JBQW9CLEVBQUU7SUFFekIsZ0dBQWdHO0lBQ2hHLGdHQUFnRztJQUNoRyx1RUFBdUU7SUFDdkUsV0FBVyxFQUFFLEtBQUs7SUFFbEIsbUdBQW1HO0lBQ25HLE1BQU0sRUFBRSxDQUFDO0lBQ1QsaUdBQWlHO0lBQ2pHLGtHQUFrRztJQUNsRyw2RUFBNkU7SUFDN0UsV0FBVyxFQUFFLEtBQUs7SUFDbEIsaUJBQWlCLEVBQUUsQ0FBQztJQUVwQixrRkFBa0Y7SUFDbEYsY0FBYyxFQUFFLEVBQUU7SUFDbEIsT0FBTyxFQUFFLENBQUM7SUFDVixXQUFXLEVBQUUsQ0FBQztJQUNkLGVBQWUsRUFBRSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxDQUFDO0lBRWxCLHdEQUF3RDtJQUN4RCxpR0FBaUc7SUFDakcscUVBQXFFO0lBQ3JFLFNBQVMsRUFBRTtRQUNULEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTO1FBQ25DLGVBQWUsRUFBRSx1Q0FBdUM7S0FDekQ7SUFFRCxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLDBGQUEwRjtJQUMxRixlQUFlLEVBQUUsS0FBSztJQUV0QixnRkFBZ0Y7SUFDaEYsbUdBQW1HO0lBQ25HLGtEQUFrRDtJQUNsRCx1QkFBdUIsRUFBRSxJQUFJO0lBQzdCLHFCQUFxQixFQUFFLElBQUk7Q0FDNUIsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQXNCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGFjdFR5cGUsIERpc3BsYXlHcmlkLCBHcmlkc3RlckNvbmZpZywgR3JpZFR5cGUgfSBmcm9tICdncmlkc3RlcjE4JztcbmltcG9ydCB7IFRfZ3JpZExheW91dF9ub2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGdyaWRzdGVyIGNobyBsxrDhu5tpIEPhuqRQIFRSQU5HLlxuICpcbiAqIE3hu41pIGdpw6EgdHLhu4sgZMaw4bubaSDEkcOieSDEkeG7gXUgxJHhur9uIHThu6sgbeG7mXQgbOG7l2kgxJHDoyDEkW8gxJHGsOG7o2MgdHLDqm4gc+G6o24gcGjhuqltIHRo4bqtdCwga2jDtG5nIHBo4bqjaSBjaOG7jW4gdGhlbyBj4bqjbVxuICogdMOtbmguIMSQ4buVaSBi4bqldCBr4buzIGTDsm5nIG7DoG8gY8OzIGThuqV1IPCflLQgc+G6vSBsw6BtIHPhu5FuZyBs4bqhaSDEkcO6bmcgbOG7l2kgZ2hpIHRyb25nIGNvbW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBncmlkTGF5b3V0Um9vdENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAvLyDwn5S0IFZlcnRpY2FsRml4ZWQg4oCUIEPhuqRNIMSR4buVaSBzYW5nIEZpdCBoYXkgU2Nyb2xsVmVydGljYWwuXG4gIC8vIGBGaXRgIGNoaWEgxJHhu4F1IGNoaeG7gXUgY2FvIGtodW5nIGNobyBz4buRIGjDoG5nIMSRYW5nIGTDuW5nLCBuw6puIGNhcmQga2hhaSBgcm93czogMmAgcGjDrG5oIHThu6sgMTI0cHggbMOqblxuICAvLyAyNDdweC4gYFNjcm9sbFZlcnRpY2FsYCBLSMOUTkcgxJHhu41jIGBmaXhlZFJvd0hlaWdodGAgKG3DoyBsaWI6IGNo4buJIGBGaXhlZGAgdsOgIGBWZXJ0aWNhbEZpeGVkYCDEkeG7jWMpLlxuICBncmlkVHlwZTogR3JpZFR5cGUuVmVydGljYWxGaXhlZCxcblxuICAvLyDwn5S0IE5vbmUg4oCUIEPhuqRNIHF1YXkgbOG6oWkgQ29tcGFjdFVwLlxuICAvLyBgQ29tcGFjdFVwYCBow7p0IG3hu41pIGto4buRaSBsw6puIHPDoXQgbmhhdSBOR0FZIHNhdSBt4buXaSB0aGFvIHTDoWMsIG7Dqm46XG4gIC8vICDCtyBrw6lvIG3DqXAgZMaw4bubaSBjaG8ga2jhu5FpIGNhbyB0aMOqbSDihpIgY2jhu5cga2jhu5FpIGTGsOG7m2kgduG7q2EgbmjGsOG7nW5nIGLhu4sgaMO6dCBs4bqlcCBs4bqhaSB04bupYyB0aMOsLCBjw7oga8OpbyBi4buLXG4gIC8vICAgIGBjaGVja0dyaWRDb2xsaXNpb25gIGLDoW8gdmEgY2jhuqFtIHLhu5NpIEhPw4BOIE5HVVnDik4gKGto4buRaSDEkeG7qW5nIGltIGTDuSBrw6lvKTtcbiAgLy8gIMK3IGvDqW8gdGjhuqMgxJHhu5VpIHbhu4sgdHLDrSDihpIga2jhu5FpIHbhu6thIG5oxrDhu51uZyBjaOG7lyBi4buLIGjDunQgduG7gSBuZ2F5LCBraOG7kWkgxJFhbmcga8OpbyBraMO0bmcgY8OzIGNo4buXIMSR4bq3dCB2w6BcbiAgLy8gICAgdHJlbyBsxqEgbOG7rW5nIGdp4buvYSBoYWkga2jhu5FpLlxuICAvLyBNdeG7kW4gZOG7k24ga2jDrXQgdGjDrCBn4buNaSBgc2FwR29uKClgIGPhu6dhIHNlcnZpY2UuXG4gIGNvbXBhY3RUeXBlOiBDb21wYWN0VHlwZS5Ob25lLFxuICBkaXNwbGF5R3JpZDogRGlzcGxheUdyaWQuT25EcmFnQW5kUmVzaXplLFxuXG4gIC8vIPCflLQgcHVzaEl0ZW1zOiB0cnVlIOKAlCBD4bqkTSDEkeG7gyBmYWxzZS5cbiAgLy8gYHN3YXBgIGPhu6dhIGxpYiBDSOG7iCBob8OhbiB24buLIMSRxrDhu6NjIEhBSSBLSOG7kEkgQ8OZTkcgS8ONQ0ggVEjGr+G7mkMgKG3DoyBsaWIgYGNoZWNrU3dhcGA6IHTDrW5oIGRpZmZYL2RpZmZZXG4gIC8vIHLhu5NpIGhvw6FuIHbhu4ssIGzhu4djaCBrw61jaCB0aMaw4bubYyB0aMOsIGBjaGVja0NvbGxpc2lvbmAgYsOhbyB2YSBjaOG6oW0gdsOgIGhvw6BuIG5ndXnDqm4pLiBLaOG7kWkgM3gyIGfhurdwXG4gIC8vIGNvbnRhaW5lciA3eDUgbsOqbiBraMO0bmcgc3dhcCDEkcaw4bujYywgbcOgIGBwdXNoSXRlbXM6IGZhbHNlYCBjxaluZyBraMO0bmcgY2hvIGNvbnRhaW5lciBuaMaw4budbmcgxJHGsOG7nW5nXG4gIC8vIOKGkiBC4bq+IFThuq5DOiBraOG7kWkgxJFhbmcga8OpbyBraMO0bmcgxJHhurd0IMSRxrDhu6NjIOG7nyDEkcOidS5cbiAgcHVzaEl0ZW1zOiB0cnVlLFxuICAvLyBjaOG7iSDEkeG6qXkgWFXhu5BORzogxJHhuql5IG5nYW5nIGzDoG0geMO0IGzhu4djaCBi4buRIGPhu6VjIGPhu5l0IG5nxrDhu51pIGTDuW5nIHbhu6thIMSR4bq3dFxuICBwdXNoRGlyZWN0aW9uczogeyBub3J0aDogZmFsc2UsIGVhc3Q6IGZhbHNlLCBzb3V0aDogdHJ1ZSwgd2VzdDogZmFsc2UgfSxcbiAgcHVzaFJlc2l6ZUl0ZW1zOiB0cnVlLFxuICBzd2FwOiB0cnVlLFxuICBzd2FwV2hpbGVEcmFnZ2luZzogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8vIGRlbGF5U3RhcnQ6IDAgdsOsIGvDqW8gcXVhIHRheSBj4bqnbSBjaHV5w6puIGThu6VuZyAoZHJhZ0hhbmRsZUNsYXNzKSB2w6AgaWdub3JlQ29udGVudDogdHJ1ZS5cbiAgICAvLyBLaGkgbmfGsOG7nWkgZMO5bmcgYuG6pW0gdsOgbyB0aGFuaCB0YXkgY+G6p20gbMOgIGNo4bunIMSR4buZbmcga8Opbywga2jDtG5nIGPhuqduIHRy4buFIDE2MG1zIHRyw6FuaCBodeG7tyBrw6lvLlxuICAgIGRlbGF5U3RhcnQ6IDAsXG4gICAgLy8g8J+UtCBgY2hlY2tEcmFnSGFuZGxlQ2xhc3NgIGR1eeG7h3QgRE9NIHThu6sgY2jhu5cgYuG6pW0gTkfGr+G7okMgTMOKTiBDSEEsIHbDoCB0csOqbiBN4buWSSBub2RlIG7DsyBraeG7g21cbiAgICAvLyBgZHJhZ0hhbmRsZUNsYXNzYCBUUsav4buaQyBgaWdub3JlQ29udGVudENsYXNzYC4gVsOsIHbhuq15IG3hu5l0IHBo4bqnbiB04butIEtIw5RORyDEkcaw4bujYyBtYW5nIGPhuqMgaGFpIGNsYXNzXG4gICAgLy8gY8O5bmcgbMO6YyDigJQgbWFuZyBj4bqjIGhhaSB0aMOsIGxpYiBn4bq3cCB0YXkgY+G6p20gdHLGsOG7m2MsIHRy4bqjIGB0cnVlYCwgY2xhc3MgY2jhurduIGtow7RuZyB04bubaSBsxrDhu6N0LlxuICAgIGlnbm9yZUNvbnRlbnRDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtYmxvY2stcGFyZW50LWRyYWcnLFxuICAgIGlnbm9yZUNvbnRlbnQ6IHRydWUsXG4gICAgZHJhZ0hhbmRsZUNsYXNzOiAnbGlicy11aS1ncmlkLWxheW91dC1kcmFnLWhhbmRsZScsXG4gIH0sXG5cbiAgcmVzaXphYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDEkeG7pyA4IGjGsOG7m25nIG5oxrAgY+G7rWEgc+G7lSB0aMaw4budbmc7IGNo4buJIGPDsyBnw7NjIGTGsOG7m2ktcGjhuqNpIHRow6wgcXXDoSBraMOzIHRyw7puZ1xuICAgIGhhbmRsZXM6IHsgczogdHJ1ZSwgZTogdHJ1ZSwgbjogdHJ1ZSwgdzogdHJ1ZSwgc2U6IHRydWUsIG5lOiB0cnVlLCBzdzogdHJ1ZSwgbnc6IHRydWUgfSxcbiAgfSxcblxuICBtYXJnaW46IDEyLFxuICBvdXRlck1hcmdpbjogdHJ1ZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDQwLFxuICBtaW5Db2xzOiAxMixcbiAgbWF4Q29sczogMTIsXG4gIG1pblJvd3M6IDIsXG5cbiAgLy8g8J+UtCBLSMOUTkcgZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIGto4buRaS4gTGliIGPDsyBCQSB0cuG6p24gbeG6t2MgxJHhu4tuaCBwaOG6o2kgdsO0IGhp4buHdSBob8OhIEPDmU5HIEzDmkMsIHRoaeG6v3UgbeG7mXRcbiAgLy8gY8OhaSBsw6AgduG6q24gYuG7iyBjaOG6t246IGBtYXhJdGVtUm93czogNTBgIMK3IGBtYXhJdGVtQ29sczogNTBgIMK3IGBtYXhJdGVtQXJlYTogMjUwMGAgKHRy4bqnbiBESeG7hk4gVMONQ0hcbiAgLy8gY29scyDDlyByb3dzIOKAlCBraMOzIHRo4bqleSBuaOG6pXQ6IGto4buRaSAxMiBj4buZdCBjaOG7iSBj4bqnbiAyMDkgaMOgbmcgbMOgIMSR4bulbmcgdHLhuqduIGTDuSBoYWkgdHLhuqduIGtpYSBjw7JuIGTGsCkuXG4gIC8vIGBtYXhSb3dzYCBsw6AgdHLhuqduIGPhu6dhIEPhuqIgTMav4buaSSwgY8WpbmcgcGjhuqNpIG7hu5tpIHRoZW8uXG4gIG1heFJvd3M6IDUwMDAsXG4gIG1heEl0ZW1Sb3dzOiA1MDAwLFxuICBtYXhJdGVtQ29sczogMTIsXG4gIG1heEl0ZW1BcmVhOiA2MDAwMCxcblxuICAvLyDwn5S0IFRy4bqnbiBM4buaUCBDSOG7kk5HLiBN4bq3YyDEkeG7i25oIGPhu6dhIGxpYiBsw6AgMiDigJQgcXXDoSB0aOG6pXA6IGtoaSBi4bqtdCBjaOG7k25nIGto4buRaSwgdGjGsCB2aeG7h24gZ8OhbiBt4buXaSBraOG7kWlcbiAgLy8gbeG7mXQgbOG7m3AgcmnDqm5nIMSR4buDIGNow7puZyBraMOhYyBuaGF1LCBuw6puIGNo4buJIDMga2jhu5FpIGzDoCDEkcOjIMSR4bulbmcgdHLhuqduIHbDoCBjw6FjIGto4buRaSBzYXUgbOG6oWkgcsahaSB24buBXG4gIC8vIGPDuW5nIGzhu5twLCB04bupYyBjaOG7k25nIG5oYXUgYuG7iyBjaOG6t24gdHLhu58gbOG6oWkuXG4gIG1heExheWVySW5kZXg6IDUwMDAsXG5cbiAgc2V0R3JpZFNpemU6IHRydWUsXG4gIGZpeGVkUm93SGVpZ2h0OiA1NixcbiAgZGVmYXVsdEl0ZW1Db2xzOiAzLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG4gIG1pbkl0ZW1Sb3dzOiAxLFxuICBtb2JpbGVCcmVha3BvaW50OiAtMSxcbn0pO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGNobyBsxrDhu5tpIEzhu5JORyAocnXhu5l0IG3hu5l0IGNvbnRhaW5lcikuXG4gKlxuICogS+G6vyB0aOG7q2EgbMaw4bubaSB0cmFuZyBy4buTaSBnaGkgxJHDqCBwaOG6p24ga2jDoWMgYmnhu4d0LiBCYSDEkWnhu4NtIHF1YW4gdHLhu41uZyBuaOG6pXQ6IGBzZXRHcmlkU2l6ZWAgcGjhuqNpIFThuq5ULFxuICogdGF5IGPhuqdtIHBo4bqjaSBtYW5nIFTDik4gUknDik5HLCB2w6AgdOG7sS1jdeG7mW4ta2hpLWvDqW8gcGjhuqNpIFThuq5ULlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dE5lc3RlZENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAuLi5ncmlkTGF5b3V0Um9vdENvbmZpZygpLFxuXG4gIC8vIPCflLQgUEjhuqJJIHThuq90IGNobyBsxrDhu5tpIGzhu5NuZy4gYHNldEdyaWRTaXplYCBsw6BtIGdyaWRzdGVyIHThu7EgZ2hpIHN0eWxlIHdpZHRoL2hlaWdodCBsw6puIENIw41OSCBuw7MsXG4gIC8vIHNpbmggdsOybmcgbOG6t3AgxJFvLXLhu5NpLWdoaSB24bubaSBSZXNpemVPYnNlcnZlciBj4bunYSBraHVuZyBuZ2/DoGkgKGtodW5nIMSR4buVaSDihpIgb25SZXNpemUgeG/DoSBzdHlsZSDihpJcbiAgLy8gc2V0R3JpZFNpemUgZ2hpIGzhuqFpKSDihpIgbMaw4bubaSBjb24gY28gZOG6p24gduG7gSA2NHg2NHB4IHRyb25nIGtodW5nIDg2OHB4LlxuICBzZXRHcmlkU2l6ZTogZmFsc2UsXG5cbiAgLy8ga2hlIDJweDoga2jhu5FpIGNvbiBsw6AgY8OhYyBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIEPDmU5HIG3hu5l0IGNhcmQsIGtoZSBy4buZbmcgbMOgbSBjaMO6bmcgdHLDtG5nIG5oxrAgY2FyZCBy4budaVxuICBtYXJnaW46IDIsXG4gIC8vIEzGsOG7m2kgbOG7k25nIEtIw5RORyB04buxIGNo4burYSBs4buBIOKAlCBs4buBIGzDoCBj4bunYSBW4buOIGNvbnRhaW5lciAoYGNvbnRhaW5lclBhZGRpbmdgKSwga2jDtG5nIHBo4bqjaSBj4bunYSBsxrDhu5tpLlxuICAvLyDEkOG6t3Qg4bufIHbhu48gdGjDrCBydeG7mXQgY28gbOG6oWkgxJHDum5nIGLhurFuZyBwaOG6p24gY8OybiBs4bqhaSwgdGF5IGPhuqdtIHJlc2l6ZSBj4bunYSBraOG7kWkgY29uIGx1w7RuIG7hurFtIHRyb25nIHThuqdtXG4gIC8vIGNodeG7mXQgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2OiBcImzGsOG7m2kgY2hhIGPDsyBwYWRkaW5nIGNo4bupIGtvIHBo4bqjaSBjb25cIikuXG4gIG91dGVyTWFyZ2luOiBmYWxzZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDAsXG5cbiAgLy8gaMOgbmcgMTZweCBjaG8gYsaw4bubYyBrw6lvIG3hu4tuLCB2w6Agc8OgbiAxIGjDoG5nID0gMTZweCBuw6puIGto4buRaSBjbyDEkcaw4bujYyBuaOG7jyBoxqFuIG5oaeG7gXVcbiAgZml4ZWRSb3dIZWlnaHQ6IDE2LFxuICBtaW5Sb3dzOiAxLFxuICBtaW5JdGVtUm93czogMSxcbiAgZGVmYXVsdEl0ZW1Db2xzOiAyLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG5cbiAgLy8g8J+UtCBUYXkgY+G6p20gUknDik5HIOKAlCBD4bqkTSBkw7luZyBjaHVuZyB0w6puIHbhu5tpIGzGsOG7m2kgdHJhbmcuXG4gIC8vIGBjaGVja0RyYWdIYW5kbGVDbGFzc2AgdHLhuqMgYHRydWVgIOG7nyBub2RlIMSQ4bqmVSBUScOKTiBjw7MgYGRyYWdIYW5kbGVDbGFzc2AuIETDuW5nIGNodW5nIG3hu5l0IHTDqm4gdGjDrFxuICAvLyBsxrDhu5tpIENIQSBjxaluZyBuaOG6rW4gcmEgdGF5IGPhuqdtIGPhu6dhIGto4buRaSBjb24gdsOgIG5o4bqlYyBsdcO0biBjb250YWluZXIuXG4gIGRyYWdnYWJsZToge1xuICAgIC4uLmdyaWRMYXlvdXRSb290Q29uZmlnKCkuZHJhZ2dhYmxlLFxuICAgIGRyYWdIYW5kbGVDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtZHJhZy1oYW5kbGUtY2hpbGQnLFxuICB9LFxuXG4gIC8vIPCflLQgS8OJTyBNw4lQIHRow6wga2jhu5FpIGTGsOG7m2kgxJDhu6hORyBZw4pOLCBjaOG7iSBraG/huqNuZyB0cuG7kW5nIGdp4buvYSBoYWkga2jhu5FpIGNvIGdpw6NuLiBC4bqtdCAoa+G6vyB0aOG7q2EgdOG7qyBsxrDhu5tpXG4gIC8vIHRyYW5nKSB0aMOsIG3hu5dpIGPDuiBrw6lvIMSR4bqpeSBk4buTbiBj4bqjIGPhu5l0IHh14buRbmcg4oCUIG5nxrDhu51pIGTDuW5nIGNo4buJIG114buRbiBt4buZdCBraOG7kWkgdG8gaMahbiBt4buZdCBjaMO6dCBtw6AgY+G6o1xuICAvLyBjYXJkIGTDoGkgcmEuIGBwdXNoSXRlbXNgIHbhuqtuIGdp4buvOiBuw7MgbG8gdmnhu4djIEvDiU8gVEjhuqIgxJHhu5VpIGNo4buXLCBraMOhYyB2aeG7h2MgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICBwdXNoUmVzaXplSXRlbXM6IGZhbHNlLFxuXG4gIC8vIPCflLQgVOG6r3QgdOG7sSBjdeG7mW4ga2hpIGvDqW8gdOG7m2kgc8OhdCBtw6lwLiBMaWIgdGjhuqV5IGNodeG7mXQgZ+G6p24gYmnDqm4gbMOgIGN14buZbiBsxrDhu5tpIHRoZW9cbiAgLy8gKGBzY3JvbGxTZW5zaXRpdml0eWApLCBuaMawbmcgbMaw4bubaSBjb24gbuG6sW0gdHJvbmcgY2FyZCBjw7MgYG92ZXJmbG93OiBoaWRkZW5gIOKAlCBjdeG7mW4g4bufIMSRw6J5IMSR4bqpeSBraOG7kWlcbiAgLy8gY29uIHJhIE5HT8OASSBraHVuZyBjb250YWluZXIgcuG7k2kga+G6uXQgbHXDtG4g4bufIMSRw7MuXG4gIGRpc2FibGVTY3JvbGxIb3Jpem9udGFsOiB0cnVlLFxuICBkaXNhYmxlU2Nyb2xsVmVydGljYWw6IHRydWUsXG59KTtcblxuLyoqXG4gKiBDw6J5IHLhu5duZyBkw7luZyBraGkgY2jGsGEgY8OzIGThu68gbGnhu4d1IOKAlCBt4bq3dCBwaOG6s25nIHbhur0gcmEgbeG7mXQgbMaw4bubaSB0cuG7kW5nIHRoYXkgdsOsIHbhu6EuXG4gKiBY4bqjeSByYSB0cm9uZyBuaOG7i3AgZ2nhu69hIGzDumMgY29tcG9uZW50IGThu7FuZyB2w6AgbMO6YyBgaW5pdCgpYCBjaOG6oXkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbXB0eVJvb3ROb2RlID0gKCk6IFRfZ3JpZExheW91dF9ub2RlID0+ICh7IGlkOiAncm9vdCcsIHg6IDAsIHk6IDAsIGNvbHM6IDEyLCByb3dzOiAwLCBjaGlsZHJlbjogW10gfSk7XG4iXX0=