@libs-ui/components-preview-text-data 0.2.357-3 → 0.2.357-4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/editor/editor-completions.d.ts +8 -0
- package/editor/editor-forbidden.d.ts +8 -0
- package/editor/editor-height.d.ts +21 -0
- package/esm2022/editor/editor-completions.mjs +31 -0
- package/esm2022/editor/editor-forbidden.mjs +65 -0
- package/esm2022/editor/editor-height.mjs +87 -0
- package/esm2022/linters/js-linter.mjs +348 -0
- package/esm2022/linters/json-linter.mjs +14 -0
- package/esm2022/linters/linter-shared.mjs +8 -0
- package/esm2022/linters/python-linter.mjs +52 -0
- package/esm2022/linters/sql-linter.mjs +34 -0
- package/esm2022/preview-text-data.component.mjs +39 -319
- package/esm2022/preview-text-data.define.mjs +13 -1
- package/esm2022/preview-text-data.type.mjs +2 -0
- package/fesm2022/libs-ui-components-preview-text-data.mjs +675 -320
- package/fesm2022/libs-ui-components-preview-text-data.mjs.map +1 -1
- package/linters/js-linter.d.ts +45 -0
- package/linters/json-linter.d.ts +4 -0
- package/linters/linter-shared.d.ts +3 -0
- package/linters/python-linter.d.ts +4 -0
- package/linters/sql-linter.d.ts +4 -0
- package/package.json +9 -7
- package/preview-text-data.component.d.ts +18 -35
- package/preview-text-data.define.d.ts +12 -0
- package/preview-text-data.type.d.ts +33 -0
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, viewChild } from '@angular/core';
|
|
2
|
-
import { autocompletion } from '@codemirror/autocomplete';
|
|
3
|
-
import { syntaxTree } from '@codemirror/language';
|
|
4
2
|
import { linter, lintGutter } from '@codemirror/lint';
|
|
5
|
-
import { Compartment,
|
|
3
|
+
import { Compartment, Prec } from '@codemirror/state';
|
|
6
4
|
import { EditorView, lineNumbers } from '@codemirror/view';
|
|
7
5
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
8
6
|
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
9
7
|
import { LibsUiNotificationService } from '@libs-ui/services-notification';
|
|
10
|
-
import { get } from '@libs-ui/utils';
|
|
11
8
|
import { basicSetup } from 'codemirror6';
|
|
12
9
|
import { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';
|
|
10
|
+
import { computeJsDiagnostics } from './linters/js-linter';
|
|
11
|
+
import { computeJsonDiagnostics } from './linters/json-linter';
|
|
12
|
+
import { computeSqlDiagnostics } from './linters/sql-linter';
|
|
13
|
+
import { computePythonDiagnostics } from './linters/python-linter';
|
|
14
|
+
import { buildCompletionExtension } from './editor/editor-completions';
|
|
15
|
+
import { buildForbiddenExtension } from './editor/editor-forbidden';
|
|
16
|
+
import { applyMaxHeight, applyMinLines } from './editor/editor-height';
|
|
13
17
|
import * as i0 from "@angular/core";
|
|
14
18
|
export class LibsUiComponentsPreviewTextDataComponent {
|
|
15
19
|
// ==========================================================================
|
|
@@ -54,6 +58,19 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
54
58
|
hiddenAction = input(false, {
|
|
55
59
|
transform: (value) => value ?? false,
|
|
56
60
|
});
|
|
61
|
+
/** Số dòng tối thiểu: nếu content ít dòng hơn sẽ tự bù dòng trống (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không bù. */
|
|
62
|
+
minLines = input();
|
|
63
|
+
/** Số dòng tối đa: vượt quá editor sẽ giới hạn chiều cao và xuất hiện vùng cuộn (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không giới hạn. */
|
|
64
|
+
maxLines = input();
|
|
65
|
+
/**
|
|
66
|
+
* Element container bên ngoài để editor tự tính chiều cao theo `min-height`/`max-height` (CSS) của nó.
|
|
67
|
+
* Khi truyền, editor đọc min/max-height của container, trừ phần header/toolbar phía trên, rồi snap
|
|
68
|
+
* chiều cao vùng cuộn về đúng bội số dòng (không cắt nửa dòng) + bật scroll khi vượt max.
|
|
69
|
+
* CẤM cấu hình đồng thời với `minLines`/`maxLines` (sẽ throw lỗi) — container tự quản lý min/max.
|
|
70
|
+
*/
|
|
71
|
+
containerElement = input();
|
|
72
|
+
/** z-index cho popover dropdown chọn ngôn ngữ. */
|
|
73
|
+
zIndexPopover = input();
|
|
57
74
|
lintIgnorePatterns = input(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {
|
|
58
75
|
transform: (value) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],
|
|
59
76
|
});
|
|
@@ -116,7 +133,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
116
133
|
if (!this.isInitialized || !this.editorViewInstance)
|
|
117
134
|
return;
|
|
118
135
|
this.editorViewInstance.dispatch({
|
|
119
|
-
effects: this.completionsCompartment.reconfigure(items.length ?
|
|
136
|
+
effects: this.completionsCompartment.reconfigure(items.length ? buildCompletionExtension(items) : []),
|
|
120
137
|
});
|
|
121
138
|
});
|
|
122
139
|
// Effect để cập nhật forbidden patterns khi input thay đổi
|
|
@@ -125,7 +142,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
125
142
|
if (!this.isInitialized || !this.editorViewInstance)
|
|
126
143
|
return;
|
|
127
144
|
this.editorViewInstance.dispatch({
|
|
128
|
-
effects: this.forbiddenCompartment.reconfigure(patterns.length ?
|
|
145
|
+
effects: this.forbiddenCompartment.reconfigure(patterns.length ? buildForbiddenExtension(patterns, (violations) => this.outViolations.emit(violations)) : []),
|
|
129
146
|
});
|
|
130
147
|
});
|
|
131
148
|
// Cleanup khi component bị destroy
|
|
@@ -157,10 +174,11 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
157
174
|
const languageExtension = await this.loadLanguageExtension(this.langSelected());
|
|
158
175
|
const linterExtension = await this.loadLinterExtension(this.langSelected());
|
|
159
176
|
this.editorViewInstance = new EditorView({
|
|
160
|
-
doc: this.content(),
|
|
177
|
+
doc: applyMinLines(this.content(), this.minLines()),
|
|
161
178
|
parent: this.containerPreview().nativeElement,
|
|
162
179
|
extensions: this.createExtensions(languageExtension, linterExtension),
|
|
163
180
|
});
|
|
181
|
+
applyMaxHeight(this.editorViewInstance, { minLines: this.minLines(), maxLines: this.maxLines(), container: this.containerElement() });
|
|
164
182
|
}
|
|
165
183
|
/**
|
|
166
184
|
* Tạo danh sách extensions cho editor
|
|
@@ -173,8 +191,8 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
173
191
|
this.languageCompartment.of(languageExtension),
|
|
174
192
|
this.linterCompartment.of(linterExtension),
|
|
175
193
|
// Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion
|
|
176
|
-
Prec.highest(this.completionsCompartment.of(initialCompletions.length ?
|
|
177
|
-
this.forbiddenCompartment.of(initialPatterns.length ?
|
|
194
|
+
Prec.highest(this.completionsCompartment.of(initialCompletions.length ? buildCompletionExtension(initialCompletions) : [])),
|
|
195
|
+
this.forbiddenCompartment.of(initialPatterns.length ? buildForbiddenExtension(initialPatterns, (violations) => this.outViolations.emit(violations)) : []),
|
|
178
196
|
this.createLightTheme(),
|
|
179
197
|
EditorView.editable.of(this.editable()),
|
|
180
198
|
this.wrapCompartment.of(EditorView.lineWrapping),
|
|
@@ -254,336 +272,38 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
254
272
|
// ==========================================================================
|
|
255
273
|
// PUBLIC METHODS - Linter factories (được gọi từ registry)
|
|
256
274
|
// ==========================================================================
|
|
257
|
-
/**
|
|
258
|
-
* Tạo JavaScript linter với 2-pass detection:
|
|
259
|
-
* 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)
|
|
260
|
-
* 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot
|
|
261
|
-
*/
|
|
275
|
+
/** JavaScript/TypeScript linter — pipeline trong `linters/js-linter.ts` (babel + trailing-dot + thiếu `;` + biến chưa khai báo). */
|
|
262
276
|
createJsLinter() {
|
|
263
|
-
return linter((view) => {
|
|
264
|
-
const diagnostics =
|
|
265
|
-
const doc = view.state.doc;
|
|
266
|
-
// Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm
|
|
267
|
-
const trailingDotLines = new Set();
|
|
268
|
-
for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {
|
|
269
|
-
const line = doc.line(lineNum);
|
|
270
|
-
const trimmed = line.text.trimEnd();
|
|
271
|
-
const match = /(\w+)\.\s*$/.exec(trimmed);
|
|
272
|
-
if (!match)
|
|
273
|
-
continue;
|
|
274
|
-
trailingDotLines.add(lineNum);
|
|
275
|
-
const dotPos = line.from + trimmed.lastIndexOf('.');
|
|
276
|
-
diagnostics.push({
|
|
277
|
-
from: dotPos,
|
|
278
|
-
to: dotPos + 1,
|
|
279
|
-
severity: 'error',
|
|
280
|
-
message: `Incomplete property access on "${match[1]}"`,
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
// Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)
|
|
284
|
-
// để lọc cascading errors từ syntaxTree
|
|
285
|
-
const taintedLines = new Set();
|
|
286
|
-
for (const lineNum of trailingDotLines) {
|
|
287
|
-
for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {
|
|
288
|
-
taintedLines.add(i);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
// Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)
|
|
292
|
-
const tree = syntaxTree(view.state);
|
|
293
|
-
tree.iterate({
|
|
294
|
-
enter: (node) => {
|
|
295
|
-
if (!node.type.isError)
|
|
296
|
-
return;
|
|
297
|
-
if (node.from === node.to)
|
|
298
|
-
return; // Bỏ qua empty-range node (cascading error)
|
|
299
|
-
const errorLineNum = doc.lineAt(node.from).number;
|
|
300
|
-
if (taintedLines.has(errorLineNum))
|
|
301
|
-
return;
|
|
302
|
-
diagnostics.push({
|
|
303
|
-
from: node.from,
|
|
304
|
-
to: Math.min(node.to, doc.length),
|
|
305
|
-
severity: 'error',
|
|
306
|
-
message: this.buildJsErrorMessage(doc, node),
|
|
307
|
-
});
|
|
308
|
-
},
|
|
309
|
-
});
|
|
277
|
+
return linter(async (view) => {
|
|
278
|
+
const diagnostics = await computeJsDiagnostics(view.state.doc, view.state.doc.toString(), new Set(this.completions().map((item) => item.label)));
|
|
310
279
|
this.syntaxErrors.emit(diagnostics);
|
|
311
280
|
return diagnostics;
|
|
312
281
|
});
|
|
313
282
|
}
|
|
314
|
-
|
|
315
|
-
const text = doc.sliceString(node.from, node.to).trim();
|
|
316
|
-
if (text)
|
|
317
|
-
return `JavaScript syntax error near "${text}"`;
|
|
318
|
-
const prevToken = this.getTokenBefore(doc, node.from);
|
|
319
|
-
if (!prevToken)
|
|
320
|
-
return 'JavaScript syntax error';
|
|
321
|
-
if (prevToken.endsWith('('))
|
|
322
|
-
return 'Missing closing ")"';
|
|
323
|
-
if (prevToken.endsWith('['))
|
|
324
|
-
return 'Missing closing "]"';
|
|
325
|
-
if (/^function$/i.test(prevToken))
|
|
326
|
-
return 'Expected function name or "("';
|
|
327
|
-
if (/^return$/i.test(prevToken))
|
|
328
|
-
return 'Invalid expression after "return"';
|
|
329
|
-
if (/^=>$/.test(prevToken))
|
|
330
|
-
return 'Expected function body after "=>"';
|
|
331
|
-
if (/^const$|^let$|^var$/i.test(prevToken))
|
|
332
|
-
return 'Expected variable name';
|
|
333
|
-
return `JavaScript syntax error near "${prevToken}"`;
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Tạo JSON linter
|
|
337
|
-
* Sử dụng JSON.parse để validate
|
|
338
|
-
*/
|
|
283
|
+
/** JSON linter — logic trong `linters/json-linter.ts`. */
|
|
339
284
|
createJsonLinter() {
|
|
340
285
|
return linter((view) => {
|
|
341
|
-
const
|
|
342
|
-
const diagnostics = [];
|
|
343
|
-
try {
|
|
344
|
-
JSON.parse(text);
|
|
345
|
-
}
|
|
346
|
-
catch (err) {
|
|
347
|
-
diagnostics.push({
|
|
348
|
-
from: 0,
|
|
349
|
-
to: text.length,
|
|
350
|
-
severity: 'error',
|
|
351
|
-
message: get(err, 'message', ''),
|
|
352
|
-
});
|
|
353
|
-
}
|
|
286
|
+
const diagnostics = computeJsonDiagnostics(view);
|
|
354
287
|
this.syntaxErrors.emit(diagnostics);
|
|
355
288
|
return diagnostics;
|
|
356
289
|
});
|
|
357
290
|
}
|
|
358
|
-
/**
|
|
359
|
-
* Tạo SQL linter
|
|
360
|
-
*/
|
|
291
|
+
/** SQL linter — logic trong `linters/sql-linter.ts`. */
|
|
361
292
|
createSqlLinter() {
|
|
362
293
|
return linter((view) => {
|
|
363
|
-
const diagnostics =
|
|
364
|
-
const doc = view.state.doc;
|
|
365
|
-
const tree = syntaxTree(view.state);
|
|
366
|
-
tree.iterate({
|
|
367
|
-
enter: (node) => {
|
|
368
|
-
if (!node.type.isError)
|
|
369
|
-
return;
|
|
370
|
-
diagnostics.push({
|
|
371
|
-
from: Math.max(0, node.from - 1),
|
|
372
|
-
to: node.from,
|
|
373
|
-
severity: 'error',
|
|
374
|
-
message: this.buildSqlErrorMessage(doc, node),
|
|
375
|
-
});
|
|
376
|
-
},
|
|
377
|
-
});
|
|
294
|
+
const diagnostics = computeSqlDiagnostics(view);
|
|
378
295
|
this.syntaxErrors.emit(diagnostics);
|
|
379
296
|
return diagnostics;
|
|
380
297
|
});
|
|
381
298
|
}
|
|
382
|
-
|
|
383
|
-
if (node.from !== node.to) {
|
|
384
|
-
const text = doc.sliceString(node.from, node.to);
|
|
385
|
-
return `SQL syntax error near "${text}"`;
|
|
386
|
-
}
|
|
387
|
-
const prevToken = this.getTokenBefore(doc, node.from);
|
|
388
|
-
if (!prevToken) {
|
|
389
|
-
return 'SQL syntax error at beginning of statement';
|
|
390
|
-
}
|
|
391
|
-
if (/FROM$/i.test(prevToken)) {
|
|
392
|
-
return 'Expected table name after FROM';
|
|
393
|
-
}
|
|
394
|
-
if (/SELECT$/i.test(prevToken)) {
|
|
395
|
-
return 'Expected column list after SELECT';
|
|
396
|
-
}
|
|
397
|
-
if (/WHERE$/i.test(prevToken)) {
|
|
398
|
-
return 'Expected condition after WHERE';
|
|
399
|
-
}
|
|
400
|
-
if (prevToken.endsWith('(')) {
|
|
401
|
-
return 'Missing closing ")"';
|
|
402
|
-
}
|
|
403
|
-
return `Unexpected end of SQL after "${prevToken}"`;
|
|
404
|
-
}
|
|
405
|
-
getTokenBefore(doc, pos) {
|
|
406
|
-
const start = Math.max(0, pos - 30);
|
|
407
|
-
const text = doc.sliceString(start, pos);
|
|
408
|
-
const match = /(\S+)\s*$/.exec(text);
|
|
409
|
-
return match?.[1] ?? '';
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.
|
|
413
|
-
* Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.
|
|
414
|
-
*/
|
|
299
|
+
/** Python linter — logic trong `linters/python-linter.ts`. */
|
|
415
300
|
createPythonLinter() {
|
|
416
301
|
return linter((view) => {
|
|
417
|
-
const diagnostics =
|
|
418
|
-
const doc = view.state.doc;
|
|
419
|
-
const tree = syntaxTree(view.state);
|
|
420
|
-
tree.iterate({
|
|
421
|
-
enter: (node) => {
|
|
422
|
-
if (!node.type.isError)
|
|
423
|
-
return;
|
|
424
|
-
const from = Math.max(0, node.from - 1);
|
|
425
|
-
const to = node.from === node.to ? node.from + 1 : node.to;
|
|
426
|
-
diagnostics.push({
|
|
427
|
-
from,
|
|
428
|
-
to: Math.min(to, doc.length),
|
|
429
|
-
severity: 'error',
|
|
430
|
-
message: this.buildPythonErrorMessage(doc, node),
|
|
431
|
-
});
|
|
432
|
-
},
|
|
433
|
-
});
|
|
302
|
+
const diagnostics = computePythonDiagnostics(view);
|
|
434
303
|
this.syntaxErrors.emit(diagnostics);
|
|
435
304
|
return diagnostics;
|
|
436
305
|
});
|
|
437
306
|
}
|
|
438
|
-
buildPythonErrorMessage(doc, node) {
|
|
439
|
-
if (node.from !== node.to) {
|
|
440
|
-
const text = doc.sliceString(node.from, node.to).trim();
|
|
441
|
-
const textSuffix = text ? ` near "${text}"` : '';
|
|
442
|
-
return `Python syntax error${textSuffix}`;
|
|
443
|
-
}
|
|
444
|
-
const prevToken = this.getTokenBefore(doc, node.from);
|
|
445
|
-
if (!prevToken) {
|
|
446
|
-
return 'Python syntax error';
|
|
447
|
-
}
|
|
448
|
-
if (/^def$/i.test(prevToken))
|
|
449
|
-
return 'Expected function name after "def"';
|
|
450
|
-
if (/^class$/i.test(prevToken))
|
|
451
|
-
return 'Expected class name after "class"';
|
|
452
|
-
if (/^return$/i.test(prevToken))
|
|
453
|
-
return 'Invalid expression after "return"';
|
|
454
|
-
if (/^import$/i.test(prevToken))
|
|
455
|
-
return 'Expected module name after "import"';
|
|
456
|
-
if (/^from$/i.test(prevToken))
|
|
457
|
-
return 'Expected module name after "from"';
|
|
458
|
-
if (/^if$/i.test(prevToken))
|
|
459
|
-
return 'Expected condition after "if"';
|
|
460
|
-
if (/^elif$/i.test(prevToken))
|
|
461
|
-
return 'Expected condition after "elif"';
|
|
462
|
-
if (/^while$/i.test(prevToken))
|
|
463
|
-
return 'Expected condition after "while"';
|
|
464
|
-
if (/^for$/i.test(prevToken))
|
|
465
|
-
return 'Expected variable after "for"';
|
|
466
|
-
if (prevToken.endsWith('.'))
|
|
467
|
-
return `Incomplete attribute access on "${prevToken.slice(0, -1)}"`;
|
|
468
|
-
if (prevToken.endsWith('('))
|
|
469
|
-
return 'Missing closing ")"';
|
|
470
|
-
if (prevToken.endsWith('['))
|
|
471
|
-
return 'Missing closing "]"';
|
|
472
|
-
return `Python syntax error near "${prevToken}"`;
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Tạo CodeMirror extension cho custom completions từ danh sách input.
|
|
476
|
-
* Hỗ trợ 2 chế độ:
|
|
477
|
-
* 1. Gõ tên biến → gợi ý top-level items
|
|
478
|
-
* 2. Gõ `obj.` → gợi ý properties của obj
|
|
479
|
-
*/
|
|
480
|
-
buildCompletionExtension(items) {
|
|
481
|
-
const completionSource = (context) => {
|
|
482
|
-
// Chế độ dot-notation: gõ "obj.prop" → gợi ý properties của obj
|
|
483
|
-
const dotMatch = context.matchBefore(/\w+\.\w*/);
|
|
484
|
-
if (dotMatch) {
|
|
485
|
-
const dotPos = dotMatch.text.indexOf('.');
|
|
486
|
-
const objectName = dotMatch.text.slice(0, dotPos);
|
|
487
|
-
const parent = items.find((i) => i.label === objectName);
|
|
488
|
-
if (parent?.properties?.length) {
|
|
489
|
-
return {
|
|
490
|
-
from: dotMatch.from + dotPos + 1,
|
|
491
|
-
options: parent.properties.map((p) => ({
|
|
492
|
-
label: p.label,
|
|
493
|
-
type: p.type ?? 'property',
|
|
494
|
-
detail: p.detail ?? '',
|
|
495
|
-
info: p.info ?? '',
|
|
496
|
-
})),
|
|
497
|
-
};
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
// Chế độ top-level: gợi ý tên biến/object khi gõ ký tự
|
|
501
|
-
const word = context.matchBefore(/\w*/);
|
|
502
|
-
if (!word || (word.from === word.to && !context.explicit))
|
|
503
|
-
return null;
|
|
504
|
-
return {
|
|
505
|
-
from: word.from,
|
|
506
|
-
options: items.map((item) => ({
|
|
507
|
-
label: item.label,
|
|
508
|
-
type: item.type ?? 'variable',
|
|
509
|
-
detail: item.detail ?? '',
|
|
510
|
-
info: item.info ?? '',
|
|
511
|
-
})),
|
|
512
|
-
};
|
|
513
|
-
};
|
|
514
|
-
return autocompletion({ override: [completionSource] });
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Tạo extension bảo mật gồm 2 layer:
|
|
518
|
-
* 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations
|
|
519
|
-
* 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm
|
|
520
|
-
*/
|
|
521
|
-
buildForbiddenExtension(patterns) {
|
|
522
|
-
const toGlobalRegex = (p) => {
|
|
523
|
-
if (p instanceof RegExp) {
|
|
524
|
-
const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;
|
|
525
|
-
return new RegExp(p.source, flags);
|
|
526
|
-
}
|
|
527
|
-
return new RegExp(this.escapeRegex(p), 'gi');
|
|
528
|
-
};
|
|
529
|
-
const forbiddenLinter = linter((view) => {
|
|
530
|
-
const diagnostics = [];
|
|
531
|
-
const violations = [];
|
|
532
|
-
const text = view.state.doc.toString();
|
|
533
|
-
const tree = syntaxTree(view.state);
|
|
534
|
-
// Build a Set of comment ranges từ AST để skip match nằm trong comment
|
|
535
|
-
const commentRanges = [];
|
|
536
|
-
tree.iterate({
|
|
537
|
-
enter: (node) => {
|
|
538
|
-
if (node.type.name.toLowerCase().includes('comment')) {
|
|
539
|
-
commentRanges.push({ from: node.from, to: node.to });
|
|
540
|
-
}
|
|
541
|
-
},
|
|
542
|
-
});
|
|
543
|
-
const isInComment = (from, to) => commentRanges.some((r) => from >= r.from && to <= r.to);
|
|
544
|
-
for (const pattern of patterns) {
|
|
545
|
-
const re = toGlobalRegex(pattern);
|
|
546
|
-
re.lastIndex = 0;
|
|
547
|
-
let match;
|
|
548
|
-
while ((match = re.exec(text)) !== null) {
|
|
549
|
-
const from = match.index;
|
|
550
|
-
const to = from + match[0].length;
|
|
551
|
-
if (isInComment(from, to))
|
|
552
|
-
continue;
|
|
553
|
-
const line = view.state.doc.lineAt(from).number;
|
|
554
|
-
const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;
|
|
555
|
-
diagnostics.push({
|
|
556
|
-
from,
|
|
557
|
-
to,
|
|
558
|
-
severity: 'error',
|
|
559
|
-
message: `Mã bị cấm: "${match[0]}" — vi phạm chính sách bảo mật`,
|
|
560
|
-
});
|
|
561
|
-
violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
this.outViolations.emit(violations);
|
|
565
|
-
return diagnostics;
|
|
566
|
-
});
|
|
567
|
-
// Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào
|
|
568
|
-
const pasteFilter = EditorState.transactionFilter.of((tr) => {
|
|
569
|
-
if (!tr.docChanged)
|
|
570
|
-
return tr;
|
|
571
|
-
if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste'))
|
|
572
|
-
return tr;
|
|
573
|
-
const newText = tr.newDoc.toString();
|
|
574
|
-
for (const pattern of patterns) {
|
|
575
|
-
const re = toGlobalRegex(pattern);
|
|
576
|
-
re.lastIndex = 0;
|
|
577
|
-
if (re.test(newText))
|
|
578
|
-
return []; // [] = block transaction
|
|
579
|
-
}
|
|
580
|
-
return tr;
|
|
581
|
-
});
|
|
582
|
-
return [forbiddenLinter, pasteFilter];
|
|
583
|
-
}
|
|
584
|
-
escapeRegex(str) {
|
|
585
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
586
|
-
}
|
|
587
307
|
// ==========================================================================
|
|
588
308
|
// PROTECTED METHODS - Event handlers
|
|
589
309
|
// ==========================================================================
|
|
@@ -629,10 +349,10 @@ export class LibsUiComponentsPreviewTextDataComponent {
|
|
|
629
349
|
});
|
|
630
350
|
}
|
|
631
351
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
632
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
352
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, minLines: { classPropertyName: "minLines", publicName: "minLines", isSignal: true, isRequired: false, transformFunction: null }, maxLines: { classPropertyName: "maxLines", publicName: "maxLines", isSignal: true, isRequired: false, transformFunction: null }, containerElement: { classPropertyName: "containerElement", publicName: "containerElement", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
633
353
|
}
|
|
634
354
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
|
|
635
355
|
type: Component,
|
|
636
|
-
args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
|
|
356
|
+
args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
|
|
637
357
|
}], ctorParameters: () => [] });
|
|
638
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBRSxjQUFjLEVBQXVDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQWEsSUFBSSxFQUFRLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1B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QUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekksZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDeEgsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM3QixhQUFhLEVBQUUsVUFBVTtTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXRyQlUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0MsZ3dEQ3pCckQscTREQXlDQSxvM0JEbEJZLGlDQUFpQyx1M0RBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGF1dG9jb21wbGV0aW9uLCBDb21wbGV0aW9uQ29udGV4dCwgQ29tcGxldGlvblJlc3VsdCB9IGZyb20gJ0Bjb2RlbWlycm9yL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgRGlhZ25vc3RpYywgbGludGVyLCBsaW50R3V0dGVyIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGludCc7XG5pbXBvcnQgeyBDb21wYXJ0bWVudCwgRWRpdG9yU3RhdGUsIEV4dGVuc2lvbiwgUHJlYywgVGV4dCwgVHJhbnNhY3Rpb24gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBsaW5lTnVtYmVycywgVmlld1VwZGF0ZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHR5cGUgeyBTeW50YXhOb2RlUmVmIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtLCBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBsZXRpb25zQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JiaWRkZW5Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFN0YXRlTm9XcmFwID0gc2lnbmFsKCcnKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NDaGFuZ2VMYWJlbCA9IGlucHV0PElMYW5ndWFnZU9wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggxJHhu5FpIHTGsOG7o25nL2Jp4bq/biBn4bujaSDDvSBraGkgZ8O1IOKAlCBnaeG7kW5nIEludGVsbGlTZW5zZSB0cm9uZyBJREUuXG4gICAqIEjhu5cgdHLhu6MgZG90LW5vdGF0aW9uOiDEkeG7i25oIG5naMSpYSBgcHJvcGVydGllc2AgxJHhu4MgZ+G7o2kgw70gc2F1IGThuqV1IGAuYFxuICAgKiBAZXhhbXBsZVxuICAgKiBbY29tcGxldGlvbnNdPVwiW3sgbGFiZWw6ICd1c2VyJywgcHJvcGVydGllczogW3sgbGFiZWw6ICduYW1lJywgZGV0YWlsOiAnc3RyaW5nJyB9XSB9XVwiXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IGlucHV0PElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdLCBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggcGF0dGVybiBj4bqlbSDigJQgY2h14buXaSBsaXRlcmFsIGhv4bq3YyBSZWdFeHAuXG4gICAqIEtoaSBwaMOhdCBoaeG7h24gdmkgcGjhuqFtOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSArIGNo4bq3biBwYXN0ZSArIGVtaXQgYChvdXRWaW9sYXRpb25zKWAuXG4gICAqIETDuW5nIGBERUZBVUxUX1NFQ1VSSVRZX1BBVFRFUk5TYCDEkeG7gyDDoXAgZOG7pW5nIGLhu5kgcXV5IHThuq9jIGLhuqNvIG3huq10IG3hurdjIMSR4buLbmggY2hvIGxvdy1jb2RlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiZGVmYXVsdFNlY3VyaXR5UGF0dGVybnNcIlxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiWy9ldmFsXFxzKlxcKC8sICdsb2NhbFN0b3JhZ2UnXVwiXG4gICAqL1xuICByZWFkb25seSBmb3JiaWRkZW5QYXR0ZXJucyA9IGlucHV0PFRfRm9yYmlkZGVuUGF0dGVybltdLCBUX0ZvcmJpZGRlblBhdHRlcm5bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IFRfRm9yYmlkZGVuUGF0dGVybltdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG4gIHJlYWRvbmx5IG91dFZpb2xhdGlvbnMgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbltdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFZmZlY3QgxJHhu4MgY+G6rXAgbmjhuq10IGN1c3RvbSBjb21wbGV0aW9ucyBraGkgaW5wdXQgdGhheSDEkeG7lWlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCB8fCAhdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHJldHVybjtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgZWZmZWN0czogdGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50LnJlY29uZmlndXJlKGl0ZW1zLmxlbmd0aCA/IHRoaXMuYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGl0ZW1zKSA6IFtdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRWZmZWN0IMSR4buDIGPhuq1wIG5o4bqtdCBmb3JiaWRkZW4gcGF0dGVybnMga2hpIGlucHV0IHRoYXkgxJHhu5VpXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5mb3JiaWRkZW5QYXR0ZXJucygpO1xuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSByZXR1cm47XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5kaXNwYXRjaCh7XG4gICAgICAgIGVmZmVjdHM6IHRoaXMuZm9yYmlkZGVuQ29tcGFydG1lbnQucmVjb25maWd1cmUocGF0dGVybnMubGVuZ3RoID8gdGhpcy5idWlsZEZvcmJpZGRlbkV4dGVuc2lvbihwYXR0ZXJucykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFudXAga2hpIGNvbXBvbmVudCBi4buLIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJRkVDWUNMRSBIT09LU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZy5zZXQoaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZyh0aGlzLmxhbmdzQWNjZXB0KCksIHRoaXMubGFuZ3NDaGFuZ2VMYWJlbCgpKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUVkaXRvcigpO1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBFZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogS2jhu59pIHThuqFvIGVkaXRvciB24bubaSBjw6FjIGV4dGVuc2lvbnMgY8ahIGLhuqNuXG4gICAqIExhbmd1YWdlIMSRxrDhu6NjIGxvYWQgYXN5bmMgxJHhu4MgdOG7kWkgxrB1IGJ1bmRsZSBzaXplXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVFZGl0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbGFuZ3VhZ2VFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbih0aGlzLmxhbmdTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsaW50ZXJFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG5cbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSA9IG5ldyBFZGl0b3JWaWV3KHtcbiAgICAgIGRvYzogdGhpcy5jb250ZW50KCksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gZGFuaCBzw6FjaCBleHRlbnNpb25zIGNobyBlZGl0b3JcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW5zaW9ucyhsYW5ndWFnZUV4dGVuc2lvbjogRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb246IEV4dGVuc2lvbik6IEV4dGVuc2lvbltdIHtcbiAgICBjb25zdCBpbml0aWFsQ29tcGxldGlvbnMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgY29uc3QgaW5pdGlhbFBhdHRlcm5zID0gdGhpcy5mb3JiaWRkZW5QYXR0ZXJucygpO1xuICAgIHJldHVybiBbXG4gICAgICBiYXNpY1NldHVwLFxuICAgICAgdGhpcy5sYW5ndWFnZUNvbXBhcnRtZW50Lm9mKGxhbmd1YWdlRXh0ZW5zaW9uKSxcbiAgICAgIHRoaXMubGludGVyQ29tcGFydG1lbnQub2YobGludGVyRXh0ZW5zaW9uKSxcbiAgICAgIC8vIENvbXBhcnRtZW50IGNobyBjdXN0b20gY29tcGxldGlvbnMg4oCUIFByZWMuaGlnaGVzdCDEkeG7gyBvdmVycmlkZSBiYXNpY1NldHVwJ3MgYXV0b2NvbXBsZXRpb25cbiAgICAgIFByZWMuaGlnaGVzdCh0aGlzLmNvbXBsZXRpb25zQ29tcGFydG1lbnQub2YoaW5pdGlhbENvbXBsZXRpb25zLmxlbmd0aCA/IHRoaXMuYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGluaXRpYWxDb21wbGV0aW9ucykgOiBbXSkpLFxuICAgICAgdGhpcy5mb3JiaWRkZW5Db21wYXJ0bWVudC5vZihpbml0aWFsUGF0dGVybnMubGVuZ3RoID8gdGhpcy5idWlsZEZvcmJpZGRlbkV4dGVuc2lvbihpbml0aWFsUGF0dGVybnMpIDogW10pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgLSBMaW50ZXIgZmFjdG9yaWVzICjEkcaw4bujYyBn4buNaSB04burIHJlZ2lzdHJ5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBU4bqhbyBKYXZhU2NyaXB0IGxpbnRlciB24bubaSAyLXBhc3MgZGV0ZWN0aW9uOlxuICAgKiAxLiBUZXh0LWJhc2VkIHNjYW4gY2hvIHRyYWlsaW5nIGRvdCAocGFyc2VyIHRoxrDhu51uZyDEkeG6t3QgZXJyb3Igbm9kZSBzYWkgduG7iyB0csOtIHbhu5tpIHBhdHRlcm4gbsOgeSlcbiAgICogMi4gc3ludGF4VHJlZSBjaG8gY8OhYyBs4buXaSB0aOG7sWMgc+G7sSBraMOhYywgYuG7jyBxdWEgdsO5bmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSB0cmFpbGluZyBkb3RcbiAgICovXG4gIGNyZWF0ZUpzTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuICAgICAgY29uc3QgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG5cbiAgICAgIC8vIFBhc3MgMTogVGV4dC1iYXNlZCB0cmFpbGluZyBkb3QgZGV0ZWN0aW9uIOKAlCDEkeG6t3QgZGlhZ25vc3RpYyDEkcO6bmcgdOG6oWkgduG7iyB0csOtIGThuqV1IGNo4bqlbVxuICAgICAgY29uc3QgdHJhaWxpbmdEb3RMaW5lcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgZm9yIChsZXQgbGluZU51bSA9IDE7IGxpbmVOdW0gPD0gZG9jLmxpbmVzOyBsaW5lTnVtKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvYy5saW5lKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50ZXh0LnRyaW1FbmQoKTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvKFxcdyspXFwuXFxzKiQvLmV4ZWModHJpbW1lZCk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICAgIHRyYWlsaW5nRG90TGluZXMuYWRkKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCBkb3RQb3MgPSBsaW5lLmZyb20gKyB0cmltbWVkLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IGRvdFBvcyxcbiAgICAgICAgICB0bzogZG90UG9zICsgMSxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgSW5jb21wbGV0ZSBwcm9wZXJ0eSBhY2Nlc3Mgb24gXCIke21hdGNoWzFdfVwiYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIMSQw6FuaCBk4bqldSBjw6FjIGTDsm5nIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgdHJhaWxpbmcgZG90ICh0cmFpbGluZy1kb3QgbGluZSArIDQgZMOybmcgdGnhur9wIHRoZW8pXG4gICAgICAvLyDEkeG7gyBs4buNYyBjYXNjYWRpbmcgZXJyb3JzIHThu6sgc3ludGF4VHJlZVxuICAgICAgY29uc3QgdGFpbnRlZExpbmVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmVOdW0gb2YgdHJhaWxpbmdEb3RMaW5lcykge1xuICAgICAgICBmb3IgKGxldCBpID0gbGluZU51bTsgaSA8PSBNYXRoLm1pbihsaW5lTnVtICsgNCwgZG9jLmxpbmVzKTsgaSsrKSB7XG4gICAgICAgICAgdGFpbnRlZExpbmVzLmFkZChpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIDI6IHN5bnRheFRyZWUgY2hvIGPDoWMgbOG7l2kga2jDoWMgKGNo4buJIG5vbi1lbXB0eSByYW5nZSwgYuG7jyBxdWEgdsO5bmcgdGFpbnRlZClcbiAgICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgdHJlZS5pdGVyYXRlKHtcbiAgICAgICAgZW50ZXI6IChub2RlOiBTeW50YXhOb2RlUmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFub2RlLnR5cGUuaXNFcnJvcikgcmV0dXJuO1xuICAgICAgICAgIGlmIChub2RlLmZyb20gPT09IG5vZGUudG8pIHJldHVybjsgLy8gQuG7jyBxdWEgZW1wdHktcmFuZ2Ugbm9kZSAoY2FzY2FkaW5nIGVycm9yKVxuXG4gICAgICAgICAgY29uc3QgZXJyb3JMaW5lTnVtID0gZG9jLmxpbmVBdChub2RlLmZyb20pLm51bWJlcjtcbiAgICAgICAgICBpZiAodGFpbnRlZExpbmVzLmhhcyhlcnJvckxpbmVOdW0pKSByZXR1cm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb206IG5vZGUuZnJvbSxcbiAgICAgICAgICAgIHRvOiBNYXRoLm1pbihub2RlLnRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZEpzRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSnNFcnJvck1lc3NhZ2UoZG9jOiBUZXh0LCBub2RlOiBTeW50YXhOb2RlUmVmKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0ID0gZG9jLnNsaWNlU3RyaW5nKG5vZGUuZnJvbSwgbm9kZS50bykudHJpbSgpO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gYEphdmFTY3JpcHQgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuXG4gICAgY29uc3QgcHJldlRva2VuID0gdGhpcy5nZXRUb2tlbkJlZm9yZShkb2MsIG5vZGUuZnJvbSk7XG4gICAgaWYgKCFwcmV2VG9rZW4pIHJldHVybiAnSmF2YVNjcmlwdCBzeW50YXggZXJyb3InO1xuICAgIGlmIChwcmV2VG9rZW4uZW5kc1dpdGgoJygnKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCIpXCInO1xuICAgIGlmIChwcmV2VG9rZW4uZW5kc1dpdGgoJ1snKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuICAgIGlmICgvXmZ1bmN0aW9uJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIG9yIFwiKFwiJztcbiAgICBpZiAoL15yZXR1cm4kL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0ludmFsaWQgZXhwcmVzc2lvbiBhZnRlciBcInJldHVyblwiJztcbiAgICBpZiAoL149PiQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBib2R5IGFmdGVyIFwiPT5cIic7XG4gICAgaWYgKC9eY29uc3QkfF5sZXQkfF52YXIkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIG5hbWUnO1xuXG4gICAgcmV0dXJuIGBKYXZhU2NyaXB0IHN5bnRheCBlcnJvciBuZWFyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIEpTT04gbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEpTT04ucGFyc2UgxJHhu4MgdmFsaWRhdGVcbiAgICovXG4gIGNyZWF0ZUpzb25MaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBnZXQoZXJyLCAnbWVzc2FnZScsICcnKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFNRTCBsaW50ZXJcbiAgICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogTWF0aC5tYXgoMCwgbm9kZS5mcm9tIC0gMSksXG4gICAgICAgICAgICB0bzogbm9kZS5mcm9tLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYzogVGV4dCwgbm9kZTogU3ludGF4Tm9kZVJlZik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuZnJvbSAhPT0gbm9kZS50bykge1xuICAgICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhub2RlLmZyb20sIG5vZGUudG8pO1xuICAgICAgcmV0dXJuIGBTUUwgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnU1FMIHN5bnRheCBlcnJvciBhdCBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50JztcbiAgICB9XG5cbiAgICBpZiAoL0ZST00kL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIHRhYmxlIG5hbWUgYWZ0ZXIgRlJPTSc7XG4gICAgfVxuXG4gICAgaWYgKC9TRUxFQ1QkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbHVtbiBsaXN0IGFmdGVyIFNFTEVDVCc7XG4gICAgfVxuXG4gICAgaWYgKC9XSEVSRSQvaS50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnRXhwZWN0ZWQgY29uZGl0aW9uIGFmdGVyIFdIRVJFJztcbiAgICB9XG5cbiAgICBpZiAocHJldlRva2VuLmVuZHNXaXRoKCcoJykpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICB9XG5cbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgZW5kIG9mIFNRTCBhZnRlciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5CZWZvcmUoZG9jOiBUZXh0LCBwb3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBwb3MgLSAzMCk7XG4gICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhzdGFydCwgcG9zKTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyhcXFMrKVxccyokLy5leGVjKHRleHQpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFB5dGhvbiBsaW50ZXIgZOG7sWEgdHLDqm4gc3ludGF4VHJlZSBwYXJzZSBlcnJvciDigJQgY8O5bmcgYXBwcm9hY2ggduG7m2kgU1FMIGxpbnRlci5cbiAgICogUGjDoXQgaGnhu4duIGzhu5dpIGPDuiBwaMOhcCBtw6AgQ29kZU1pcnJvciBQeXRob24gcGFyc2VyIMSRw6FuaCBk4bqldSBsw6AgZXJyb3Igbm9kZS5cbiAgICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBub2RlLmZyb20gLSAxKTtcbiAgICAgICAgICBjb25zdCB0byA9IG5vZGUuZnJvbSA9PT0gbm9kZS50byA/IG5vZGUuZnJvbSArIDEgOiBub2RlLnRvO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKHRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgICBjb25zdCB0ZXh0U3VmZml4ID0gdGV4dCA/IGAgbmVhciBcIiR7dGV4dH1cImAgOiAnJztcbiAgICAgIHJldHVybiBgUHl0aG9uIHN5bnRheCBlcnJvciR7dGV4dFN1ZmZpeH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnUHl0aG9uIHN5bnRheCBlcnJvcic7XG4gICAgfVxuXG4gICAgaWYgKC9eZGVmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIGFmdGVyIFwiZGVmXCInO1xuICAgIGlmICgvXmNsYXNzJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjbGFzcyBuYW1lIGFmdGVyIFwiY2xhc3NcIic7XG4gICAgaWYgKC9ecmV0dXJuJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdJbnZhbGlkIGV4cHJlc3Npb24gYWZ0ZXIgXCJyZXR1cm5cIic7XG4gICAgaWYgKC9eaW1wb3J0JC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBtb2R1bGUgbmFtZSBhZnRlciBcImltcG9ydFwiJztcbiAgICBpZiAoL15mcm9tJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBtb2R1bGUgbmFtZSBhZnRlciBcImZyb21cIic7XG4gICAgaWYgKC9eaWYkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcImlmXCInO1xuICAgIGlmICgvXmVsaWYkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcImVsaWZcIic7XG4gICAgaWYgKC9ed2hpbGUkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcIndoaWxlXCInO1xuICAgIGlmICgvXmZvciQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgdmFyaWFibGUgYWZ0ZXIgXCJmb3JcIic7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnLicpKSByZXR1cm4gYEluY29tcGxldGUgYXR0cmlidXRlIGFjY2VzcyBvbiBcIiR7cHJldlRva2VuLnNsaWNlKDAsIC0xKX1cImA7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnKCcpKSByZXR1cm4gJ01pc3NpbmcgY2xvc2luZyBcIilcIic7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnWycpKSByZXR1cm4gJ01pc3NpbmcgY2xvc2luZyBcIl1cIic7XG5cbiAgICByZXR1cm4gYFB5dGhvbiBzeW50YXggZXJyb3IgbmVhciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBDb2RlTWlycm9yIGV4dGVuc2lvbiBjaG8gY3VzdG9tIGNvbXBsZXRpb25zIHThu6sgZGFuaCBzw6FjaCBpbnB1dC5cbiAgICogSOG7lyB0cuG7oyAyIGNo4bq/IMSR4buZOlxuICAgKiAxLiBHw7UgdMOqbiBiaeG6v24g4oaSIGfhu6NpIMO9IHRvcC1sZXZlbCBpdGVtc1xuICAgKiAyLiBHw7UgYG9iai5gIOKGkiBn4bujaSDDvSBwcm9wZXJ0aWVzIGPhu6dhIG9ialxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZENvbXBsZXRpb25FeHRlbnNpb24oaXRlbXM6IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKTogRXh0ZW5zaW9uIHtcbiAgICBjb25zdCBjb21wbGV0aW9uU291cmNlID0gKGNvbnRleHQ6IENvbXBsZXRpb25Db250ZXh0KTogQ29tcGxldGlvblJlc3VsdCB8IG51bGwgPT4ge1xuICAgICAgLy8gQ2jhur8gxJHhu5kgZG90LW5vdGF0aW9uOiBnw7UgXCJvYmoucHJvcFwiIOKGkiBn4bujaSDDvSBwcm9wZXJ0aWVzIGPhu6dhIG9ialxuICAgICAgY29uc3QgZG90TWF0Y2ggPSBjb250ZXh0Lm1hdGNoQmVmb3JlKC9cXHcrXFwuXFx3Ki8pO1xuICAgICAgaWYgKGRvdE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRvdFBvcyA9IGRvdE1hdGNoLnRleHQuaW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBvYmplY3ROYW1lID0gZG90TWF0Y2gudGV4dC5zbGljZSgwLCBkb3RQb3MpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBpdGVtcy5maW5kKChpKSA9PiBpLmxhYmVsID09PSBvYmplY3ROYW1lKTtcbiAgICAgICAgaWYgKHBhcmVudD8ucHJvcGVydGllcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZyb206IGRvdE1hdGNoLmZyb20gKyBkb3RQb3MgKyAxLFxuICAgICAgICAgICAgb3B0aW9uczogcGFyZW50LnByb3BlcnRpZXMubWFwKChwKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogcC5sYWJlbCxcbiAgICAgICAgICAgICAgdHlwZTogcC50eXBlID8/ICdwcm9wZXJ0eScsXG4gICAgICAgICAgICAgIGRldGFpbDogcC5kZXRhaWwgPz8gJycsXG4gICAgICAgICAgICAgIGluZm86IHAuaW5mbyA/PyAnJyxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENo4bq/IMSR4buZIHRvcC1sZXZlbDogZ+G7o2kgw70gdMOqbiBiaeG6v24vb2JqZWN0IGtoaSBnw7Uga8O9IHThu7FcbiAgICAgIGNvbnN0IHdvcmQgPSBjb250ZXh0Lm1hdGNoQmVmb3JlKC9cXHcqLyk7XG4gICAgICBpZiAoIXdvcmQgfHwgKHdvcmQuZnJvbSA9PT0gd29yZC50byAmJiAhY29udGV4dC5leHBsaWNpdCkpIHJldHVybiBudWxsO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiB3b3JkLmZyb20sXG4gICAgICAgIG9wdGlvbnM6IGl0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICB0eXBlOiBpdGVtLnR5cGUgPz8gJ3ZhcmlhYmxlJyxcbiAgICAgICAgICBkZXRhaWw6IGl0ZW0uZGV0YWlsID8/ICcnLFxuICAgICAgICAgIGluZm86IGl0ZW0uaW5mbyA/PyAnJyxcbiAgICAgICAgfSkpLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF1dG9jb21wbGV0aW9uKHsgb3ZlcnJpZGU6IFtjb21wbGV0aW9uU291cmNlXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBleHRlbnNpb24gYuG6o28gbeG6rXQgZ+G7k20gMiBsYXllcjpcbiAgICogMS4gTGludGVyOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSBtYXRjaCArIGVtaXQgb3V0VmlvbGF0aW9uc1xuICAgKiAyLiBUcmFuc2FjdGlvbiBmaWx0ZXI6IGNo4bq3biBwYXN0ZSBu4bq/dSBu4buZaSBkdW5nIHBhc3RlIGNo4bupYSBwYXR0ZXJuIGPhuqVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uKHBhdHRlcm5zOiBUX0ZvcmJpZGRlblBhdHRlcm5bXSk6IEV4dGVuc2lvbiB7XG4gICAgY29uc3QgdG9HbG9iYWxSZWdleCA9IChwOiBUX0ZvcmJpZGRlblBhdHRlcm4pOiBSZWdFeHAgPT4ge1xuICAgICAgaWYgKHAgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBwLmZsYWdzLmluY2x1ZGVzKCdnJykgPyBwLmZsYWdzIDogYCR7cC5mbGFnc31nYDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocC5zb3VyY2UsIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgocCksICdnaScpO1xuICAgIH07XG5cbiAgICBjb25zdCBmb3JiaWRkZW5MaW50ZXIgPSBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IElQcmV2aWV3VGV4dERhdGFWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcblxuICAgICAgLy8gQnVpbGQgYSBTZXQgb2YgY29tbWVudCByYW5nZXMgdOG7qyBBU1QgxJHhu4Mgc2tpcCBtYXRjaCBu4bqxbSB0cm9uZyBjb21tZW50XG4gICAgICBjb25zdCBjb21tZW50UmFuZ2VzOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9W10gPSBbXTtcbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb21tZW50JykpIHtcbiAgICAgICAgICAgIGNvbW1lbnRSYW5nZXMucHVzaCh7IGZyb206IG5vZGUuZnJvbSwgdG86IG5vZGUudG8gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlzSW5Db21tZW50ID0gKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4gPT4gY29tbWVudFJhbmdlcy5zb21lKChyKSA9PiBmcm9tID49IHIuZnJvbSAmJiB0byA8PSByLnRvKTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IHJlID0gdG9HbG9iYWxSZWdleChwYXR0ZXJuKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZyb20gPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICBjb25zdCB0byA9IGZyb20gKyBtYXRjaFswXS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAoaXNJbkNvbW1lbnQoZnJvbSwgdG8pKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSkubnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5MYWJlbCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHAgPyBwYXR0ZXJuLnNvdXJjZSA6IHBhdHRlcm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICB0byxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogYE3DoyBi4buLIGPhuqVtOiBcIiR7bWF0Y2hbMF19XCIg4oCUIHZpIHBo4bqhbSBjaMOtbmggc8OhY2ggYuG6o28gbeG6rXRgLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHsgZnJvbSwgdG8sIGxpbmUsIHBhdHRlcm46IHBhdHRlcm5MYWJlbCwgbWF0Y2hlZDogbWF0Y2hbMF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG5cbiAgICAvLyBDaOG6t24gcGFzdGUgbuG6v3UgbuG7mWkgZHVuZyBwYXN0ZSBjaOG7qWEgYuG6pXQga+G7syBwYXR0ZXJuIGPhuqVtIG7DoG9cbiAgICBjb25zdCBwYXN0ZUZpbHRlciA9IEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKCh0cjogVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCkgcmV0dXJuIHRyO1xuICAgICAgaWYgKCF0ci5hbm5vdGF0aW9uKFRyYW5zYWN0aW9uLnVzZXJFdmVudCk/LnN0YXJ0c1dpdGgoJ2lucHV0LnBhc3RlJykpIHJldHVybiB0cjtcblxuICAgICAgY29uc3QgbmV3VGV4dCA9IHRyLm5ld0RvYy50b1N0cmluZygpO1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IHJlID0gdG9HbG9iYWxSZWdleChwYXR0ZXJuKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKHJlLnRlc3QobmV3VGV4dCkpIHJldHVybiBbXTsgLy8gW10gPSBibG9jayB0cmFuc2FjdGlvblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtmb3JiaWRkZW5MaW50ZXIsIHBhc3RlRmlsdGVyXTtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBNRVRIT0RTIC0gRXZlbnQgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNvcHkoKTogdm9pZCB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250ZW50KCkgfHwgJycpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0SW5mbygnU2FvIGNow6lwIHRow6BuaCBjw7RuZycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaW5lV3JhcCgpOiB2b2lkIHtcbiAgICAvLyBM4bqleSBu4buZaSBkdW5nIG3hu5tpIG5o4bqldCB04burIGVkaXRvciBzYXUga2hpIMSRw6MgeMOzYSBuZXdsaW5lc1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LnN0YXRlLmRvYy50b1N0cmluZygpIHx8ICcnO1xuICAgIGlmICh0aGlzLmlzV3JhcCgpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcC5zZXQoY3VycmVudENvbnRlbnQpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHRoaXMuaXNXcmFwKCkgJiYgY3VycmVudENvbnRlbnQgPyBjdXJyZW50Q29udGVudC5yZXBsYWNlKC9cXG4vZywgJyAnKSA6IHRoaXMuY29udGVudFN0YXRlTm9XcmFwKCk7XG4gICAgdGhpcy5pc1dyYXAudXBkYXRlKCh2YWwpID0+ICF2YWwpO1xuXG4gICAgaWYgKGN1cnJlbnRDb250ZW50ICE9PSB1cGRhdGVkQ29udGVudCkge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlczogeyBmcm9tOiAwLCB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLCBpbnNlcnQ6IHVwZGF0ZWRDb250ZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCYXRjaCBj4bqjIDIgZGlzcGF0Y2ggdGjDoG5oIDEgxJHhu4MgdOG7kWkgxrB1IHBlcmZvcm1hbmNlXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLndyYXBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgOiBbXSksIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKHRoaXMuaXNXcmFwKCkgPyBsaW5lTnVtYmVycygpIDogW10pXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZGF0YT8ua2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TGFuZyA9IGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KG5ld0xhbmcpO1xuXG4gICAgLy8gTG9hZCBsYW5ndWFnZSB2w6AgbGludGVyIG3hu5tpXG4gICAgY29uc3QgW2xhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKG5ld0xhbmcpLCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24obmV3TGFuZyldKTtcblxuICAgIC8vIFJlY29uZmlndXJlIHRoYXkgdsOsIHThuqFvIG3hu5tpIHN0YXRlIMSR4buDIGdp4buvIGzhuqFpIGRvY3VtZW50IGNvbnRlbnRcbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogW3RoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZUV4dGVuc2lvbiksIHRoaXMubGludGVyQ29tcGFydG1lbnQucmVjb25maWd1cmUobGludGVyRXh0ZW5zaW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgY29udGV4dENoYW5nZTogJ2xhbmd1YWdlJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktcHJldmlldy1kYXRhLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWF1dG8gcm91bmRlZC1bOHB4XSBsaWJzLXVpLWJvcmRlci1nZW5lcmFsIHB4LVs4cHhdXCJcbiAgW3N0eWxlLi0tYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kKClcIlxuICBbY2xhc3MucHQtWzhweF1dPVwiIWhpZGRlbkFjdGlvbigpXCI+XG4gIEBpZiAoIWhpZGRlbkFjdGlvbigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtYmV0d2VlbiBjb2xvci1bIzZhNzM4M11cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgY2xhc3NJbmNsdWRlPVwidy1bMjAwcHhdXCJcbiAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcoKVwiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
|
|
358
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVB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MnlFQzVCckQsMjZEQTBDQSxvM0JEaEJZLGlDQUFpQyx1M0RBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEV4dGVuc2lvbiwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcsIGxpbmVOdW1iZXJzLCBWaWV3VXBkYXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgY29tcHV0ZUpzRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanMtbGludGVyJztcbmltcG9ydCB7IGNvbXB1dGVKc29uRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanNvbi1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVNxbERpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3NxbC1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3B5dGhvbi1saW50ZXInO1xuaW1wb3J0IHsgYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWNvbXBsZXRpb25zJztcbmltcG9ydCB7IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWZvcmJpZGRlbic7XG5pbXBvcnQgeyBhcHBseU1heEhlaWdodCwgYXBwbHlNaW5MaW5lcyB9IGZyb20gJy4vZWRpdG9yL2VkaXRvci1oZWlnaHQnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtLCBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBsZXRpb25zQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JiaWRkZW5Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFN0YXRlTm9XcmFwID0gc2lnbmFsKCcnKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NDaGFuZ2VMYWJlbCA9IGlucHV0PElMYW5ndWFnZU9wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgdGhp4buDdTogbuG6v3UgY29udGVudCDDrXQgZMOybmcgaMahbiBz4bq9IHThu7EgYsO5IGTDsm5nIHRy4buRbmcgKHjhu60gbMO9IDEgbOG6p24ga2hpIGto4bufaSB04bqhbyBlZGl0b3IpLiBC4buPIHRy4buRbmcgPSBraMO0bmcgYsO5LiAqL1xuICByZWFkb25seSBtaW5MaW5lcyA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgxJFhOiB2xrDhu6N0IHF1w6EgZWRpdG9yIHPhur0gZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIHbDoCB4deG6pXQgaGnhu4duIHbDuW5nIGN14buZbiAoeOG7rSBsw70gMSBs4bqnbiBraGkga2jhu59pIHThuqFvIGVkaXRvcikuIELhu48gdHLhu5FuZyA9IGtow7RuZyBnaeG7m2kgaOG6oW4uICovXG4gIHJlYWRvbmx5IG1heExpbmVzID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xuICAvKipcbiAgICogRWxlbWVudCBjb250YWluZXIgYsOqbiBuZ2/DoGkgxJHhu4MgZWRpdG9yIHThu7EgdMOtbmggY2hp4buBdSBjYW8gdGhlbyBgbWluLWhlaWdodGAvYG1heC1oZWlnaHRgIChDU1MpIGPhu6dhIG7Dsy5cbiAgICogS2hpIHRydXnhu4FuLCBlZGl0b3IgxJHhu41jIG1pbi9tYXgtaGVpZ2h0IGPhu6dhIGNvbnRhaW5lciwgdHLhu6sgcGjhuqduIGhlYWRlci90b29sYmFyIHBow61hIHRyw6puLCBy4buTaSBzbmFwXG4gICAqIGNoaeG7gXUgY2FvIHbDuW5nIGN14buZbiB24buBIMSRw7puZyBi4buZaSBz4buRIGTDsm5nIChraMO0bmcgY+G6r3QgbuG7rWEgZMOybmcpICsgYuG6rXQgc2Nyb2xsIGtoaSB2xrDhu6N0IG1heC5cbiAgICogQ+G6pE0gY+G6pXUgaMOsbmggxJHhu5NuZyB0aOG7nWkgduG7m2kgYG1pbkxpbmVzYC9gbWF4TGluZXNgIChz4bq9IHRocm93IGzhu5dpKSDigJQgY29udGFpbmVyIHThu7EgcXXhuqNuIGzDvSBtaW4vbWF4LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWxlbWVudCA9IGlucHV0PEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkPigpO1xuICAvKiogei1pbmRleCBjaG8gcG9wb3ZlciBkcm9wZG93biBjaOG7jW4gbmfDtG4gbmfhu68uICovXG4gIHJlYWRvbmx5IHpJbmRleFBvcG92ZXIgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggxJHhu5FpIHTGsOG7o25nL2Jp4bq/biBn4bujaSDDvSBraGkgZ8O1IOKAlCBnaeG7kW5nIEludGVsbGlTZW5zZSB0cm9uZyBJREUuXG4gICAqIEjhu5cgdHLhu6MgZG90LW5vdGF0aW9uOiDEkeG7i25oIG5naMSpYSBgcHJvcGVydGllc2AgxJHhu4MgZ+G7o2kgw70gc2F1IGThuqV1IGAuYFxuICAgKiBAZXhhbXBsZVxuICAgKiBbY29tcGxldGlvbnNdPVwiW3sgbGFiZWw6ICd1c2VyJywgcHJvcGVydGllczogW3sgbGFiZWw6ICduYW1lJywgZGV0YWlsOiAnc3RyaW5nJyB9XSB9XVwiXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IGlucHV0PElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdLCBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggcGF0dGVybiBj4bqlbSDigJQgY2h14buXaSBsaXRlcmFsIGhv4bq3YyBSZWdFeHAuXG4gICAqIEtoaSBwaMOhdCBoaeG7h24gdmkgcGjhuqFtOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSArIGNo4bq3biBwYXN0ZSArIGVtaXQgYChvdXRWaW9sYXRpb25zKWAuXG4gICAqIETDuW5nIGBERUZBVUxUX1NFQ1VSSVRZX1BBVFRFUk5TYCDEkeG7gyDDoXAgZOG7pW5nIGLhu5kgcXV5IHThuq9jIGLhuqNvIG3huq10IG3hurdjIMSR4buLbmggY2hvIGxvdy1jb2RlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiZGVmYXVsdFNlY3VyaXR5UGF0dGVybnNcIlxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiWy9ldmFsXFxzKlxcKC8sICdsb2NhbFN0b3JhZ2UnXVwiXG4gICAqL1xuICByZWFkb25seSBmb3JiaWRkZW5QYXR0ZXJucyA9IGlucHV0PFRfRm9yYmlkZGVuUGF0dGVybltdLCBUX0ZvcmJpZGRlblBhdHRlcm5bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IFRfRm9yYmlkZGVuUGF0dGVybltdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG4gIHJlYWRvbmx5IG91dFZpb2xhdGlvbnMgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbltdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFZmZlY3QgxJHhu4MgY+G6rXAgbmjhuq10IGN1c3RvbSBjb21wbGV0aW9ucyBraGkgaW5wdXQgdGhheSDEkeG7lWlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCB8fCAhdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHJldHVybjtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgZWZmZWN0czogdGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50LnJlY29uZmlndXJlKGl0ZW1zLmxlbmd0aCA/IGJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpdGVtcykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCDEkeG7gyBj4bqtcCBuaOG6rXQgZm9yYmlkZGVuIHBhdHRlcm5zIGtoaSBpbnB1dCB0aGF5IMSR4buVaVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkIHx8ICF0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICBlZmZlY3RzOiB0aGlzLmZvcmJpZGRlbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKHBhdHRlcm5zLmxlbmd0aCA/IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uKHBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpLCB0aGlzLmxhbmdzQ2hhbmdlTGFiZWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IGFwcGx5TWluTGluZXModGhpcy5jb250ZW50KCksIHRoaXMubWluTGluZXMoKSksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gICAgYXBwbHlNYXhIZWlnaHQodGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UsIHsgbWluTGluZXM6IHRoaXMubWluTGluZXMoKSwgbWF4TGluZXM6IHRoaXMubWF4TGluZXMoKSwgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBkYW5oIHPDoWNoIGV4dGVuc2lvbnMgY2hvIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uOiBFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbjogRXh0ZW5zaW9uKTogRXh0ZW5zaW9uW10ge1xuICAgIGNvbnN0IGluaXRpYWxDb21wbGV0aW9ucyA9IHRoaXMuY29tcGxldGlvbnMoKTtcbiAgICBjb25zdCBpbml0aWFsUGF0dGVybnMgPSB0aGlzLmZvcmJpZGRlblBhdHRlcm5zKCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhc2ljU2V0dXAsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YobGFuZ3VhZ2VFeHRlbnNpb24pLFxuICAgICAgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5vZihsaW50ZXJFeHRlbnNpb24pLFxuICAgICAgLy8gQ29tcGFydG1lbnQgY2hvIGN1c3RvbSBjb21wbGV0aW9ucyDigJQgUHJlYy5oaWdoZXN0IMSR4buDIG92ZXJyaWRlIGJhc2ljU2V0dXAncyBhdXRvY29tcGxldGlvblxuICAgICAgUHJlYy5oaWdoZXN0KHRoaXMuY29tcGxldGlvbnNDb21wYXJ0bWVudC5vZihpbml0aWFsQ29tcGxldGlvbnMubGVuZ3RoID8gYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGluaXRpYWxDb21wbGV0aW9ucykgOiBbXSkpLFxuICAgICAgdGhpcy5mb3JiaWRkZW5Db21wYXJ0bWVudC5vZihpbml0aWFsUGF0dGVybnMubGVuZ3RoID8gYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24oaW5pdGlhbFBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgLSBMaW50ZXIgZmFjdG9yaWVzICjEkcaw4bujYyBn4buNaSB04burIHJlZ2lzdHJ5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgLyoqIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBsaW50ZXIg4oCUIHBpcGVsaW5lIHRyb25nIGBsaW50ZXJzL2pzLWxpbnRlci50c2AgKGJhYmVsICsgdHJhaWxpbmctZG90ICsgdGhp4bq/dSBgO2AgKyBiaeG6v24gY2jGsGEga2hhaSBiw6FvKS4gKi9cbiAgY3JlYXRlSnNMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKGFzeW5jICh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGNvbXB1dGVKc0RpYWdub3N0aWNzKHZpZXcuc3RhdGUuZG9jLCB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpLCBuZXcgU2V0KHRoaXMuY29tcGxldGlvbnMoKS5tYXAoKGl0ZW0pID0+IGl0ZW0ubGFiZWwpKSk7XG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU09OIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvanNvbi1saW50ZXIudHNgLiAqL1xuICBjcmVhdGVKc29uTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSBjb21wdXRlSnNvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU1FMIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvc3FsLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVNxbERpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHl0aG9uIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvcHl0aG9uLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBpZiAodGhpcy5pc1dyYXAoKSkge1xuICAgICAgdGhpcy5jb250ZW50U3RhdGVOb1dyYXAuc2V0KGN1cnJlbnRDb250ZW50KTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEtleShkYXRhPzogSUVtaXRTZWxlY3RLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWRhdGE/LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xhbmcgPSBkYXRhLmtleSBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUO1xuICAgIHRoaXMubGFuZ1NlbGVjdGVkLnNldChuZXdMYW5nKTtcblxuICAgIC8vIExvYWQgbGFuZ3VhZ2UgdsOgIGxpbnRlciBt4bubaVxuICAgIGNvbnN0IFtsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbihuZXdMYW5nKSwgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKG5ld0xhbmcpXSk7XG5cbiAgICAvLyBSZWNvbmZpZ3VyZSB0aGF5IHbDrCB04bqhbyBt4bubaSBzdGF0ZSDEkeG7gyBnaeG7ryBs4bqhaSBkb2N1bWVudCBjb250ZW50XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQucmVjb25maWd1cmUobGFuZ3VhZ2VFeHRlbnNpb24pLCB0aGlzLmxpbnRlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxpbnRlckV4dGVuc2lvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbekluZGV4XT1cInpJbmRleFBvcG92ZXIoKVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
|