@aquera/ngx-smart-table 0.0.17-patch-0.1 → 0.0.17-patch-0.3
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-code-editor.mjs +642 -0
- package/esm2020/lib/editors/nile-select-editor.mjs +16 -5
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +19 -6
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +15 -2
- package/esm2020/lib/renderer/models/cell.class.mjs +30 -2
- package/fesm2015/aquera-ngx-smart-table.mjs +736 -12
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -1
- package/fesm2020/aquera-ngx-smart-table.mjs +719 -12
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -1
- package/lib/editors/index.d.ts +1 -0
- package/lib/editors/nile-code-editor.d.ts +159 -0
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +4 -2
- package/lib/renderer/models/cell.class.d.ts +18 -1
- package/package.json +1 -1
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom editor using NileCodeEditor from @aquera/nile-elements
|
|
3
|
+
* This provides code editing capabilities with syntax highlighting for table cells
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Inject global styles for nile-code-editor in table cells
|
|
7
|
+
*/
|
|
8
|
+
let codeEditorStylesInjected = false;
|
|
9
|
+
function injectCodeEditorStyles() {
|
|
10
|
+
if (codeEditorStylesInjected)
|
|
11
|
+
return;
|
|
12
|
+
codeEditorStylesInjected = true;
|
|
13
|
+
const styleId = 'nile-code-editor-cell-styles';
|
|
14
|
+
if (document.getElementById(styleId))
|
|
15
|
+
return;
|
|
16
|
+
const style = document.createElement('style');
|
|
17
|
+
style.id = styleId;
|
|
18
|
+
style.textContent = `
|
|
19
|
+
/* Nile Code Editor cell styling */
|
|
20
|
+
nile-code-editor.st-cell-editor {
|
|
21
|
+
display: block;
|
|
22
|
+
width: 100%;
|
|
23
|
+
height: 100%;
|
|
24
|
+
font-size: inherit !important;
|
|
25
|
+
font-family: inherit !important;
|
|
26
|
+
line-height: inherit !important;
|
|
27
|
+
}
|
|
28
|
+
nile-code-editor.st-cell-editor::part(code-editor-base) {
|
|
29
|
+
border: none !important;
|
|
30
|
+
min-height: 100% !important;
|
|
31
|
+
background: transparent !important;
|
|
32
|
+
font-size: inherit !important;
|
|
33
|
+
font-family: inherit !important;
|
|
34
|
+
line-height: inherit !important;
|
|
35
|
+
}
|
|
36
|
+
/* Ensure proper sizing within table cell */
|
|
37
|
+
.st-nile-code-editor {
|
|
38
|
+
width: 100%;
|
|
39
|
+
height: 100%;
|
|
40
|
+
min-height: 28px;
|
|
41
|
+
font-size: inherit !important;
|
|
42
|
+
}
|
|
43
|
+
/* CodeMirror content should inherit font size */
|
|
44
|
+
nile-code-editor.st-cell-editor .cm-content,
|
|
45
|
+
nile-code-editor.st-cell-editor .cm-line {
|
|
46
|
+
font-size: inherit !important;
|
|
47
|
+
font-family: inherit !important;
|
|
48
|
+
line-height: inherit !important;
|
|
49
|
+
}
|
|
50
|
+
/* Container wrapper for editor + expand button */
|
|
51
|
+
.st-code-editor-wrapper {
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
width: 100%;
|
|
55
|
+
height: 100%;
|
|
56
|
+
gap: 4px;
|
|
57
|
+
}
|
|
58
|
+
.st-code-editor-wrapper .st-code-editor-input {
|
|
59
|
+
flex: 1;
|
|
60
|
+
min-width: 0;
|
|
61
|
+
height: 100%;
|
|
62
|
+
}
|
|
63
|
+
.st-code-editor-wrapper .st-expand-button {
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
width: 24px;
|
|
68
|
+
height: 24px;
|
|
69
|
+
min-width: 24px;
|
|
70
|
+
padding: 0;
|
|
71
|
+
border: none;
|
|
72
|
+
background: transparent;
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
color: var(--nile-color-neutral-500, #6b7280);
|
|
75
|
+
border-radius: 4px;
|
|
76
|
+
transition: all 0.2s;
|
|
77
|
+
}
|
|
78
|
+
.st-code-editor-wrapper .st-expand-button:hover {
|
|
79
|
+
background: var(--nile-color-neutral-100, #f3f4f6);
|
|
80
|
+
color: var(--nile-color-neutral-700, #374151);
|
|
81
|
+
}
|
|
82
|
+
/* Dialog code editor styling */
|
|
83
|
+
.st-code-editor-dialog::part(panel) {
|
|
84
|
+
max-height: var(--max-height, 80vh) !important;
|
|
85
|
+
overflow: hidden !important;
|
|
86
|
+
}
|
|
87
|
+
.st-code-editor-dialog::part(body) {
|
|
88
|
+
overflow: auto !important;
|
|
89
|
+
}
|
|
90
|
+
.st-code-editor-dialog nile-code-editor {
|
|
91
|
+
width: 100%;
|
|
92
|
+
display: block;
|
|
93
|
+
}
|
|
94
|
+
.st-code-editor-dialog nile-code-editor::part(code-editor-base) {
|
|
95
|
+
border: 1px solid var(--nile-color-neutral-200, #e5e7eb) !important;
|
|
96
|
+
border-radius: 4px !important;
|
|
97
|
+
overflow: auto !important;
|
|
98
|
+
min-height: var(--dialog-editor-min-height, 300px) !important;
|
|
99
|
+
}
|
|
100
|
+
.st-code-editor-dialog nile-code-editor .cm-editor {
|
|
101
|
+
min-height: var(--dialog-editor-min-height, 300px) !important;
|
|
102
|
+
}
|
|
103
|
+
.st-code-editor-dialog nile-code-editor .cm-content {
|
|
104
|
+
min-height: var(--dialog-editor-min-height, 300px) !important;
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
document.head.appendChild(style);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Custom editor that uses NileCodeEditor component
|
|
111
|
+
* Provides code editing with syntax highlighting for table cells
|
|
112
|
+
* @template T The value type (typically string)
|
|
113
|
+
*/
|
|
114
|
+
export class NileCodeEditor {
|
|
115
|
+
constructor(options) {
|
|
116
|
+
this.options = options;
|
|
117
|
+
this.eventListeners = [];
|
|
118
|
+
this.dialogOpen = false;
|
|
119
|
+
this.expandButtonClicked = false;
|
|
120
|
+
this.trackedValue = null;
|
|
121
|
+
}
|
|
122
|
+
edit(context) {
|
|
123
|
+
if (!context.container) {
|
|
124
|
+
console.warn('NileCodeEditor requires a container element');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
this.context = context;
|
|
128
|
+
this.trackedValue = null;
|
|
129
|
+
// Inject global styles once
|
|
130
|
+
injectCodeEditorStyles();
|
|
131
|
+
// Check if we should show expand button (default: true)
|
|
132
|
+
const showExpandButton = this.options?.showExpandButton !== false;
|
|
133
|
+
if (showExpandButton) {
|
|
134
|
+
// Create wrapper for editor + expand button
|
|
135
|
+
this.wrapper = document.createElement('div');
|
|
136
|
+
this.wrapper.className = 'st-code-editor-wrapper';
|
|
137
|
+
// Create the editor container
|
|
138
|
+
const editorContainer = document.createElement('div');
|
|
139
|
+
editorContainer.className = 'st-code-editor-input';
|
|
140
|
+
// Create NileCodeEditor custom element
|
|
141
|
+
this.editor = document.createElement('nile-code-editor');
|
|
142
|
+
this.editor.value = String(context.value ?? '');
|
|
143
|
+
this.editor.className = 'st-cell-editor st-nile-code-editor';
|
|
144
|
+
this.editor.style.width = '100%';
|
|
145
|
+
this.editor.style.height = '100%';
|
|
146
|
+
this.editor.style.boxSizing = 'border-box';
|
|
147
|
+
this.editor.noborder = this.options?.noborder !== false;
|
|
148
|
+
editorContainer.appendChild(this.editor);
|
|
149
|
+
this.wrapper.appendChild(editorContainer);
|
|
150
|
+
// Create expand button
|
|
151
|
+
this.expandButton = document.createElement('button');
|
|
152
|
+
this.expandButton.className = 'st-expand-button';
|
|
153
|
+
this.expandButton.type = 'button';
|
|
154
|
+
this.expandButton.title = 'Expand editor';
|
|
155
|
+
this.expandButton.innerHTML = '<nile-icon name="expand-06" size="16"></nile-icon>';
|
|
156
|
+
// Use mousedown to set flag BEFORE blur event fires
|
|
157
|
+
this.expandButton.addEventListener('mousedown', (e) => {
|
|
158
|
+
e.preventDefault();
|
|
159
|
+
e.stopPropagation();
|
|
160
|
+
this.expandButtonClicked = true;
|
|
161
|
+
});
|
|
162
|
+
this.expandButton.addEventListener('click', (e) => {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
e.stopPropagation();
|
|
165
|
+
this.openDialog();
|
|
166
|
+
});
|
|
167
|
+
this.wrapper.appendChild(this.expandButton);
|
|
168
|
+
// Clear container and append wrapper
|
|
169
|
+
context.container.innerHTML = '';
|
|
170
|
+
context.container.appendChild(this.wrapper);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Create NileCodeEditor custom element without wrapper
|
|
174
|
+
this.editor = document.createElement('nile-code-editor');
|
|
175
|
+
this.editor.value = String(context.value ?? '');
|
|
176
|
+
this.editor.className = 'st-cell-editor st-nile-code-editor';
|
|
177
|
+
this.editor.style.width = '100%';
|
|
178
|
+
this.editor.style.height = '100%';
|
|
179
|
+
this.editor.style.boxSizing = 'border-box';
|
|
180
|
+
this.editor.noborder = this.options?.noborder !== false;
|
|
181
|
+
// Clear container and append editor
|
|
182
|
+
context.container.innerHTML = '';
|
|
183
|
+
context.container.appendChild(this.editor);
|
|
184
|
+
}
|
|
185
|
+
// Apply all configuration options
|
|
186
|
+
this.applyOptions();
|
|
187
|
+
// Set up event listeners
|
|
188
|
+
this.setupEventListeners(context);
|
|
189
|
+
// Auto focus - need a slight delay for nile-code-editor to fully initialize
|
|
190
|
+
if (this.options?.autoFocus !== false) {
|
|
191
|
+
// Listen for the nile-after-init event which fires when editor is ready
|
|
192
|
+
const initHandler = () => {
|
|
193
|
+
this.editor?.removeEventListener('nile-after-init', initHandler);
|
|
194
|
+
this.focusEditor();
|
|
195
|
+
};
|
|
196
|
+
this.editor.addEventListener('nile-after-init', initHandler);
|
|
197
|
+
// Fallback: also try after a delay in case the event already fired
|
|
198
|
+
setTimeout(() => {
|
|
199
|
+
this.focusEditor();
|
|
200
|
+
}, 100);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Focus the editor and place cursor
|
|
205
|
+
*/
|
|
206
|
+
focusEditor() {
|
|
207
|
+
if (!this.editor)
|
|
208
|
+
return;
|
|
209
|
+
try {
|
|
210
|
+
// Call the component's focus method
|
|
211
|
+
this.editor.focus();
|
|
212
|
+
// Try to directly focus the CodeMirror content area
|
|
213
|
+
const shadowRoot = this.editor.shadowRoot;
|
|
214
|
+
if (shadowRoot) {
|
|
215
|
+
const cmContent = shadowRoot.querySelector('.cm-content');
|
|
216
|
+
if (cmContent) {
|
|
217
|
+
cmContent.focus();
|
|
218
|
+
// Dispatch a click event to ensure cursor placement
|
|
219
|
+
cmContent.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
|
|
220
|
+
cmContent.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
// Silently handle any errors
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Read the live value directly from CodeMirror's internal state,
|
|
230
|
+
* bypassing debounced nile-change events and the possibly-stale .value property.
|
|
231
|
+
*/
|
|
232
|
+
getLiveEditorValue() {
|
|
233
|
+
if (!this.editor)
|
|
234
|
+
return '';
|
|
235
|
+
try {
|
|
236
|
+
const shadowRoot = this.editor.shadowRoot;
|
|
237
|
+
if (shadowRoot) {
|
|
238
|
+
const cmEditor = shadowRoot.querySelector('.cm-editor');
|
|
239
|
+
if (cmEditor?.cmView?.view) {
|
|
240
|
+
return cmEditor.cmView.view.state.doc.toString();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Fall through to other methods
|
|
246
|
+
}
|
|
247
|
+
if (this.trackedValue !== null)
|
|
248
|
+
return this.trackedValue;
|
|
249
|
+
return this.editor.value ?? '';
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Open the full editor dialog
|
|
253
|
+
*/
|
|
254
|
+
openDialog() {
|
|
255
|
+
if (this.dialogOpen)
|
|
256
|
+
return;
|
|
257
|
+
this.dialogOpen = true;
|
|
258
|
+
this.expandButtonClicked = false; // Reset flag now that dialog is opening
|
|
259
|
+
// Create dialog with configurable dimensions
|
|
260
|
+
const dialogWidth = this.options?.dialogWidth || '600px';
|
|
261
|
+
const dialogMaxHeight = this.options?.dialogMaxHeight || '80vh';
|
|
262
|
+
const dialogEditorHeight = this.options?.dialogEditorHeight || '300px';
|
|
263
|
+
const dialogTitle = this.options?.dialogTitle || 'Edit Code';
|
|
264
|
+
this.dialog = document.createElement('nile-dialog');
|
|
265
|
+
this.dialog.className = 'st-code-editor-dialog';
|
|
266
|
+
this.dialog.label = dialogTitle;
|
|
267
|
+
this.dialog.style.setProperty('--width', dialogWidth);
|
|
268
|
+
this.dialog.style.setProperty('--max-height', dialogMaxHeight);
|
|
269
|
+
// Create dialog content
|
|
270
|
+
const content = document.createElement('div');
|
|
271
|
+
content.style.padding = '16px';
|
|
272
|
+
content.style.maxHeight = `calc(${dialogMaxHeight} - 80px)`;
|
|
273
|
+
content.style.overflow = 'auto';
|
|
274
|
+
// Create full editor
|
|
275
|
+
this.dialogEditor = document.createElement('nile-code-editor');
|
|
276
|
+
const minLines = this.options?.dialogMinLines ?? 20;
|
|
277
|
+
const currentValue = this.getLiveEditorValue();
|
|
278
|
+
const currentLineCount = (currentValue.match(/\n/g) || []).length + 1;
|
|
279
|
+
const paddingLines = Math.max(0, minLines - currentLineCount);
|
|
280
|
+
this.dialogEditor.value = currentValue + '\n'.repeat(paddingLines);
|
|
281
|
+
this.dialogEditor.multiline = true;
|
|
282
|
+
this.dialogEditor.lineNumbersMultiline = true;
|
|
283
|
+
this.dialogEditor.hasScroller = true;
|
|
284
|
+
const lineHeightPx = 20;
|
|
285
|
+
const minHeightFromLines = `${minLines * lineHeightPx}px`;
|
|
286
|
+
this.dialogEditor.style.minHeight = `max(${dialogEditorHeight}, ${minHeightFromLines})`;
|
|
287
|
+
this.dialogEditor.style.maxHeight = `calc(${dialogMaxHeight} - 120px)`;
|
|
288
|
+
content.style.setProperty('--dialog-editor-min-height', `max(${dialogEditorHeight}, ${minHeightFromLines})`);
|
|
289
|
+
// Apply same options to dialog editor
|
|
290
|
+
if (this.options?.language) {
|
|
291
|
+
this.dialogEditor.language = this.options.language;
|
|
292
|
+
}
|
|
293
|
+
if (this.options?.placeholder) {
|
|
294
|
+
this.dialogEditor.placeholder = this.options.placeholder;
|
|
295
|
+
}
|
|
296
|
+
if (this.options?.tabCompletion !== undefined) {
|
|
297
|
+
this.dialogEditor.tabCompletion = this.options.tabCompletion;
|
|
298
|
+
}
|
|
299
|
+
if (this.options?.enableSearch !== undefined) {
|
|
300
|
+
this.dialogEditor.enableSearch = this.options.enableSearch;
|
|
301
|
+
}
|
|
302
|
+
if (this.options?.enableFoldGutters !== undefined) {
|
|
303
|
+
this.dialogEditor.enableFoldGutters = this.options.enableFoldGutters;
|
|
304
|
+
}
|
|
305
|
+
if (this.options?.customAutoCompletions) {
|
|
306
|
+
this.dialogEditor.customAutoCompletions = this.options.customAutoCompletions;
|
|
307
|
+
}
|
|
308
|
+
if (this.options?.customCompletionsPaths) {
|
|
309
|
+
this.dialogEditor.customCompletionsPaths = this.options.customCompletionsPaths;
|
|
310
|
+
}
|
|
311
|
+
if (this.options?.customThemeCSS) {
|
|
312
|
+
this.dialogEditor.customThemeCSS = this.options.customThemeCSS;
|
|
313
|
+
}
|
|
314
|
+
this.dialogEditor.expandable = false;
|
|
315
|
+
// Real-time sync: Update cell editor whenever dialog editor changes
|
|
316
|
+
this.dialogEditor.addEventListener('nile-change', (e) => {
|
|
317
|
+
const dialogValue = e.detail?.value || '';
|
|
318
|
+
this.trackedValue = dialogValue;
|
|
319
|
+
if (this.editor) {
|
|
320
|
+
this.editor.value = dialogValue;
|
|
321
|
+
}
|
|
322
|
+
if (this.context) {
|
|
323
|
+
this.context.onChange(dialogValue);
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
content.appendChild(this.dialogEditor);
|
|
327
|
+
this.dialog.appendChild(content);
|
|
328
|
+
// Handle dialog close events (clicking X button - stay in edit mode)
|
|
329
|
+
this.dialog.addEventListener('nile-request-close', (e) => {
|
|
330
|
+
const customEvent = e;
|
|
331
|
+
// Check if close was triggered by overlay click (clicking outside)
|
|
332
|
+
if (customEvent.detail?.source === 'overlay') {
|
|
333
|
+
// Clicking outside the dialog - save and exit edit mode
|
|
334
|
+
this.closeDialog(true);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// Clicking X button - stay in edit mode
|
|
338
|
+
this.closeDialog(false);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
// Handle Escape key in dialog - stay in edit mode
|
|
342
|
+
this.dialog.addEventListener('keydown', (e) => {
|
|
343
|
+
if (e.key === 'Escape') {
|
|
344
|
+
e.preventDefault();
|
|
345
|
+
e.stopPropagation();
|
|
346
|
+
this.closeDialog(false);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
// Append to body and show
|
|
350
|
+
document.body.appendChild(this.dialog);
|
|
351
|
+
// Open dialog after a tick to ensure it's in the DOM
|
|
352
|
+
setTimeout(() => {
|
|
353
|
+
if (this.dialog) {
|
|
354
|
+
this.dialog.open = true;
|
|
355
|
+
// Focus the dialog editor
|
|
356
|
+
setTimeout(() => {
|
|
357
|
+
this.dialogEditor?.focus();
|
|
358
|
+
}, 100);
|
|
359
|
+
}
|
|
360
|
+
}, 0);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Close the dialog and optionally save/exit edit mode
|
|
364
|
+
*/
|
|
365
|
+
closeDialog(saveAndExit = false) {
|
|
366
|
+
if (!this.dialogOpen)
|
|
367
|
+
return;
|
|
368
|
+
// Reset flag immediately so document click handler works
|
|
369
|
+
this.dialogOpen = false;
|
|
370
|
+
// Close and remove dialog
|
|
371
|
+
if (this.dialog) {
|
|
372
|
+
this.dialog.open = false;
|
|
373
|
+
const dialogRef = this.dialog;
|
|
374
|
+
const dialogEditorRef = this.dialogEditor;
|
|
375
|
+
this.dialog = undefined;
|
|
376
|
+
this.dialogEditor = undefined;
|
|
377
|
+
// Remove from DOM after animation
|
|
378
|
+
setTimeout(() => {
|
|
379
|
+
dialogRef?.remove();
|
|
380
|
+
}, 200);
|
|
381
|
+
if (saveAndExit && this.context) {
|
|
382
|
+
// Save and exit edit mode
|
|
383
|
+
this.context.onSave(this.getCurrentValue());
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
// Refocus the cell editor to stay in edit mode
|
|
387
|
+
setTimeout(() => {
|
|
388
|
+
this.focusEditor();
|
|
389
|
+
}, 50);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Apply all configuration options to the NileCodeEditor element
|
|
395
|
+
*/
|
|
396
|
+
applyOptions() {
|
|
397
|
+
if (!this.editor)
|
|
398
|
+
return;
|
|
399
|
+
// Language and syntax
|
|
400
|
+
if (this.options?.language) {
|
|
401
|
+
this.editor.language = this.options.language;
|
|
402
|
+
}
|
|
403
|
+
if (this.options?.disableSyntaxHighlighting) {
|
|
404
|
+
this.editor.disableSyntaxHighlighting = this.options.disableSyntaxHighlighting;
|
|
405
|
+
}
|
|
406
|
+
// Editor appearance
|
|
407
|
+
if (this.options?.placeholder) {
|
|
408
|
+
this.editor.placeholder = this.options.placeholder;
|
|
409
|
+
}
|
|
410
|
+
if (this.options?.lineNumbers !== undefined) {
|
|
411
|
+
this.editor.lineNumbers = this.options.lineNumbers;
|
|
412
|
+
}
|
|
413
|
+
if (this.options?.lineNumbersMultiline !== undefined) {
|
|
414
|
+
this.editor.lineNumbersMultiline = this.options.lineNumbersMultiline;
|
|
415
|
+
}
|
|
416
|
+
if (this.options?.multiline !== undefined) {
|
|
417
|
+
this.editor.multiline = this.options.multiline;
|
|
418
|
+
}
|
|
419
|
+
if (this.options?.defaultFont !== undefined) {
|
|
420
|
+
this.editor.defaultFont = this.options.defaultFont;
|
|
421
|
+
}
|
|
422
|
+
// Editor behavior
|
|
423
|
+
if (this.options?.readonly !== undefined) {
|
|
424
|
+
this.editor.readonly = this.options.readonly;
|
|
425
|
+
}
|
|
426
|
+
if (this.options?.disabled !== undefined) {
|
|
427
|
+
this.editor.disabled = this.options.disabled;
|
|
428
|
+
}
|
|
429
|
+
if (this.options?.tabCompletion !== undefined) {
|
|
430
|
+
this.editor.tabCompletion = this.options.tabCompletion;
|
|
431
|
+
}
|
|
432
|
+
if (this.options?.enableSearch !== undefined) {
|
|
433
|
+
this.editor.enableSearch = this.options.enableSearch;
|
|
434
|
+
}
|
|
435
|
+
if (this.options?.enableFoldGutters !== undefined) {
|
|
436
|
+
this.editor.enableFoldGutters = this.options.enableFoldGutters;
|
|
437
|
+
}
|
|
438
|
+
if (this.options?.hasScroller !== undefined) {
|
|
439
|
+
this.editor.hasScroller = this.options.hasScroller;
|
|
440
|
+
}
|
|
441
|
+
// Expandable - default to false for cell editing
|
|
442
|
+
this.editor.expandable = this.options?.expandable ?? false;
|
|
443
|
+
if (this.options?.expandIcon) {
|
|
444
|
+
this.editor.expandIcon = this.options.expandIcon;
|
|
445
|
+
}
|
|
446
|
+
// Autocompletion
|
|
447
|
+
if (this.options?.customAutoCompletions) {
|
|
448
|
+
this.editor.customAutoCompletions = this.options.customAutoCompletions;
|
|
449
|
+
}
|
|
450
|
+
if (this.options?.customCompletionsPaths) {
|
|
451
|
+
this.editor.customCompletionsPaths = this.options.customCompletionsPaths;
|
|
452
|
+
}
|
|
453
|
+
if (this.options?.allowVariableInCustomSuggestion !== undefined) {
|
|
454
|
+
this.editor.allowVariableInCustomSuggestion = this.options.allowVariableInCustomSuggestion;
|
|
455
|
+
}
|
|
456
|
+
if (this.options?.aboveCursor !== undefined) {
|
|
457
|
+
this.editor.aboveCursor = this.options.aboveCursor;
|
|
458
|
+
}
|
|
459
|
+
if (this.options?.autoCompleteStyle) {
|
|
460
|
+
this.editor.autoCompleteStyle = this.options.autoCompleteStyle;
|
|
461
|
+
}
|
|
462
|
+
// Change handling
|
|
463
|
+
if (this.options?.debounce !== undefined) {
|
|
464
|
+
this.editor.debounce = this.options.debounce;
|
|
465
|
+
}
|
|
466
|
+
if (this.options?.debounceTimeout !== undefined) {
|
|
467
|
+
this.editor.debounceTimeout = this.options.debounceTimeout;
|
|
468
|
+
}
|
|
469
|
+
// Visual states
|
|
470
|
+
if (this.options?.error !== undefined) {
|
|
471
|
+
this.editor.error = this.options.error;
|
|
472
|
+
}
|
|
473
|
+
if (this.options?.errorMessage) {
|
|
474
|
+
this.editor.errorMessage = this.options.errorMessage;
|
|
475
|
+
}
|
|
476
|
+
// Custom theme
|
|
477
|
+
if (this.options?.customThemeCSS) {
|
|
478
|
+
this.editor.customThemeCSS = this.options.customThemeCSS;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Set up all event listeners with proper cleanup tracking
|
|
483
|
+
*/
|
|
484
|
+
setupEventListeners(context) {
|
|
485
|
+
if (!this.editor)
|
|
486
|
+
return;
|
|
487
|
+
const validateOnSave = this.options?.validateOnSave !== false;
|
|
488
|
+
// Handle keyboard events
|
|
489
|
+
const keydownHandler = (e) => {
|
|
490
|
+
const keyEvent = e;
|
|
491
|
+
// For single-line mode, Enter saves
|
|
492
|
+
if (!this.options?.multiline && keyEvent.key === 'Enter') {
|
|
493
|
+
keyEvent.preventDefault();
|
|
494
|
+
keyEvent.stopPropagation();
|
|
495
|
+
this.saveValue(context, validateOnSave);
|
|
496
|
+
}
|
|
497
|
+
// Escape cancels
|
|
498
|
+
if (keyEvent.key === 'Escape') {
|
|
499
|
+
keyEvent.preventDefault();
|
|
500
|
+
keyEvent.stopPropagation();
|
|
501
|
+
context.onCancel();
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
this.editor.addEventListener('keydown', keydownHandler);
|
|
505
|
+
this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
|
|
506
|
+
// Use nile-blur event for saving on blur
|
|
507
|
+
const blurHandler = () => {
|
|
508
|
+
// Don't save if dialog is open
|
|
509
|
+
if (this.dialogOpen) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
// Don't save if expand button was clicked (mousedown sets this flag)
|
|
513
|
+
if (this.expandButtonClicked) {
|
|
514
|
+
// Reset flag - the click handler will open the dialog
|
|
515
|
+
this.expandButtonClicked = false;
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
// Save and exit edit mode
|
|
519
|
+
this.saveValue(context, validateOnSave);
|
|
520
|
+
};
|
|
521
|
+
this.editor.addEventListener('nile-blur', blurHandler);
|
|
522
|
+
this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
|
|
523
|
+
// Document-level mousedown handler to detect clicks outside the editor
|
|
524
|
+
this.documentClickHandler = (e) => {
|
|
525
|
+
// Don't process if dialog is open or expand button was clicked
|
|
526
|
+
if (this.dialogOpen || this.expandButtonClicked) {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
// Use composedPath to handle Shadow DOM boundaries
|
|
530
|
+
const path = e.composedPath();
|
|
531
|
+
// Check if any element in the path is our wrapper, editor, or expand button
|
|
532
|
+
for (const element of path) {
|
|
533
|
+
if (element === this.wrapper || element === this.editor || element === this.expandButton) {
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
// Also check if it's the container (the cell)
|
|
537
|
+
if (element === context.container) {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
// Click is outside - save and exit
|
|
542
|
+
this.saveValue(context, validateOnSave);
|
|
543
|
+
};
|
|
544
|
+
// Add with a small delay to avoid capturing the initial click that opened the editor
|
|
545
|
+
setTimeout(() => {
|
|
546
|
+
document.addEventListener('mousedown', this.documentClickHandler, true);
|
|
547
|
+
}, 50);
|
|
548
|
+
// Real-time value updates using nile-change
|
|
549
|
+
const changeHandler = (e) => {
|
|
550
|
+
const customEvent = e;
|
|
551
|
+
const newValue = customEvent.detail?.value ?? '';
|
|
552
|
+
this.trackedValue = newValue;
|
|
553
|
+
context.onChange(newValue);
|
|
554
|
+
};
|
|
555
|
+
this.editor.addEventListener('nile-change', changeHandler);
|
|
556
|
+
this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
|
|
557
|
+
// Handle expand event if expandable
|
|
558
|
+
if (this.options?.expandable) {
|
|
559
|
+
const expandHandler = () => {
|
|
560
|
+
// Emit a custom event that the parent can listen to
|
|
561
|
+
const expandEvent = new CustomEvent('st-code-editor-expand', {
|
|
562
|
+
bubbles: true,
|
|
563
|
+
detail: { value: this.getCurrentValue() }
|
|
564
|
+
});
|
|
565
|
+
this.editor?.dispatchEvent(expandEvent);
|
|
566
|
+
};
|
|
567
|
+
this.editor.addEventListener('nile-expand', expandHandler);
|
|
568
|
+
this.eventListeners.push({ event: 'nile-expand', handler: expandHandler });
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Save value with optional validation
|
|
573
|
+
*/
|
|
574
|
+
saveValue(context, validate) {
|
|
575
|
+
if (!this.editor)
|
|
576
|
+
return;
|
|
577
|
+
// Code editor doesn't have built-in validation like input
|
|
578
|
+
// But we can check for error state
|
|
579
|
+
if (validate && this.options?.error) {
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
const value = this.getCurrentValue();
|
|
583
|
+
context.onSave(value);
|
|
584
|
+
}
|
|
585
|
+
destroy() {
|
|
586
|
+
// Remove document click handler
|
|
587
|
+
if (this.documentClickHandler) {
|
|
588
|
+
document.removeEventListener('mousedown', this.documentClickHandler, true);
|
|
589
|
+
this.documentClickHandler = undefined;
|
|
590
|
+
}
|
|
591
|
+
// Close dialog if open
|
|
592
|
+
if (this.dialogOpen && this.dialog) {
|
|
593
|
+
this.dialog.open = false;
|
|
594
|
+
this.dialog.remove();
|
|
595
|
+
this.dialog = undefined;
|
|
596
|
+
this.dialogEditor = undefined;
|
|
597
|
+
this.dialogOpen = false;
|
|
598
|
+
}
|
|
599
|
+
// Remove all event listeners
|
|
600
|
+
if (this.editor) {
|
|
601
|
+
this.eventListeners.forEach(({ event, handler }) => {
|
|
602
|
+
this.editor?.removeEventListener(event, handler);
|
|
603
|
+
});
|
|
604
|
+
this.eventListeners = [];
|
|
605
|
+
this.editor.remove();
|
|
606
|
+
this.editor = undefined;
|
|
607
|
+
}
|
|
608
|
+
// Remove wrapper if exists
|
|
609
|
+
if (this.wrapper) {
|
|
610
|
+
this.wrapper.remove();
|
|
611
|
+
this.wrapper = undefined;
|
|
612
|
+
}
|
|
613
|
+
// Clear expand button reference
|
|
614
|
+
this.expandButton = undefined;
|
|
615
|
+
this.context = undefined;
|
|
616
|
+
this.expandButtonClicked = false;
|
|
617
|
+
}
|
|
618
|
+
focus() {
|
|
619
|
+
this.editor?.focus();
|
|
620
|
+
}
|
|
621
|
+
getCurrentValue() {
|
|
622
|
+
if (!this.editor)
|
|
623
|
+
return '';
|
|
624
|
+
const value = this.getLiveEditorValue();
|
|
625
|
+
return value.replace(/\n+$/, '');
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Set value programmatically
|
|
629
|
+
*/
|
|
630
|
+
setValue(value) {
|
|
631
|
+
if (this.editor) {
|
|
632
|
+
this.editor.value = String(value ?? '');
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Get the CodeMirror instance (if needed for advanced usage)
|
|
637
|
+
*/
|
|
638
|
+
getEditorInstance() {
|
|
639
|
+
return this.editor;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQXFISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0ZuQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWF6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVBwRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFNUIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO0lBRW9CLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFP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SCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFrQixDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxLQUFRO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNvZGVFZGl0b3IgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFRoaXMgcHJvdmlkZXMgY29kZSBlZGl0aW5nIGNhcGFiaWxpdGllcyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0b2NvbXBsZXRpb24gaXRlbSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUVkaXRvckNvbXBsZXRpb24ge1xuICAvKiogVGhlIGNvbXBsZXRpb24gbGFiZWwgc2hvd24gaW4gZHJvcGRvd24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSB2YWx1ZSB0byBpbnNlcnQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBkZXNjcmlwdGlvbiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXV0b2NvbXBsZXRlIHN0eWxlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVTdHlsZSB7XG4gIC8qKiBXaWR0aCBvZiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIG11bHRpbGluZSBjb250ZW50IGluIGF1dG9jb21wbGV0ZSAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgaW50ZXJmYWNlIGZvciBOaWxlQ29kZUVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVDb2RlRWRpdG9yT3B0aW9ucyB7XG4gIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgLyoqIExhbmd1YWdlIG1vZGUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgbGFuZ3VhZ2U/OiAnamF2YXNjcmlwdCcgfCAnc3FsJyB8ICdqc29uJyB8ICdodG1sJztcbiAgLyoqIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZyAqL1xuICBkaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nPzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYXBwZWFyYW5jZVxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogU2hvdyBsaW5lIG51bWJlcnMgKHNpbmdsZS1saW5lIG1vZGUpICovXG4gIGxpbmVOdW1iZXJzPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIGluIG11bHRpbGluZSBtb2RlICovXG4gIGxpbmVOdW1iZXJzTXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG11bHRpLWxpbmUgZWRpdGluZyAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xuICAvKiogUmVuZGVyIHdpdGhvdXQgYm9yZGVyICovXG4gIG5vYm9yZGVyPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBkZWZhdWx0IGZvbnQgaW5zdGVhZCBvZiBpbmhlcml0ICovXG4gIGRlZmF1bHRGb250PzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYmVoYXZpb3JcbiAgLyoqIEF1dG8gZm9jdXMgb24gZWRpdCAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAvKiogUmVhZC1vbmx5IG1vZGUgKi9cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZWQgc3RhdGUgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIFRhYi10by1jb21wbGV0ZSAqL1xuICB0YWJDb21wbGV0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2gga2V5bWFwICovXG4gIGVuYWJsZVNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBTaG93IGNvZGUgZm9sZGluZyBndXR0ZXJzICovXG4gIGVuYWJsZUZvbGRHdXR0ZXJzPzogYm9vbGVhbjtcbiAgLyoqIEludGVybmFsIHNjcm9sbCBjb250YWluZXIgKi9cbiAgaGFzU2Nyb2xsZXI/OiBib29sZWFuO1xuICAvKiogU2hvdyBleHBhbmQgY29udHJvbCAobmF0aXZlIG5pbGUtY29kZS1lZGl0b3IgZXhwYW5kKSAqL1xuICBleHBhbmRhYmxlPzogYm9vbGVhbjtcbiAgLyoqIEljb24gZm9yIGV4cGFuZCBjb250cm9sICovXG4gIGV4cGFuZEljb24/OiBzdHJpbmc7XG4gIFxuICAvLyBEaWFsb2cgZXhwYW5kIGZlYXR1cmVcbiAgLyoqIFNob3cgZXhwYW5kIGJ1dHRvbiB0byBvcGVuIGZ1bGwgZWRpdG9yIGRpYWxvZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc2hvd0V4cGFuZEJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKiBEaWFsb2cgdGl0bGUgKGRlZmF1bHQ6ICdFZGl0IENvZGUnKSAqL1xuICBkaWFsb2dUaXRsZT86IHN0cmluZztcbiAgLyoqIERpYWxvZyB3aWR0aCAoZGVmYXVsdDogJzYwMHB4JykgKi9cbiAgZGlhbG9nV2lkdGg/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgbWF4IGhlaWdodCAoZGVmYXVsdDogJzgwdmgnKSAqL1xuICBkaWFsb2dNYXhIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgZWRpdG9yIG1pbiBoZWlnaHQgKGRlZmF1bHQ6ICczMDBweCcpICovXG4gIGRpYWxvZ0VkaXRvckhlaWdodD86IHN0cmluZztcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIHZpc2libGUgbGluZXMgaW4gdGhlIGRpYWxvZyBlZGl0b3IgKGRlZmF1bHQ6IDIwKSAqL1xuICBkaWFsb2dNaW5MaW5lcz86IG51bWJlcjtcblxuICAvLyBBdXRvY29tcGxldGlvblxuICAvKiogSW5saW5lIGNvbXBsZXRpb24gZGF0YXNldCAqL1xuICBjdXN0b21BdXRvQ29tcGxldGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDb2RlRWRpdG9yQ29tcGxldGlvbltdPiB8IENvZGVFZGl0b3JDb21wbGV0aW9uW107XG4gIC8qKiBQYXRocyB0byBmZXRjaCBjb21wbGV0aW9uIGRhdGFzZXRzIGZyb20gKi9cbiAgY3VzdG9tQ29tcGxldGlvbnNQYXRocz86IHN0cmluZ1tdO1xuICAvKiogRW5hYmxlIHZhcmlhYmxlcyBpbiBzdWdnZXN0aW9ucyAqL1xuICBhbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgYXV0b2NvbXBsZXRlIGFib3ZlIGN1cnNvciAqL1xuICBhYm92ZUN1cnNvcj86IGJvb2xlYW47XG4gIC8qKiBTdHlsZSBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICBhdXRvQ29tcGxldGVTdHlsZT86IEF1dG9Db21wbGV0ZVN0eWxlO1xuXG4gIC8vIENoYW5nZSBoYW5kbGluZ1xuICAvKiogRGVib3VuY2UgY2hhbmdlIGV2ZW50cyAqL1xuICBkZWJvdW5jZT86IGJvb2xlYW47XG4gIC8qKiBEZWJvdW5jZSBkZWxheSBpbiBtcyAqL1xuICBkZWJvdW5jZVRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogRXJyb3Igc3RhdGUgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvLyBDdXN0b20gdGhlbWVcbiAgLyoqIEN1c3RvbSB0aGVtZSBDU1Mgb2JqZWN0ICovXG4gIGN1c3RvbVRoZW1lQ1NTPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLy8gVmFsaWRhdGlvbiBiZWhhdmlvclxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdCBnbG9iYWwgc3R5bGVzIGZvciBuaWxlLWNvZGUtZWRpdG9yIGluIHRhYmxlIGNlbGxzXG4gKi9cbmxldCBjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTogdm9pZCB7XG4gIGlmIChjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQpIHJldHVybjtcbiAgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gdHJ1ZTtcblxuICBjb25zdCBzdHlsZUlkID0gJ25pbGUtY29kZS1lZGl0b3ItY2VsbC1zdHlsZXMnO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHJldHVybjtcblxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLyogTmlsZSBDb2RlIEVkaXRvciBjZWxsIHN0eWxpbmcgKi9cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgbWluLWhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIEVuc3VyZSBwcm9wZXIgc2l6aW5nIHdpdGhpbiB0YWJsZSBjZWxsICovXG4gICAgLnN0LW5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAyOHB4O1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIENvZGVNaXJyb3IgY29udGVudCBzaG91bGQgaW5oZXJpdCBmb250IHNpemUgKi9cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1jb250ZW50LFxuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3IgLmNtLWxpbmUge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLyogQ29udGFpbmVyIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b24gKi9cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci13cmFwcGVyIC5zdC1jb2RlLWVkaXRvci1pbnB1dCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtZXhwYW5kLWJ1dHRvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICBtaW4td2lkdGg6IDI0cHg7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTUwMCwgIzZiNzI4MCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTEwMCwgI2YzZjRmNik7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTcwMCwgIzM3NDE1MSk7XG4gICAgfVxuICAgIC8qIERpYWxvZyBjb2RlIGVkaXRvciBzdHlsaW5nICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChwYW5lbCkge1xuICAgICAgbWF4LWhlaWdodDogdmFyKC0tbWF4LWhlaWdodCwgODB2aCkgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChib2R5KSB7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0yMDAsICNlNWU3ZWIpICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICBtaW4taGVpZ2h0OiB2YXIoLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQsIDMwMHB4KSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3IgLmNtLWVkaXRvciB7XG4gICAgICBtaW4taGVpZ2h0OiB2YXIoLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQsIDMwMHB4KSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3IgLmNtLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVDb2RlRWRpdG9yIGNvbXBvbmVudFxuICogUHJvdmlkZXMgY29kZSBlZGl0aW5nIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgdGFibGUgY2VsbHNcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB2YWx1ZSB0eXBlICh0eXBpY2FsbHkgc3RyaW5nKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZUNvZGVFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgd3JhcHBlcj86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbj86IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIGRpYWxvZz86IGFueTtcbiAgcHJpdmF0ZSBkaWFsb2dFZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuICBwcml2YXRlIGNvbnRleHQ/OiBDZWxsRWRpdG9yQ29udGV4dDxUPjtcbiAgcHJpdmF0ZSBkaWFsb2dPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRvY3VtZW50Q2xpY2tIYW5kbGVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiBOaWxlQ29kZUVkaXRvck9wdGlvbnMpIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTmlsZUNvZGVFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy50cmFja2VkVmFsdWUgPSBudWxsO1xuXG4gICAgLy8gSW5qZWN0IGdsb2JhbCBzdHlsZXMgb25jZVxuICAgIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGV4cGFuZCBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAgY29uc3Qgc2hvd0V4cGFuZEJ1dHRvbiA9IHRoaXMub3B0aW9ucz8uc2hvd0V4cGFuZEJ1dHRvbiAhPT0gZmFsc2U7XG5cbiAgICBpZiAoc2hvd0V4cGFuZEJ1dHRvbikge1xuICAgICAgLy8gQ3JlYXRlIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci13cmFwcGVyJztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBlZGl0b3IgY29udGFpbmVyXG4gICAgICBjb25zdCBlZGl0b3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVkaXRvckNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3ItaW5wdXQnO1xuXG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnRcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG5cbiAgICAgIGVkaXRvckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvcik7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQoZWRpdG9yQ29udGFpbmVyKTtcblxuICAgICAgLy8gQ3JlYXRlIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5jbGFzc05hbWUgPSAnc3QtZXhwYW5kLWJ1dHRvbic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi50aXRsZSA9ICdFeHBhbmQgZWRpdG9yJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmlubmVySFRNTCA9ICc8bmlsZS1pY29uIG5hbWU9XCJleHBhbmQtMDZcIiBzaXplPVwiMTZcIj48L25pbGUtaWNvbj4nO1xuICAgICAgXG4gICAgICAvLyBVc2UgbW91c2Vkb3duIHRvIHNldCBmbGFnIEJFRk9SRSBibHVyIGV2ZW50IGZpcmVzXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgdGhpcy5leHBhbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMub3BlbkRpYWxvZygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5leHBhbmRCdXR0b24pO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCB3cmFwcGVyXG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBOaWxlQ29kZUVkaXRvciBjdXN0b20gZWxlbWVudCB3aXRob3V0IHdyYXBwZXJcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG5cbiAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIGVkaXRvclxuICAgICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvcik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG5cbiAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQpO1xuXG4gICAgLy8gQXV0byBmb2N1cyAtIG5lZWQgYSBzbGlnaHQgZGVsYXkgZm9yIG5pbGUtY29kZS1lZGl0b3IgdG8gZnVsbHkgaW5pdGlhbGl6ZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgdGhlIG5pbGUtYWZ0ZXItaW5pdCBldmVudCB3aGljaCBmaXJlcyB3aGVuIGVkaXRvciBpcyByZWFkeVxuICAgICAgY29uc3QgaW5pdEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5yZW1vdmVFdmVudExpc3RlbmVyKCduaWxlLWFmdGVyLWluaXQnLCBpbml0SGFuZGxlcik7XG4gICAgICAgIHRoaXMuZm9jdXNFZGl0b3IoKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWFmdGVyLWluaXQnLCBpbml0SGFuZGxlcik7XG4gICAgICBcbiAgICAgIC8vIEZhbGxiYWNrOiBhbHNvIHRyeSBhZnRlciBhIGRlbGF5IGluIGNhc2UgdGhlIGV2ZW50IGFscmVhZHkgZmlyZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSBjdXJzb3JcbiAgICovXG4gIHByaXZhdGUgZm9jdXNFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIHRoZSBjb21wb25lbnQncyBmb2N1cyBtZXRob2RcbiAgICAgIHRoaXMuZWRpdG9yLmZvY3VzKCk7XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byBkaXJlY3RseSBmb2N1cyB0aGUgQ29kZU1pcnJvciBjb250ZW50IGFyZWFcbiAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmVkaXRvci5zaGFkb3dSb290O1xuICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgY29uc3QgY21Db250ZW50ID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY20tY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoY21Db250ZW50KSB7XG4gICAgICAgICAgY21Db250ZW50LmZvY3VzKCk7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggYSBjbGljayBldmVudCB0byBlbnN1cmUgY3Vyc29yIHBsYWNlbWVudFxuICAgICAgICAgIGNtQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgIGNtQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZXVwJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFNpbGVudGx5IGhhbmRsZSBhbnkgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGxpdmUgdmFsdWUgZGlyZWN0bHkgZnJvbSBDb2RlTWlycm9yJ3MgaW50ZXJuYWwgc3RhdGUsXG4gICAqIGJ5cGFzc2luZyBkZWJvdW5jZWQgbmlsZS1jaGFuZ2UgZXZlbnRzIGFuZCB0aGUgcG9zc2libHktc3RhbGUgLnZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMaXZlRWRpdG9yVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IHRoaXMuZWRpdG9yLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoc2hhZG93Um9vdCkge1xuICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgaWYgKGNtRWRpdG9yPy5jbVZpZXc/LnZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gY21FZGl0b3IuY21WaWV3LnZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhY2tlZFZhbHVlICE9PSBudWxsKSByZXR1cm4gdGhpcy50cmFja2VkVmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGZ1bGwgZWRpdG9yIGRpYWxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlOyAvLyBSZXNldCBmbGFnIG5vdyB0aGF0IGRpYWxvZyBpcyBvcGVuaW5nXG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIHdpdGggY29uZmlndXJhYmxlIGRpbWVuc2lvbnNcbiAgICBjb25zdCBkaWFsb2dXaWR0aCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nV2lkdGggfHwgJzYwMHB4JztcbiAgICBjb25zdCBkaWFsb2dNYXhIZWlnaHQgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ01heEhlaWdodCB8fCAnODB2aCc7XG4gICAgY29uc3QgZGlhbG9nRWRpdG9ySGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dFZGl0b3JIZWlnaHQgfHwgJzMwMHB4JztcbiAgICBjb25zdCBkaWFsb2dUaXRsZSA9IHRoaXMub3B0aW9ucz8uZGlhbG9nVGl0bGUgfHwgJ0VkaXQgQ29kZSc7XG5cbiAgICB0aGlzLmRpYWxvZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtZGlhbG9nJyk7XG4gICAgdGhpcy5kaWFsb2cuY2xhc3NOYW1lID0gJ3N0LWNvZGUtZWRpdG9yLWRpYWxvZyc7XG4gICAgdGhpcy5kaWFsb2cubGFiZWwgPSBkaWFsb2dUaXRsZTtcbiAgICB0aGlzLmRpYWxvZy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS13aWR0aCcsIGRpYWxvZ1dpZHRoKTtcbiAgICB0aGlzLmRpYWxvZy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tYXgtaGVpZ2h0JywgZGlhbG9nTWF4SGVpZ2h0KTtcblxuICAgIC8vIENyZWF0ZSBkaWFsb2cgY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LnN0eWxlLnBhZGRpbmcgPSAnMTZweCc7XG4gICAgY29udGVudC5zdHlsZS5tYXhIZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA4MHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJztcblxuICAgIC8vIENyZWF0ZSBmdWxsIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgIGNvbnN0IG1pbkxpbmVzID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNaW5MaW5lcyA/PyAyMDtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmdldExpdmVFZGl0b3JWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lQ291bnQgPSAoY3VycmVudFZhbHVlLm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFkZGluZ0xpbmVzID0gTWF0aC5tYXgoMCwgbWluTGluZXMgLSBjdXJyZW50TGluZUNvdW50KTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA9IGN1cnJlbnRWYWx1ZSArICdcXG4nLnJlcGVhdChwYWRkaW5nTGluZXMpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0UHggPSAyMDtcbiAgICBjb25zdCBtaW5IZWlnaHRGcm9tTGluZXMgPSBgJHttaW5MaW5lcyAqIGxpbmVIZWlnaHRQeH1weGA7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3Iuc3R5bGUubWluSGVpZ2h0ID0gYG1heCgke2RpYWxvZ0VkaXRvckhlaWdodH0sICR7bWluSGVpZ2h0RnJvbUxpbmVzfSlgO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7ZGlhbG9nTWF4SGVpZ2h0fSAtIDEyMHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQnLCBgbWF4KCR7ZGlhbG9nRWRpdG9ySGVpZ2h0fSwgJHttaW5IZWlnaHRGcm9tTGluZXN9KWApO1xuXG4gICAgLy8gQXBwbHkgc2FtZSBvcHRpb25zIHRvIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5lbmFibGVGb2xkR3V0dGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVGb2xkR3V0dGVycyA9IHRoaXMub3B0aW9ucy5lbmFibGVGb2xkR3V0dGVycztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21Db21wbGV0aW9uc1BhdGhzKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21Db21wbGV0aW9uc1BhdGhzID0gdGhpcy5vcHRpb25zLmN1c3RvbUNvbXBsZXRpb25zUGF0aHM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5leHBhbmRhYmxlID0gZmFsc2U7XG5cbiAgICAvLyBSZWFsLXRpbWUgc3luYzogVXBkYXRlIGNlbGwgZWRpdG9yIHdoZW5ldmVyIGRpYWxvZyBlZGl0b3IgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkaWFsb2dWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSB8fCAnJztcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gZGlhbG9nVmFsdWU7XG4gICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uQ2hhbmdlKGRpYWxvZ1ZhbHVlIGFzIFQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZ0VkaXRvcik7XG4gICAgdGhpcy5kaWFsb2cuYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBzdGF5IGluIGVkaXQgbW9kZSlcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIC8vIENoZWNrIGlmIGNsb3NlIHdhcyB0cmlnZ2VyZWQgYnkgb3ZlcmxheSBjbGljayAoY2xpY2tpbmcgb3V0c2lkZSlcbiAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LnNvdXJjZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIC8vIENsaWNraW5nIG91dHNpZGUgdGhlIGRpYWxvZyAtIHNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2codHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGlja2luZyBYIGJ1dHRvbiAtIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEVzY2FwZSBrZXkgaW4gZGlhbG9nIC0gc3RheSBpbiBlZGl0IG1vZGVcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCB0byBib2R5IGFuZCBzaG93XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZyk7XG4gICAgXG4gICAgLy8gT3BlbiBkaWFsb2cgYWZ0ZXIgYSB0aWNrIHRvIGVuc3VyZSBpdCdzIGluIHRoZSBET01cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgLy8gRm9jdXMgdGhlIGRpYWxvZyBlZGl0b3JcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dFZGl0b3I/LmZvY3VzKCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRpYWxvZyBhbmQgb3B0aW9uYWxseSBzYXZlL2V4aXQgZWRpdCBtb2RlXG4gICAqL1xuICBwcml2YXRlIGNsb3NlRGlhbG9nKHNhdmVBbmRFeGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgZmxhZyBpbW1lZGlhdGVseSBzbyBkb2N1bWVudCBjbGljayBoYW5kbGVyIHdvcmtzXG4gICAgdGhpcy5kaWFsb2dPcGVuID0gZmFsc2U7XG5cbiAgICAvLyBDbG9zZSBhbmQgcmVtb3ZlIGRpYWxvZ1xuICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbiA9IGZhbHNlO1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c7XG4gICAgICBjb25zdCBkaWFsb2dFZGl0b3JSZWYgPSB0aGlzLmRpYWxvZ0VkaXRvcjtcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIFxuICAgICAgaWYgKHNhdmVBbmRFeGl0ICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgICB0aGlzLmNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgY2VsbCBlZGl0b3IgdG8gc3RheSBpbiBlZGl0IG1vZGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVDb2RlRWRpdG9yIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5lZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZykge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZyA9IHRoaXMub3B0aW9ucy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nO1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBhcHBlYXJhbmNlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzTXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzTXVsdGlsaW5lID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzTXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5tdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRlZmF1bHRGb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlZmF1bHRGb250ID0gdGhpcy5vcHRpb25zLmRlZmF1bHRGb250O1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBiZWhhdmlvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnJlYWRvbmx5ID0gdGhpcy5vcHRpb25zLnJlYWRvbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnRhYkNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IudGFiQ29tcGxldGlvbiA9IHRoaXMub3B0aW9ucy50YWJDb21wbGV0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmhhc1Njcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdGhpcy5vcHRpb25zLmhhc1Njcm9sbGVyO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZGFibGUgLSBkZWZhdWx0IHRvIGZhbHNlIGZvciBjZWxsIGVkaXRpbmdcbiAgICB0aGlzLmVkaXRvci5leHBhbmRhYmxlID0gdGhpcy5vcHRpb25zPy5leHBhbmRhYmxlID8/IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kSWNvbikge1xuICAgICAgdGhpcy5lZGl0b3IuZXhwYW5kSWNvbiA9IHRoaXMub3B0aW9ucy5leHBhbmRJY29uO1xuICAgIH1cblxuICAgIC8vIEF1dG9jb21wbGV0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gPSB0aGlzLm9wdGlvbnMuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hYm92ZUN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5hYm92ZUN1cnNvciA9IHRoaXMub3B0aW9ucy5hYm92ZUN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvQ29tcGxldGVTdHlsZSkge1xuICAgICAgdGhpcy5lZGl0b3IuYXV0b0NvbXBsZXRlU3R5bGUgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlU3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2UgPSB0aGlzLm9wdGlvbnMuZGVib3VuY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2VUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlYm91bmNlVGltZW91dCA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZVRpbWVvdXQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3JNZXNzYWdlID0gdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gdGhlbWVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21UaGVtZUNTUykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tVGhlbWVDU1MgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVGhlbWVDU1M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbGwgZXZlbnQgbGlzdGVuZXJzIHdpdGggcHJvcGVyIGNsZWFudXAgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbGlkYXRlT25TYXZlID0gdGhpcy5vcHRpb25zPy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgXG4gICAgICAvLyBGb3Igc2luZ2xlLWxpbmUgbW9kZSwgRW50ZXIgc2F2ZXNcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgJiYga2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVzY2FwZSBjYW5jZWxzXG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWJsdXIgZXZlbnQgZm9yIHNhdmluZyBvbiBibHVyXG4gICAgY29uc3QgYmx1ckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGRpYWxvZyBpcyBvcGVuXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRG9uJ3Qgc2F2ZSBpZiBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkIChtb3VzZWRvd24gc2V0cyB0aGlzIGZsYWcpXG4gICAgICBpZiAodGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIC8vIFJlc2V0IGZsYWcgLSB0aGUgY2xpY2sgaGFuZGxlciB3aWxsIG9wZW4gdGhlIGRpYWxvZ1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgYmx1ckhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG5cbiAgICAvLyBEb2N1bWVudC1sZXZlbCBtb3VzZWRvd24gaGFuZGxlciB0byBkZXRlY3QgY2xpY2tzIG91dHNpZGUgdGhlIGVkaXRvclxuICAgIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gRG9uJ3QgcHJvY2VzcyBpZiBkaWFsb2cgaXMgb3BlbiBvciBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuIHx8IHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBjb21wb3NlZFBhdGggdG8gaGFuZGxlIFNoYWRvdyBET00gYm91bmRhcmllc1xuICAgICAgY29uc3QgcGF0aCA9IGUuY29tcG9zZWRQYXRoKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGFueSBlbGVtZW50IGluIHRoZSBwYXRoIGlzIG91ciB3cmFwcGVyLCBlZGl0b3IsIG9yIGV4cGFuZCBidXR0b25cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLndyYXBwZXIgfHwgZWxlbWVudCA9PT0gdGhpcy5lZGl0b3IgfHwgZWxlbWVudCA9PT0gdGhpcy5leHBhbmRCdXR0b24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayBpZiBpdCdzIHRoZSBjb250YWluZXIgKHRoZSBjZWxsKVxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xpY2sgaXMgb3V0c2lkZSAtIHNhdmUgYW5kIGV4aXRcbiAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdpdGggYSBzbWFsbCBkZWxheSB0byBhdm9pZCBjYXB0dXJpbmcgdGhlIGluaXRpYWwgY2xpY2sgdGhhdCBvcGVuZWQgdGhlIGVkaXRvclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciEsIHRydWUpO1xuICAgIH0sIDUwKTtcblxuICAgIC8vIFJlYWwtdGltZSB2YWx1ZSB1cGRhdGVzIHVzaW5nIG5pbGUtY2hhbmdlXG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjdXN0b21FdmVudC5kZXRhaWw/LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUgYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRMaXZlRWRpdG9yVmFsdWUoKTtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJykgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZSBwcm9ncmFtbWF0aWNhbGx5XG4gICAqL1xuICBzZXRWYWx1ZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIENvZGVNaXJyb3IgaW5zdGFuY2UgKGlmIG5lZWRlZCBmb3IgYWR2YW5jZWQgdXNhZ2UpXG4gICAqL1xuICBnZXRFZGl0b3JJbnN0YW5jZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcjtcbiAgfVxufVxuIl19
|