@aquera/ngx-smart-table 0.0.17-patch-0.5 → 0.0.17-patch-0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/editors/index.mjs +2 -1
- package/esm2020/lib/editors/nile-chip-editor.mjs +296 -0
- package/esm2020/lib/editors/nile-code-editor.mjs +9 -10
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +36 -17
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +34 -27
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +5 -5
- package/fesm2015/aquera-ngx-smart-table.mjs +384 -55
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -1
- package/fesm2020/aquera-ngx-smart-table.mjs +376 -55
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -1
- package/lib/editors/index.d.ts +1 -0
- package/lib/editors/nile-chip-editor.d.ts +95 -0
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +4 -2
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +4 -2
- package/lib/renderer/components/st-table/st-table.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -6,5 +6,6 @@ export { NileSelectEditor } from './nile-select-editor';
|
|
|
6
6
|
export { NileAutoCompleteEditor } from './nile-autocomplete-editor';
|
|
7
7
|
export { NileCalendarEditor } from './nile-calendar-editor';
|
|
8
8
|
export { NileDatePickerEditor } from './nile-date-picker-editor';
|
|
9
|
+
export { NileChipEditor } from './nile-chip-editor';
|
|
9
10
|
export { NileCodeEditor } from './nile-code-editor';
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsc0JBQXNCLEVBQXFELE1BQU0sNEJBQTRCLENBQUM7QUFDdkgsT0FBTyxFQUFFLGtCQUFrQixFQUFnRCxNQUFNLHdCQUF3QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBMEMsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsY0FBYyxFQUFxQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQWtFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBjZWxsIGVkaXRvcnMgZm9yIG5neC1zbWFydC10YWJsZVxuICovXG5cbmV4cG9ydCB7IE5pbGVJbnB1dEVkaXRvciwgTmlsZUlucHV0RWRpdG9yT3B0aW9ucyB9IGZyb20gJy4vbmlsZS1pbnB1dC1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZVNlbGVjdEVkaXRvciwgTmlsZVNlbGVjdEVkaXRvck9wdGlvbnMsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4vbmlsZS1zZWxlY3QtZWRpdG9yJztcbmV4cG9ydCB7IE5pbGVBdXRvQ29tcGxldGVFZGl0b3IsIE5pbGVBdXRvQ29tcGxldGVFZGl0b3JPcHRpb25zLCBBdXRvQ29tcGxldGVPcHRpb24gfSBmcm9tICcuL25pbGUtYXV0b2NvbXBsZXRlLWVkaXRvcic7XG5leHBvcnQgeyBOaWxlQ2FsZW5kYXJFZGl0b3IsIE5pbGVDYWxlbmRhckVkaXRvck9wdGlvbnMsIEFsbG93ZWREYXRlc1JhbmdlIH0gZnJvbSAnLi9uaWxlLWNhbGVuZGFyLWVkaXRvcic7XG5leHBvcnQgeyBOaWxlRGF0ZVBpY2tlckVkaXRvciwgTmlsZURhdGVQaWNrZXJFZGl0b3JPcHRpb25zLCBEYXRlUmFuZ2UgfSBmcm9tICcuL25pbGUtZGF0ZS1waWNrZXItZWRpdG9yJztcbmV4cG9ydCB7IE5pbGVDaGlwRWRpdG9yLCBOaWxlQ2hpcEVkaXRvck9wdGlvbnMsIENoaXBPcHRpb24gfSBmcm9tICcuL25pbGUtY2hpcC1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZUNvZGVFZGl0b3IsIE5pbGVDb2RlRWRpdG9yT3B0aW9ucywgQ29kZUVkaXRvckNvbXBsZXRpb24sIEF1dG9Db21wbGV0ZVN0eWxlIH0gZnJvbSAnLi9uaWxlLWNvZGUtZWRpdG9yJztcbiJdfQ==
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom editor using NileChip from @aquera/nile-elements
|
|
3
|
+
* Renders the chip input in a floating popover below the cell to avoid row height mismatch.
|
|
4
|
+
*
|
|
5
|
+
* @see https://nile.aqueralabs.com/1.6.3/chip?theme=enterprise
|
|
6
|
+
*/
|
|
7
|
+
let chipStylesInjected = false;
|
|
8
|
+
function injectChipStyles() {
|
|
9
|
+
if (chipStylesInjected)
|
|
10
|
+
return;
|
|
11
|
+
chipStylesInjected = true;
|
|
12
|
+
const styleId = 'nile-chip-editor-styles';
|
|
13
|
+
if (document.getElementById(styleId))
|
|
14
|
+
return;
|
|
15
|
+
const style = document.createElement('style');
|
|
16
|
+
style.id = styleId;
|
|
17
|
+
style.textContent = `
|
|
18
|
+
.st-chip-popover {
|
|
19
|
+
position: fixed;
|
|
20
|
+
z-index: 10000;
|
|
21
|
+
background: var(--nile-colors-white-base, #fff);
|
|
22
|
+
border: 1px solid var(--nile-colors-neutral-200, #e2e8f0);
|
|
23
|
+
border-radius: 6px;
|
|
24
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
|
|
25
|
+
padding: 8px;
|
|
26
|
+
box-sizing: border-box;
|
|
27
|
+
max-height: 200px;
|
|
28
|
+
overflow-y: auto;
|
|
29
|
+
}
|
|
30
|
+
.st-chip-popover nile-chip {
|
|
31
|
+
width: 100%;
|
|
32
|
+
}
|
|
33
|
+
.st-chip-popover nile-chip::part(base) {
|
|
34
|
+
border: none !important;
|
|
35
|
+
box-shadow: none !important;
|
|
36
|
+
min-height: 32px;
|
|
37
|
+
}
|
|
38
|
+
.st-chip-popover nile-chip::part(input) {
|
|
39
|
+
font-size: var(--nile-font-size-small, 13px);
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
document.head.appendChild(style);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Custom editor that uses NileChip (tag input) component.
|
|
46
|
+
* Renders in a floating popover below the cell to avoid expanding row height.
|
|
47
|
+
*
|
|
48
|
+
* Cell value is expected to be `string[]` (array of tag strings).
|
|
49
|
+
*/
|
|
50
|
+
export class NileChipEditor {
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
this.acceptsInitialKeypress = false;
|
|
54
|
+
this.eventListeners = [];
|
|
55
|
+
this.trackedValues = [];
|
|
56
|
+
this.hasChangeOccurred = false;
|
|
57
|
+
}
|
|
58
|
+
edit(context) {
|
|
59
|
+
if (!context.container) {
|
|
60
|
+
console.warn('NileChipEditor requires a container element');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
injectChipStyles();
|
|
64
|
+
this.cellContainer = context.container;
|
|
65
|
+
// Create the floating popover
|
|
66
|
+
this.popover = document.createElement('div');
|
|
67
|
+
this.popover.className = 'st-chip-popover';
|
|
68
|
+
// Create nile-chip inside the popover
|
|
69
|
+
this.chip = document.createElement('nile-chip');
|
|
70
|
+
this.chip.className = 'st-cell-editor st-nile-chip-editor';
|
|
71
|
+
this.setInitialValue(context.value);
|
|
72
|
+
this.applyOptions();
|
|
73
|
+
this.popover.appendChild(this.chip);
|
|
74
|
+
// Apply custom max-height if provided
|
|
75
|
+
if (this.options?.popoverMaxHeight) {
|
|
76
|
+
this.popover.style.maxHeight = `${this.options.popoverMaxHeight}px`;
|
|
77
|
+
}
|
|
78
|
+
// Append popover to body and position it
|
|
79
|
+
document.body.appendChild(this.popover);
|
|
80
|
+
this.positionPopover();
|
|
81
|
+
this.setupEventListeners(context);
|
|
82
|
+
if (this.options?.autoFocus !== false) {
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
try {
|
|
85
|
+
this.chip?.focus();
|
|
86
|
+
}
|
|
87
|
+
catch { /* ignore */ }
|
|
88
|
+
}, 0);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
positionPopover() {
|
|
92
|
+
if (!this.popover || !this.cellContainer)
|
|
93
|
+
return;
|
|
94
|
+
const rect = this.cellContainer.getBoundingClientRect();
|
|
95
|
+
const minWidth = this.options?.popoverMinWidth ?? rect.width;
|
|
96
|
+
const popoverWidth = Math.max(minWidth, rect.width);
|
|
97
|
+
this.popover.style.top = `${rect.bottom + 2}px`;
|
|
98
|
+
this.popover.style.left = `${rect.left}px`;
|
|
99
|
+
this.popover.style.width = `${popoverWidth}px`;
|
|
100
|
+
// After rendering, check if it goes off-screen bottom and flip above if needed
|
|
101
|
+
requestAnimationFrame(() => {
|
|
102
|
+
if (!this.popover)
|
|
103
|
+
return;
|
|
104
|
+
const popRect = this.popover.getBoundingClientRect();
|
|
105
|
+
if (popRect.bottom > window.innerHeight) {
|
|
106
|
+
this.popover.style.top = `${rect.top - popRect.height - 2}px`;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
setInitialValue(value) {
|
|
111
|
+
if (!this.chip)
|
|
112
|
+
return;
|
|
113
|
+
if (Array.isArray(value)) {
|
|
114
|
+
this.trackedValues = [...value];
|
|
115
|
+
this.chip.value = this.trackedValues;
|
|
116
|
+
}
|
|
117
|
+
else if (typeof value === 'string' && value) {
|
|
118
|
+
this.trackedValues = [value];
|
|
119
|
+
this.chip.value = this.trackedValues;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.trackedValues = [];
|
|
123
|
+
this.chip.value = [];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
applyOptions() {
|
|
127
|
+
if (!this.chip || !this.options)
|
|
128
|
+
return;
|
|
129
|
+
if (this.options.placeholder) {
|
|
130
|
+
this.chip.placeholder = this.options.placeholder;
|
|
131
|
+
}
|
|
132
|
+
if (this.options.label) {
|
|
133
|
+
this.chip.label = this.options.label;
|
|
134
|
+
}
|
|
135
|
+
if (this.options.helpText) {
|
|
136
|
+
this.chip.helpText = this.options.helpText;
|
|
137
|
+
}
|
|
138
|
+
if (this.options.disabled !== undefined) {
|
|
139
|
+
this.chip.disabled = this.options.disabled;
|
|
140
|
+
}
|
|
141
|
+
if (this.options.readonly !== undefined) {
|
|
142
|
+
this.chip.readonly = this.options.readonly;
|
|
143
|
+
}
|
|
144
|
+
if (this.options.acceptUserInput !== undefined) {
|
|
145
|
+
this.chip.acceptUserInput = this.options.acceptUserInput;
|
|
146
|
+
}
|
|
147
|
+
if (this.options.noDuplicates !== undefined) {
|
|
148
|
+
this.chip.noDuplicates = this.options.noDuplicates;
|
|
149
|
+
}
|
|
150
|
+
if (this.options.clearable !== undefined) {
|
|
151
|
+
this.chip.clearable = this.options.clearable;
|
|
152
|
+
}
|
|
153
|
+
if (this.options.noWrap !== undefined) {
|
|
154
|
+
this.chip.noWrap = this.options.noWrap;
|
|
155
|
+
}
|
|
156
|
+
if (this.options.noAutoComplete !== undefined) {
|
|
157
|
+
this.chip.noAutoComplete = this.options.noAutoComplete;
|
|
158
|
+
}
|
|
159
|
+
if (this.options.enableVirtualScroll !== undefined) {
|
|
160
|
+
this.chip.enableVirtualScroll = this.options.enableVirtualScroll;
|
|
161
|
+
}
|
|
162
|
+
if (this.options.openDropdownOnFocus !== undefined) {
|
|
163
|
+
this.chip.openDropdownOnFocus = this.options.openDropdownOnFocus;
|
|
164
|
+
}
|
|
165
|
+
if (this.options.loading !== undefined) {
|
|
166
|
+
this.chip.loading = this.options.loading;
|
|
167
|
+
}
|
|
168
|
+
// Visual states
|
|
169
|
+
if (this.options.warning !== undefined) {
|
|
170
|
+
this.chip.warning = this.options.warning;
|
|
171
|
+
}
|
|
172
|
+
if (this.options.error !== undefined) {
|
|
173
|
+
this.chip.error = this.options.error;
|
|
174
|
+
}
|
|
175
|
+
if (this.options.success !== undefined) {
|
|
176
|
+
this.chip.success = this.options.success;
|
|
177
|
+
}
|
|
178
|
+
if (this.options.errorMessage) {
|
|
179
|
+
this.chip.errorMessage = this.options.errorMessage;
|
|
180
|
+
}
|
|
181
|
+
if (this.options.errorIndexes) {
|
|
182
|
+
this.chip.errorIndexes = this.options.errorIndexes;
|
|
183
|
+
}
|
|
184
|
+
// Autocomplete options
|
|
185
|
+
if (this.options.autoCompleteOptions) {
|
|
186
|
+
const opts = this.options.autoCompleteOptions;
|
|
187
|
+
const stringOpts = opts.map(o => typeof o === 'string' ? o : (o.label ?? o.value));
|
|
188
|
+
this.chip.autoCompleteOptions = stringOpts;
|
|
189
|
+
}
|
|
190
|
+
if (this.options.filterFunction) {
|
|
191
|
+
this.chip.filterFunction = this.options.filterFunction;
|
|
192
|
+
}
|
|
193
|
+
if (this.options.renderItemFunction) {
|
|
194
|
+
this.chip.renderItemFunction = this.options.renderItemFunction;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
addListener(element, event, handler, capture) {
|
|
198
|
+
element.addEventListener(event, handler, capture);
|
|
199
|
+
this.eventListeners.push({ element, event, handler, capture });
|
|
200
|
+
}
|
|
201
|
+
setupEventListeners(context) {
|
|
202
|
+
if (!this.chip)
|
|
203
|
+
return;
|
|
204
|
+
// Track chip changes
|
|
205
|
+
this.addListener(this.chip, 'nile-chip-change', (e) => {
|
|
206
|
+
const detail = e.detail;
|
|
207
|
+
const newValue = Array.isArray(detail?.value) ? [...detail.value] : (this.chip?.value ? [...this.chip.value] : []);
|
|
208
|
+
this.trackedValues = newValue;
|
|
209
|
+
this.hasChangeOccurred = true;
|
|
210
|
+
context.onChange(newValue);
|
|
211
|
+
});
|
|
212
|
+
// Keyboard handling on the chip element
|
|
213
|
+
this.addListener(this.chip, 'keydown', (e) => {
|
|
214
|
+
const keyEvent = e;
|
|
215
|
+
if (keyEvent.key === 'Enter') {
|
|
216
|
+
keyEvent.stopPropagation();
|
|
217
|
+
}
|
|
218
|
+
else if (keyEvent.key === 'Escape') {
|
|
219
|
+
keyEvent.preventDefault();
|
|
220
|
+
keyEvent.stopPropagation();
|
|
221
|
+
context.onCancel();
|
|
222
|
+
}
|
|
223
|
+
else if (keyEvent.key === 'Tab') {
|
|
224
|
+
keyEvent.preventDefault();
|
|
225
|
+
keyEvent.stopPropagation();
|
|
226
|
+
context.onSave(this.getCurrentValue());
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
// Click-outside: save when clicking anywhere outside the popover
|
|
230
|
+
let saveTriggered = false;
|
|
231
|
+
const mousedownHandler = (e) => {
|
|
232
|
+
if (saveTriggered)
|
|
233
|
+
return;
|
|
234
|
+
if (!this.popover)
|
|
235
|
+
return;
|
|
236
|
+
const path = e.composedPath();
|
|
237
|
+
for (const el of path) {
|
|
238
|
+
if (el === this.popover)
|
|
239
|
+
return;
|
|
240
|
+
if (el === this.chip)
|
|
241
|
+
return;
|
|
242
|
+
if (el instanceof HTMLElement) {
|
|
243
|
+
if (el.tagName?.toLowerCase() === 'nile-chip')
|
|
244
|
+
return;
|
|
245
|
+
if (el.className && typeof el.className === 'string' && el.className.includes('nile-chip'))
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
saveTriggered = true;
|
|
250
|
+
context.onSave(this.getCurrentValue());
|
|
251
|
+
};
|
|
252
|
+
document.addEventListener('mousedown', mousedownHandler, true);
|
|
253
|
+
this._documentMousedownHandler = mousedownHandler;
|
|
254
|
+
// Reposition on scroll/resize so popover stays aligned with the cell
|
|
255
|
+
const reposition = () => this.positionPopover();
|
|
256
|
+
this.addListener(window, 'resize', reposition);
|
|
257
|
+
this.addListener(window, 'scroll', reposition, true);
|
|
258
|
+
}
|
|
259
|
+
destroy() {
|
|
260
|
+
// Remove document mousedown handler
|
|
261
|
+
if (this._documentMousedownHandler) {
|
|
262
|
+
document.removeEventListener('mousedown', this._documentMousedownHandler, true);
|
|
263
|
+
delete this._documentMousedownHandler;
|
|
264
|
+
}
|
|
265
|
+
// Remove all tracked listeners
|
|
266
|
+
for (const { element, event, handler, capture } of this.eventListeners) {
|
|
267
|
+
element.removeEventListener(event, handler, capture);
|
|
268
|
+
}
|
|
269
|
+
this.eventListeners = [];
|
|
270
|
+
// Remove the popover from the DOM
|
|
271
|
+
if (this.popover) {
|
|
272
|
+
this.popover.remove();
|
|
273
|
+
this.popover = undefined;
|
|
274
|
+
}
|
|
275
|
+
this.chip = undefined;
|
|
276
|
+
this.cellContainer = undefined;
|
|
277
|
+
this.trackedValues = [];
|
|
278
|
+
this.hasChangeOccurred = false;
|
|
279
|
+
}
|
|
280
|
+
focus() {
|
|
281
|
+
try {
|
|
282
|
+
this.chip?.focus();
|
|
283
|
+
}
|
|
284
|
+
catch { /* ignore */ }
|
|
285
|
+
}
|
|
286
|
+
getCurrentValue() {
|
|
287
|
+
if (this.hasChangeOccurred) {
|
|
288
|
+
return [...this.trackedValues];
|
|
289
|
+
}
|
|
290
|
+
if (!this.chip)
|
|
291
|
+
return [];
|
|
292
|
+
const val = this.chip.value;
|
|
293
|
+
return Array.isArray(val) ? [...val] : [];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jaGlwLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNoaXAtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBc0ZILElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUksa0JBQWtCO1FBQUUsT0FBTztJQUMvQixrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7SUFDMUMsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qm5CLENBQUM7SUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQVV6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVQ1RCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsbUJBQWMsR0FBOEYsRUFBRSxDQUFDO1FBQy9HLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQUU2QixDQUFDO0lBRWhFLElBQUksQ0FBQyxPQUFvQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDNUQsT0FBTztT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RUFBRSxDQUFDO1NBQUU7UUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQ3BELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDNUIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNoaXAgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFJlbmRlcnMgdGhlIGNoaXAgaW5wdXQgaW4gYSBmbG9hdGluZyBwb3BvdmVyIGJlbG93IHRoZSBjZWxsIHRvIGF2b2lkIHJvdyBoZWlnaHQgbWlzbWF0Y2guXG4gKlxuICogQHNlZSBodHRwczovL25pbGUuYXF1ZXJhbGFicy5jb20vMS42LjMvY2hpcD90aGVtZT1lbnRlcnByaXNlXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQ2hpcCBvcHRpb24gZm9yIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENoaXBPcHRpb24ge1xuICAvKiogVGhlIG9wdGlvbidzIHZhbHVlICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uIChkZWZhdWx0cyB0byB2YWx1ZSBpZiBvbWl0dGVkKSAqL1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNoaXBFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlQ2hpcEVkaXRvck9wdGlvbnMge1xuICAvKiogQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb24gbGlzdCAoZnVsbCBzZXQpICovXG4gIGF1dG9Db21wbGV0ZU9wdGlvbnM/OiBDaGlwT3B0aW9uW10gfCBzdHJpbmdbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBzaG93biBpbnNpZGUgdGhlIGlucHV0IGFyZWEgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqIEFsbG93IHVzZXJzIHRvIHR5cGUgY3VzdG9tIHZhbHVlcyBub3QgcHJlc2VudCBpbiB0aGUgc3VnZ2VzdGlvbiBsaXN0ICovXG4gIGFjY2VwdFVzZXJJbnB1dD86IGJvb2xlYW47XG5cbiAgLyoqIFByZXZlbnQgZHVwbGljYXRlIGNoaXAgdmFsdWVzICovXG4gIG5vRHVwbGljYXRlcz86IGJvb2xlYW47XG5cbiAgLyoqIERpc2FibGUgdGhlIGNoaXAgaW5wdXQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKiBNYWtlIHRoZSBjaGlwIGlucHV0IHJlYWRvbmx5ICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcblxuICAvKiogU2hvdyBhIGNsZWFyLWFsbCBidXR0b24gKi9cbiAgY2xlYXJhYmxlPzogYm9vbGVhbjtcblxuICAvKiogUHJldmVudCBjaGlwIHRhZ3MgZnJvbSB3cmFwcGluZyB0byBtdWx0aXBsZSBsaW5lcyAqL1xuICBub1dyYXA/OiBib29sZWFuO1xuXG4gIC8qKiBSZW1vdmUgdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBlbnRpcmVseSAqL1xuICBub0F1dG9Db21wbGV0ZT86IGJvb2xlYW47XG5cbiAgLyoqIEVuYWJsZSB2aXJ0dWFsIHNjcm9sbGluZyBpbiB0aGUgc3VnZ2VzdGlvbiBkcm9wZG93biAqL1xuICBlbmFibGVWaXJ0dWFsU2Nyb2xsPzogYm9vbGVhbjtcblxuICAvKiogQ29udHJvbCB3aGV0aGVyIHRoZSBkcm9wZG93biBvcGVucyBvbiBmb2N1cyDigJQgJ3RydWUnIHwgJ2ZhbHNlJyB8ICdhbHdheXMnICovXG4gIG9wZW5Ecm9wZG93bk9uRm9jdXM/OiBzdHJpbmc7XG5cbiAgLyoqIFNob3cgbG9hZGluZyBzcGlubmVyIGluc2lkZSB0aGUgZHJvcGRvd24gKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogV2FybmluZyBzdGF0ZSBzdHlsaW5nICovXG4gIHdhcm5pbmc/OiBib29sZWFuO1xuICAvKiogRXJyb3Igc3RhdGUgc3R5bGluZyAqL1xuICBlcnJvcj86IGJvb2xlYW47XG4gIC8qKiBTdWNjZXNzIHN0YXRlIHN0eWxpbmcgKi9cbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIHNob3duIGJlbG93IHRoZSBpbnB1dCAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBIZWxwIHRleHQgc2hvd24gYmVsb3cgdGhlIGlucHV0ICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICAvKiogTGFiZWwgdGV4dCBmb3IgdGhlIGNoaXAgaW5wdXQgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJbmRleGVzIG9mIGNoaXBzIHRvIGhpZ2hsaWdodCBhcyBlcnJvcnMgKi9cbiAgZXJyb3JJbmRleGVzPzogbnVtYmVyW107XG5cbiAgLyoqIEN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gZm9yIGF1dG9jb21wbGV0ZSAqL1xuICBmaWx0ZXJGdW5jdGlvbj86IChxdWVyeTogc3RyaW5nLCBvcHRpb246IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKiogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgZHJvcGRvd24gaXRlbXMgKi9cbiAgcmVuZGVySXRlbUZ1bmN0aW9uPzogKG9wdGlvbjogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLyoqIEF1dG8tZm9jdXMgdGhlIGlucHV0IHdoZW4gZWRpdG9yIG9wZW5zIChkZWZhdWx0OiB0cnVlKSAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuXG4gIC8qKiBNaW5pbXVtIHdpZHRoIG9mIHRoZSBwb3BvdmVyIGluIHB4IChkZWZhdWx0OiB3aWR0aCBvZiB0aGUgY2VsbCkgKi9cbiAgcG9wb3Zlck1pbldpZHRoPzogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGhlaWdodCBvZiB0aGUgcG9wb3ZlciBpbiBweCBiZWZvcmUgaXQgc2Nyb2xscyAoZGVmYXVsdDogMjAwKSAqL1xuICBwb3BvdmVyTWF4SGVpZ2h0PzogbnVtYmVyO1xufVxuXG5sZXQgY2hpcFN0eWxlc0luamVjdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbmplY3RDaGlwU3R5bGVzKCk6IHZvaWQge1xuICBpZiAoY2hpcFN0eWxlc0luamVjdGVkKSByZXR1cm47XG4gIGNoaXBTdHlsZXNJbmplY3RlZCA9IHRydWU7XG5cbiAgY29uc3Qgc3R5bGVJZCA9ICduaWxlLWNoaXAtZWRpdG9yLXN0eWxlcyc7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZUlkKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUuaWQgPSBzdHlsZUlkO1xuICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAuc3QtY2hpcC1wb3BvdmVyIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHotaW5kZXg6IDEwMDAwO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvcnMtd2hpdGUtYmFzZSwgI2ZmZik7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9ycy1uZXV0cmFsLTIwMCwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICBwYWRkaW5nOiA4cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbWF4LWhlaWdodDogMjAwcHg7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIH1cbiAgICAuc3QtY2hpcC1wb3BvdmVyIG5pbGUtY2hpcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnN0LWNoaXAtcG9wb3ZlciBuaWxlLWNoaXA6OnBhcnQoYmFzZSkge1xuICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBtaW4taGVpZ2h0OiAzMnB4O1xuICAgIH1cbiAgICAuc3QtY2hpcC1wb3BvdmVyIG5pbGUtY2hpcDo6cGFydChpbnB1dCkge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1uaWxlLWZvbnQtc2l6ZS1zbWFsbCwgMTNweCk7XG4gICAgfVxuICBgO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlQ2hpcCAodGFnIGlucHV0KSBjb21wb25lbnQuXG4gKiBSZW5kZXJzIGluIGEgZmxvYXRpbmcgcG9wb3ZlciBiZWxvdyB0aGUgY2VsbCB0byBhdm9pZCBleHBhbmRpbmcgcm93IGhlaWdodC5cbiAqXG4gKiBDZWxsIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGBzdHJpbmdbXWAgKGFycmF5IG9mIHRhZyBzdHJpbmdzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVDaGlwRWRpdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvcjxzdHJpbmdbXT4ge1xuICBhY2NlcHRzSW5pdGlhbEtleXByZXNzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjaGlwPzogYW55O1xuICBwcml2YXRlIHBvcG92ZXI/OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBjZWxsQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZWxlbWVudDogRXZlbnRUYXJnZXQ7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXI7IGNhcHR1cmU/OiBib29sZWFuIH0+ID0gW107XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBoYXNDaGFuZ2VPY2N1cnJlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVDaGlwRWRpdG9yT3B0aW9ucykge31cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PHN0cmluZ1tdPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTmlsZUNoaXBFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluamVjdENoaXBTdHlsZXMoKTtcblxuICAgIHRoaXMuY2VsbENvbnRhaW5lciA9IGNvbnRleHQuY29udGFpbmVyO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBmbG9hdGluZyBwb3BvdmVyXG4gICAgdGhpcy5wb3BvdmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5wb3BvdmVyLmNsYXNzTmFtZSA9ICdzdC1jaGlwLXBvcG92ZXInO1xuXG4gICAgLy8gQ3JlYXRlIG5pbGUtY2hpcCBpbnNpZGUgdGhlIHBvcG92ZXJcbiAgICB0aGlzLmNoaXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWNoaXAnKTtcbiAgICB0aGlzLmNoaXAuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY2hpcC1lZGl0b3InO1xuXG4gICAgdGhpcy5zZXRJbml0aWFsVmFsdWUoY29udGV4dC52YWx1ZSk7XG4gICAgdGhpcy5hcHBseU9wdGlvbnMoKTtcbiAgICB0aGlzLnBvcG92ZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGlwKTtcblxuICAgIC8vIEFwcGx5IGN1c3RvbSBtYXgtaGVpZ2h0IGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucG9wb3Zlck1heEhlaWdodCkge1xuICAgICAgdGhpcy5wb3BvdmVyLnN0eWxlLm1heEhlaWdodCA9IGAke3RoaXMub3B0aW9ucy5wb3BvdmVyTWF4SGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcG9wb3ZlciB0byBib2R5IGFuZCBwb3NpdGlvbiBpdFxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3BvdmVyKTtcbiAgICB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7IHRoaXMuY2hpcD8uZm9jdXMoKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uUG9wb3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9wb3ZlciB8fCAhdGhpcy5jZWxsQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5jZWxsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1pbldpZHRoID0gdGhpcy5vcHRpb25zPy5wb3BvdmVyTWluV2lkdGggPz8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBwb3BvdmVyV2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgcmVjdC53aWR0aCk7XG5cbiAgICB0aGlzLnBvcG92ZXIuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b20gKyAyfXB4YDtcbiAgICB0aGlzLnBvcG92ZXIuc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XG4gICAgdGhpcy5wb3BvdmVyLnN0eWxlLndpZHRoID0gYCR7cG9wb3ZlcldpZHRofXB4YDtcblxuICAgIC8vIEFmdGVyIHJlbmRlcmluZywgY2hlY2sgaWYgaXQgZ29lcyBvZmYtc2NyZWVuIGJvdHRvbSBhbmQgZmxpcCBhYm92ZSBpZiBuZWVkZWRcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBvcG92ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHBvcFJlY3QgPSB0aGlzLnBvcG92ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocG9wUmVjdC5ib3R0b20gPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyLnN0eWxlLnRvcCA9IGAke3JlY3QudG9wIC0gcG9wUmVjdC5oZWlnaHQgLSAyfXB4YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5pdGlhbFZhbHVlKHZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGlwKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbLi4udmFsdWVdO1xuICAgICAgdGhpcy5jaGlwLnZhbHVlID0gdGhpcy50cmFja2VkVmFsdWVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gW3ZhbHVlXTtcbiAgICAgIHRoaXMuY2hpcC52YWx1ZSA9IHRoaXMudHJhY2tlZFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gW107XG4gICAgICB0aGlzLmNoaXAudmFsdWUgPSBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5T3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hpcCB8fCAhdGhpcy5vcHRpb25zKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmNoaXAucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCkge1xuICAgICAgdGhpcy5jaGlwLmxhYmVsID0gdGhpcy5vcHRpb25zLmxhYmVsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscFRleHQpIHtcbiAgICAgIHRoaXMuY2hpcC5oZWxwVGV4dCA9IHRoaXMub3B0aW9ucy5oZWxwVGV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5kaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5yZWFkb25seSA9IHRoaXMub3B0aW9ucy5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmFjY2VwdFVzZXJJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuYWNjZXB0VXNlcklucHV0ID0gdGhpcy5vcHRpb25zLmFjY2VwdFVzZXJJbnB1dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vRHVwbGljYXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAubm9EdXBsaWNhdGVzID0gdGhpcy5vcHRpb25zLm5vRHVwbGljYXRlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsZWFyYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuY2xlYXJhYmxlID0gdGhpcy5vcHRpb25zLmNsZWFyYWJsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vV3JhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAubm9XcmFwID0gdGhpcy5vcHRpb25zLm5vV3JhcDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vQXV0b0NvbXBsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5ub0F1dG9Db21wbGV0ZSA9IHRoaXMub3B0aW9ucy5ub0F1dG9Db21wbGV0ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZVZpcnR1YWxTY3JvbGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmVuYWJsZVZpcnR1YWxTY3JvbGwgPSB0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9wZW5Ecm9wZG93bk9uRm9jdXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLm9wZW5Ecm9wZG93bk9uRm9jdXMgPSB0aGlzLm9wdGlvbnMub3BlbkRyb3Bkb3duT25Gb2N1cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmxvYWRpbmcgPSB0aGlzLm9wdGlvbnMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBWaXN1YWwgc3RhdGVzXG4gICAgaWYgKHRoaXMub3B0aW9ucy53YXJuaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC53YXJuaW5nID0gdGhpcy5vcHRpb25zLndhcm5pbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLnN1Y2Nlc3MgPSB0aGlzLm9wdGlvbnMuc3VjY2VzcztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuY2hpcC5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVycm9ySW5kZXhlcykge1xuICAgICAgdGhpcy5jaGlwLmVycm9ySW5kZXhlcyA9IHRoaXMub3B0aW9ucy5lcnJvckluZGV4ZXM7XG4gICAgfVxuXG4gICAgLy8gQXV0b2NvbXBsZXRlIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Db21wbGV0ZU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlT3B0aW9ucztcbiAgICAgIGNvbnN0IHN0cmluZ09wdHM6IHN0cmluZ1tdID0gb3B0cy5tYXAobyA9PiB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyBvIDogKG8ubGFiZWwgPz8gby52YWx1ZSkpO1xuICAgICAgdGhpcy5jaGlwLmF1dG9Db21wbGV0ZU9wdGlvbnMgPSBzdHJpbmdPcHRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuY2hpcC5maWx0ZXJGdW5jdGlvbiA9IHRoaXMub3B0aW9ucy5maWx0ZXJGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbmRlckl0ZW1GdW5jdGlvbikge1xuICAgICAgdGhpcy5jaGlwLnJlbmRlckl0ZW1GdW5jdGlvbiA9IHRoaXMub3B0aW9ucy5yZW5kZXJJdGVtRnVuY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRMaXN0ZW5lcihlbGVtZW50OiBFdmVudFRhcmdldCwgZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciwgY2FwdHVyZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBjYXB0dXJlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PHN0cmluZ1tdPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGlwKSByZXR1cm47XG5cbiAgICAvLyBUcmFjayBjaGlwIGNoYW5nZXNcbiAgICB0aGlzLmFkZExpc3RlbmVyKHRoaXMuY2hpcCwgJ25pbGUtY2hpcC1jaGFuZ2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZTogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGRldGFpbD8udmFsdWUpID8gWy4uLmRldGFpbC52YWx1ZV0gOiAodGhpcy5jaGlwPy52YWx1ZSA/IFsuLi50aGlzLmNoaXAudmFsdWVdIDogW10pO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLmhhc0NoYW5nZU9jY3VycmVkID0gdHJ1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gS2V5Ym9hcmQgaGFuZGxpbmcgb24gdGhlIGNoaXAgZWxlbWVudFxuICAgIHRoaXMuYWRkTGlzdGVuZXIodGhpcy5jaGlwLCAna2V5ZG93bicsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xpY2stb3V0c2lkZTogc2F2ZSB3aGVuIGNsaWNraW5nIGFueXdoZXJlIG91dHNpZGUgdGhlIHBvcG92ZXJcbiAgICBsZXQgc2F2ZVRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG1vdXNlZG93bkhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHNhdmVUcmlnZ2VyZWQpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhdGggPSBlLmNvbXBvc2VkUGF0aCgpO1xuICAgICAgZm9yIChjb25zdCBlbCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5wb3BvdmVyKSByZXR1cm47XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5jaGlwKSByZXR1cm47XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGVsLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICduaWxlLWNoaXAnKSByZXR1cm47XG4gICAgICAgICAgaWYgKGVsLmNsYXNzTmFtZSAmJiB0eXBlb2YgZWwuY2xhc3NOYW1lID09PSAnc3RyaW5nJyAmJiBlbC5jbGFzc05hbWUuaW5jbHVkZXMoJ25pbGUtY2hpcCcpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2F2ZVRyaWdnZXJlZCA9IHRydWU7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgbW91c2Vkb3duSGFuZGxlciwgdHJ1ZSk7XG4gICAgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyID0gbW91c2Vkb3duSGFuZGxlcjtcblxuICAgIC8vIFJlcG9zaXRpb24gb24gc2Nyb2xsL3Jlc2l6ZSBzbyBwb3BvdmVyIHN0YXlzIGFsaWduZWQgd2l0aCB0aGUgY2VsbFxuICAgIGNvbnN0IHJlcG9zaXRpb24gPSAoKSA9PiB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuICAgIHRoaXMuYWRkTGlzdGVuZXIod2luZG93LCAncmVzaXplJywgcmVwb3NpdGlvbik7XG4gICAgdGhpcy5hZGRMaXN0ZW5lcih3aW5kb3csICdzY3JvbGwnLCByZXBvc2l0aW9uLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGRvY3VtZW50IG1vdXNlZG93biBoYW5kbGVyXG4gICAgaWYgKCh0aGlzIGFzIGFueSkuX2RvY3VtZW50TW91c2Vkb3duSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyLCB0cnVlKTtcbiAgICAgIGRlbGV0ZSAodGhpcyBhcyBhbnkpLl9kb2N1bWVudE1vdXNlZG93bkhhbmRsZXI7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB0cmFja2VkIGxpc3RlbmVyc1xuICAgIGZvciAoY29uc3QgeyBlbGVtZW50LCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSB9IG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcG9wb3ZlciBmcm9tIHRoZSBET01cbiAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnBvcG92ZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnBvcG92ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2VsbENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbXTtcbiAgICB0aGlzLmhhc0NoYW5nZU9jY3VycmVkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0cnkgeyB0aGlzLmNoaXA/LmZvY3VzKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5oYXNDaGFuZ2VPY2N1cnJlZCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLnRyYWNrZWRWYWx1ZXNdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hpcCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuY2hpcC52YWx1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gWy4uLnZhbF0gOiBbXTtcbiAgfVxufVxuIl19
|