@libs-ui/components-preview-text-data 0.2.356-3 → 0.2.356-30

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.
@@ -1,7 +1,8 @@
1
1
  import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, viewChild } from '@angular/core';
2
+ import { autocompletion } from '@codemirror/autocomplete';
2
3
  import { syntaxTree } from '@codemirror/language';
3
4
  import { linter, lintGutter } from '@codemirror/lint';
4
- import { Compartment } from '@codemirror/state';
5
+ import { Compartment, EditorState, Prec, Transaction } from '@codemirror/state';
5
6
  import { EditorView, lineNumbers } from '@codemirror/view';
6
7
  import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
7
8
  import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
@@ -19,6 +20,8 @@ export class LibsUiComponentsPreviewTextDataComponent {
19
20
  languageCompartment = new Compartment();
20
21
  lineNumberCompartment = new Compartment();
21
22
  linterCompartment = new Compartment();
23
+ completionsCompartment = new Compartment();
24
+ forbiddenCompartment = new Compartment();
22
25
  contentStateNoWrap = signal('');
23
26
  /** Cache để tránh load lại language đã load */
24
27
  languageCache = new Map();
@@ -54,6 +57,26 @@ export class LibsUiComponentsPreviewTextDataComponent {
54
57
  lintIgnorePatterns = input(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {
55
58
  transform: (value) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],
56
59
  });
60
+ /**
61
+ * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.
62
+ * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`
63
+ * @example
64
+ * [completions]="[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]"
65
+ */
66
+ completions = input([], {
67
+ transform: (value) => value ?? [],
68
+ });
69
+ /**
70
+ * Danh sách pattern cấm — chuỗi literal hoặc RegExp.
71
+ * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.
72
+ * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.
73
+ * @example
74
+ * [forbiddenPatterns]="defaultSecurityPatterns"
75
+ * [forbiddenPatterns]="[/eval\s*\(/, 'localStorage']"
76
+ */
77
+ forbiddenPatterns = input([], {
78
+ transform: (value) => value ?? [],
79
+ });
57
80
  background = input('#f8f9fa', {
58
81
  transform: (value) => value ?? '#f8f9fa',
59
82
  });
@@ -62,6 +85,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
62
85
  // ==========================================================================
63
86
  outChange = output();
64
87
  syntaxErrors = output();
88
+ outViolations = output();
65
89
  // ==========================================================================
66
90
  // VIEW CHILDREN
67
91
  // ==========================================================================
@@ -86,6 +110,24 @@ export class LibsUiComponentsPreviewTextDataComponent {
86
110
  }
87
111
  }
88
112
  });
113
+ // Effect để cập nhật custom completions khi input thay đổi
114
+ effect(() => {
115
+ const items = this.completions();
116
+ if (!this.isInitialized || !this.editorViewInstance)
117
+ return;
118
+ this.editorViewInstance.dispatch({
119
+ effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),
120
+ });
121
+ });
122
+ // Effect để cập nhật forbidden patterns khi input thay đổi
123
+ effect(() => {
124
+ const patterns = this.forbiddenPatterns();
125
+ if (!this.isInitialized || !this.editorViewInstance)
126
+ return;
127
+ this.editorViewInstance.dispatch({
128
+ effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),
129
+ });
130
+ });
89
131
  // Cleanup khi component bị destroy
90
132
  this.destroyRef.onDestroy(() => {
91
133
  this.editorViewInstance?.destroy();
@@ -124,10 +166,15 @@ export class LibsUiComponentsPreviewTextDataComponent {
124
166
  * Tạo danh sách extensions cho editor
125
167
  */
126
168
  createExtensions(languageExtension, linterExtension) {
169
+ const initialCompletions = this.completions();
170
+ const initialPatterns = this.forbiddenPatterns();
127
171
  return [
128
172
  basicSetup,
129
173
  this.languageCompartment.of(languageExtension),
130
174
  this.linterCompartment.of(linterExtension),
175
+ // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion
176
+ Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),
177
+ this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),
131
178
  this.createLightTheme(),
132
179
  EditorView.editable.of(this.editable()),
133
180
  this.wrapCompartment.of(EditorView.lineWrapping),
@@ -208,32 +255,83 @@ export class LibsUiComponentsPreviewTextDataComponent {
208
255
  // PUBLIC METHODS - Linter factories (được gọi từ registry)
209
256
  // ==========================================================================
210
257
  /**
211
- * Tạo JavaScript linter
212
- * Sử dụng Function constructor để validate syntax
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
213
261
  */
214
262
  createJsLinter() {
215
263
  return linter((view) => {
216
- const text = view.state.doc.toString();
217
264
  const diagnostics = [];
218
- try {
219
- new Function(text);
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 = trimmed.match(/(\w+)\.\s*$/);
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
+ });
220
282
  }
221
- catch (err) {
222
- const message = get(err, 'message', '');
223
- const shouldIgnore = this.lintIgnorePatterns().some((pattern) => message.includes(pattern));
224
- if (!shouldIgnore) {
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;
225
302
  diagnostics.push({
226
- from: 0,
227
- to: text.length,
303
+ from: node.from,
304
+ to: Math.min(node.to, doc.length),
228
305
  severity: 'error',
229
- message,
306
+ message: this.buildJsErrorMessage(doc, node),
230
307
  });
231
- this.syntaxErrors.emit(diagnostics);
232
- }
233
- }
308
+ },
309
+ });
310
+ this.syntaxErrors.emit(diagnostics);
234
311
  return diagnostics;
235
312
  });
236
313
  }
314
+ buildJsErrorMessage(doc, node) {
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 (/\($/.test(prevToken))
322
+ return 'Missing closing ")"';
323
+ if (/\[$/.test(prevToken))
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
+ }
237
335
  /**
238
336
  * Tạo JSON linter
239
337
  * Sử dụng JSON.parse để validate
@@ -310,6 +408,181 @@ export class LibsUiComponentsPreviewTextDataComponent {
310
408
  const match = text.match(/(\S+)\s*$/);
311
409
  return match?.[1] ?? '';
312
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
+ */
415
+ createPythonLinter() {
416
+ 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
+ });
434
+ this.syntaxErrors.emit(diagnostics);
435
+ return diagnostics;
436
+ });
437
+ }
438
+ buildPythonErrorMessage(doc, node) {
439
+ if (node.from !== node.to) {
440
+ const text = doc.sliceString(node.from, node.to).trim();
441
+ return `Python syntax error${text ? ` near "${text}"` : ''}`;
442
+ }
443
+ const prevToken = this.getTokenBefore(doc, node.from);
444
+ if (!prevToken) {
445
+ return 'Python syntax error';
446
+ }
447
+ if (/^def$/i.test(prevToken))
448
+ return 'Expected function name after "def"';
449
+ if (/^class$/i.test(prevToken))
450
+ return 'Expected class name after "class"';
451
+ if (/^return$/i.test(prevToken))
452
+ return 'Invalid expression after "return"';
453
+ if (/^import$/i.test(prevToken))
454
+ return 'Expected module name after "import"';
455
+ if (/^from$/i.test(prevToken))
456
+ return 'Expected module name after "from"';
457
+ if (/^if$/i.test(prevToken))
458
+ return 'Expected condition after "if"';
459
+ if (/^elif$/i.test(prevToken))
460
+ return 'Expected condition after "elif"';
461
+ if (/^while$/i.test(prevToken))
462
+ return 'Expected condition after "while"';
463
+ if (/^for$/i.test(prevToken))
464
+ return 'Expected variable after "for"';
465
+ if (/\.$/.test(prevToken))
466
+ return `Incomplete attribute access on "${prevToken.slice(0, -1)}"`;
467
+ if (/\($/.test(prevToken))
468
+ return 'Missing closing ")"';
469
+ if (/\[$/.test(prevToken))
470
+ return 'Missing closing "]"';
471
+ return `Python syntax error near "${prevToken}"`;
472
+ }
473
+ /**
474
+ * Tạo CodeMirror extension cho custom completions từ danh sách input.
475
+ * Hỗ trợ 2 chế độ:
476
+ * 1. Gõ tên biến → gợi ý top-level items
477
+ * 2. Gõ `obj.` → gợi ý properties của obj
478
+ */
479
+ buildCompletionExtension(items) {
480
+ const completionSource = (context) => {
481
+ // Chế độ dot-notation: gõ "obj.prop" → gợi ý properties của obj
482
+ const dotMatch = context.matchBefore(/\w+\.\w*/);
483
+ if (dotMatch) {
484
+ const dotPos = dotMatch.text.indexOf('.');
485
+ const objectName = dotMatch.text.slice(0, dotPos);
486
+ const parent = items.find((i) => i.label === objectName);
487
+ if (parent?.properties?.length) {
488
+ return {
489
+ from: dotMatch.from + dotPos + 1,
490
+ options: parent.properties.map((p) => ({
491
+ label: p.label,
492
+ type: p.type ?? 'property',
493
+ detail: p.detail ?? '',
494
+ info: p.info ?? '',
495
+ })),
496
+ };
497
+ }
498
+ }
499
+ // Chế độ top-level: gợi ý tên biến/object khi gõ ký tự
500
+ const word = context.matchBefore(/\w*/);
501
+ if (!word || (word.from === word.to && !context.explicit))
502
+ return null;
503
+ return {
504
+ from: word.from,
505
+ options: items.map((item) => ({
506
+ label: item.label,
507
+ type: item.type ?? 'variable',
508
+ detail: item.detail ?? '',
509
+ info: item.info ?? '',
510
+ })),
511
+ };
512
+ };
513
+ return autocompletion({ override: [completionSource] });
514
+ }
515
+ /**
516
+ * Tạo extension bảo mật gồm 2 layer:
517
+ * 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations
518
+ * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm
519
+ */
520
+ buildForbiddenExtension(patterns) {
521
+ const toGlobalRegex = (p) => {
522
+ if (p instanceof RegExp) {
523
+ const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;
524
+ return new RegExp(p.source, flags);
525
+ }
526
+ return new RegExp(this.escapeRegex(p), 'gi');
527
+ };
528
+ const forbiddenLinter = linter((view) => {
529
+ const diagnostics = [];
530
+ const violations = [];
531
+ const text = view.state.doc.toString();
532
+ const tree = syntaxTree(view.state);
533
+ // Build a Set of comment ranges từ AST để skip match nằm trong comment
534
+ const commentRanges = [];
535
+ tree.iterate({
536
+ enter: (node) => {
537
+ if (node.type.name.toLowerCase().includes('comment')) {
538
+ commentRanges.push({ from: node.from, to: node.to });
539
+ }
540
+ },
541
+ });
542
+ const isInComment = (from, to) => commentRanges.some((r) => from >= r.from && to <= r.to);
543
+ for (const pattern of patterns) {
544
+ const re = toGlobalRegex(pattern);
545
+ re.lastIndex = 0;
546
+ let match;
547
+ while ((match = re.exec(text)) !== null) {
548
+ const from = match.index;
549
+ const to = from + match[0].length;
550
+ if (isInComment(from, to))
551
+ continue;
552
+ const line = view.state.doc.lineAt(from).number;
553
+ const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;
554
+ diagnostics.push({
555
+ from,
556
+ to,
557
+ severity: 'error',
558
+ message: `Mã bị cấm: "${match[0]}" — vi phạm chính sách bảo mật`,
559
+ });
560
+ violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });
561
+ }
562
+ }
563
+ this.outViolations.emit(violations);
564
+ return diagnostics;
565
+ });
566
+ // Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào
567
+ const pasteFilter = EditorState.transactionFilter.of((tr) => {
568
+ if (!tr.docChanged)
569
+ return tr;
570
+ if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste'))
571
+ return tr;
572
+ const newText = tr.newDoc.toString();
573
+ for (const pattern of patterns) {
574
+ const re = toGlobalRegex(pattern);
575
+ re.lastIndex = 0;
576
+ if (re.test(newText))
577
+ return []; // [] = block transaction
578
+ }
579
+ return tr;
580
+ });
581
+ return [forbiddenLinter, pasteFilter];
582
+ }
583
+ escapeRegex(str) {
584
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
585
+ }
313
586
  // ==========================================================================
314
587
  // PROTECTED METHODS - Event handlers
315
588
  // ==========================================================================
@@ -355,10 +628,10 @@ export class LibsUiComponentsPreviewTextDataComponent {
355
628
  });
356
629
  }
357
630
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
358
- 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 }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors" }, 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", "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 });
631
+ 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 });
359
632
  }
360
633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
361
634
  type: Component,
362
635
  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"] }]
363
636
  }], ctorParameters: () => [] });
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQWMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQW1CLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUV2RSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQWtCLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFB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QyxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9CLDhCQUE4QjtRQUM5QixNQUFNLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekksZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDeEgsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM3QixhQUFhLEVBQUUsVUFBVTtTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTNaVSx3Q0FBd0M7NEZBQXhDLHdDQUF3QywwN0NDeEJyRCxxNERBeUNBLG8zQkRuQlksaUNBQWlDLGkxREFBRSxzQ0FBc0M7OzRGQUV4RSx3Q0FBd0M7a0JBVHBELFNBQVM7K0JBRUUsc0NBQXNDLGNBR3BDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGlDQUFpQyxFQUFFLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEV4dGVuc2lvbiwgVGV4dCB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcsIGxpbmVOdW1iZXJzLCBWaWV3VXBkYXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IFN5bnRheE5vZGVSZWYgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBiYXNpY1NldHVwIH0gZnJvbSAnY29kZW1pcnJvcjYnO1xuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdExhbmd1YWdlLCBodHRwUmVxdWVzdENvbmZpZ0dldE9wdGlvbnNMYW5nLCBsYW5ndWFnZVJlZ2lzdHJ5LCBvcHRpb25zTGFuZ0RhdGEgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmRlZmluZSc7XG5pbXBvcnQgeyBJTGFuZ3VhZ2VPcHRpb25zLCBJUHJldmlld1RleHREYXRhQ2hhbmdlLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXByZXZpZXdfdGV4dF9kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZWRpdG9yVmlld0luc3RhbmNlPzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSByZWFkb25seSB3cmFwQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGluZU51bWJlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGludGVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSBjb250ZW50U3RhdGVOb1dyYXAgPSBzaWduYWwoJycpO1xuXG4gIC8qKiBDYWNoZSDEkeG7gyB0csOhbmggbG9hZCBs4bqhaSBsYW5ndWFnZSDEkcOjIGxvYWQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuc2lvbj4oKTtcblxuICAvKiogRmxhZyDEkeG7gyB0csOhbmggdXBkYXRlIGVkaXRvciBraGkgxJFhbmcga2jhu59pIHThuqFvICovXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOSkVDVEVEIFNFUlZJQ0VTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJPVEVDVEVEIFNJR05BTFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNXcmFwID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtPihodHRwUmVxdWVzdENvbmZpZ0dldE9wdGlvbnNMYW5nKHVuZGVmaW5lZCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFiZWxMYW5nID0gY29tcHV0ZWQoKCkgPT4gb3B0aW9uc0xhbmdEYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMubGFuZ1NlbGVjdGVkKCkpPy5sYWJlbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY2NlcHRDaGFuZ2VMYW5nID0gY29tcHV0ZWQoKCkgPT4gISh0aGlzLmxhbmdTZWxlY3RlZCgpICYmIHRoaXMubGFuZ3NBY2NlcHQoKT8ubGVuZ3RoID09PSAxICYmIHRoaXMubGFuZ3NBY2NlcHQoKT8uaW5jbHVkZXModGhpcy5sYW5nU2VsZWN0ZWQoKSkpKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTlBVVFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBjb250ZW50ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcnLFxuICB9KTtcblxuICByZWFkb25seSBsYW5nU2VsZWN0ZWQgPSBtb2RlbC5yZXF1aXJlZDxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPigpO1xuICByZWFkb25seSBsYW5nc0FjY2VwdCA9IGlucHV0PEFycmF5PFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBsYW5nc0NoYW5nZUxhYmVsID0gaW5wdXQ8SUxhbmd1YWdlT3B0aW9ucyB8IHVuZGVmaW5lZD4oKTtcblxuICByZWFkb25seSBlZGl0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGlkZGVuQWN0aW9uID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IGJvb2xlYW4pID0+IHZhbHVlID8/IGZhbHNlLFxuICB9KTtcblxuICByZWFkb25seSBsaW50SWdub3JlUGF0dGVybnMgPSBpbnB1dDxBcnJheTxzdHJpbmc+LCBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkPihbJ0Nhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudCBvdXRzaWRlIGEgbW9kdWxlJywgJ1VuZXhwZWN0ZWQgdG9rZW4gZXhwb3J0JywgJ2ltcG9ydCAnLCAnQGFuZ3VsYXIvY29yZSddLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBBcnJheTxzdHJpbmc+KSA9PiB2YWx1ZSA/PyBbJ0Nhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudCBvdXRzaWRlIGEgbW9kdWxlJywgJ1VuZXhwZWN0ZWQgdG9rZW4gZXhwb3J0JywgJ2ltcG9ydCAnLCAnQGFuZ3VsYXIvY29yZSddLFxuICB9KTtcblxuICByZWFkb25seSBiYWNrZ3JvdW5kID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcjZjhmOWZhJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnI2Y4ZjlmYScsXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE9VVFBVVFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBvdXRDaGFuZ2UgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YUNoYW5nZT4oKTtcbiAgcmVhZG9ubHkgc3ludGF4RXJyb3JzID0gb3V0cHV0PERpYWdub3N0aWNbXT4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWSUVXIENISUxEUkVOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJQcmV2aWV3ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyUHJldmlldycpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTlNUUlVDVE9SIC0gU2V0dXAgZWZmZWN0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVmZmVjdCDEkeG7gyBzeW5jIGNvbnRlbnQgdOG7qyBpbnB1dCB2w6BvIGVkaXRvclxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2Uuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgICAgICAgaW5zZXJ0OiBuZXdDb250ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYW51cCBraGkgY29tcG9uZW50IGLhu4sgZGVzdHJveVxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5jbGVhcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTElGRUNZQ0xFIEhPT0tTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGFuZ3NBY2NlcHQoKT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnLnNldChodHRwUmVxdWVzdENvbmZpZ0dldE9wdGlvbnNMYW5nKHRoaXMubGFuZ3NBY2NlcHQoKSwgdGhpcy5sYW5nc0NoYW5nZUxhYmVsKCkpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplRWRpdG9yKCk7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EUyAtIEVkaXRvciBpbml0aWFsaXphdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBLaOG7n2kgdOG6oW8gZWRpdG9yIHbhu5tpIGPDoWMgZXh0ZW5zaW9ucyBjxqEgYuG6o25cbiAgICogTGFuZ3VhZ2UgxJHGsOG7o2MgbG9hZCBhc3luYyDEkeG7gyB04buRaSDGsHUgYnVuZGxlIHNpemVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUVkaXRvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYW5ndWFnZUV4dGVuc2lvbiA9IGF3YWl0IHRoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxpbnRlckV4dGVuc2lvbiA9IGF3YWl0IHRoaXMubG9hZExpbnRlckV4dGVuc2lvbih0aGlzLmxhbmdTZWxlY3RlZCgpKTtcblxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlID0gbmV3IEVkaXRvclZpZXcoe1xuICAgICAgZG9jOiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIHBhcmVudDogdGhpcy5jb250YWluZXJQcmV2aWV3KCkubmF0aXZlRWxlbWVudCxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuY3JlYXRlRXh0ZW5zaW9ucyhsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBkYW5oIHPDoWNoIGV4dGVuc2lvbnMgY2hvIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uOiBFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbjogRXh0ZW5zaW9uKTogRXh0ZW5zaW9uW10ge1xuICAgIHJldHVybiBbXG4gICAgICBiYXNpY1NldHVwLFxuICAgICAgdGhpcy5sYW5ndWFnZUNvbXBhcnRtZW50Lm9mKGxhbmd1YWdlRXh0ZW5zaW9uKSxcbiAgICAgIHRoaXMubGludGVyQ29tcGFydG1lbnQub2YobGludGVyRXh0ZW5zaW9uKSxcbiAgICAgIHRoaXMuY3JlYXRlTGlnaHRUaGVtZSgpLFxuICAgICAgRWRpdG9yVmlldy5lZGl0YWJsZS5vZih0aGlzLmVkaXRhYmxlKCkpLFxuICAgICAgdGhpcy53cmFwQ29tcGFydG1lbnQub2YoRWRpdG9yVmlldy5saW5lV3JhcHBpbmcpLFxuICAgICAgdGhpcy5saW5lTnVtYmVyQ29tcGFydG1lbnQub2YobGluZU51bWJlcnMoKSksXG4gICAgICBsaW50R3V0dGVyKCksXG4gICAgICB0aGlzLmNyZWF0ZUJyYWNrZXRUaGVtZSgpLFxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVMaXN0ZW5lcigpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsYW5ndWFnZSBleHRlbnNpb24gduG7m2kgY2FjaGluZ1xuICAgKiBN4buXaSBsYW5ndWFnZSBjaOG7iSDEkcaw4bujYyBsb2FkIDEgbOG6p25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExhbmd1YWdlRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubGFuZ3VhZ2VDYWNoZS5nZXQobG93ZXJMYW5nKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcmVnaXN0cnlJdGVtID8gYXdhaXQgcmVnaXN0cnlJdGVtLmxvYWRlcigpIDogYXdhaXQgY3JlYXRlRGVmYXVsdExhbmd1YWdlKCk7XG5cbiAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuc2V0KGxvd2VyTGFuZywgZXh0ZW5zaW9uKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGludGVyIGV4dGVuc2lvbiBu4bq/dSBjw7NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExpbnRlckV4dGVuc2lvbihsYW5nOiBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKTogUHJvbWlzZTxFeHRlbnNpb24+IHtcbiAgICBjb25zdCBsb3dlckxhbmcgPSBsYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcmVnaXN0cnlJdGVtID0gbGFuZ3VhZ2VSZWdpc3RyeVtsb3dlckxhbmddO1xuXG4gICAgaWYgKHJlZ2lzdHJ5SXRlbT8ubGludGVyKSB7XG4gICAgICByZXR1cm4gcmVnaXN0cnlJdGVtLmxpbnRlcih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGludGVyKCgpID0+IFtdKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EUyAtIFRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZUxpZ2h0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnJic6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmQoKSwgY29sb3I6ICcjMzMzJyB9LFxuICAgICAgJy5jbS1jb250ZW50JzogeyBjYXJldENvbG9yOiAnIzExMScgfSxcbiAgICAgICcuY20tYWN0aXZlTGluZSc6IHsgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnJhY2tldFRoZW1lKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudGhlbWUoe1xuICAgICAgJy5jbS1tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMTAwLCAyMDAsIDI1NSwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgxMDAsIDIwMCwgMjU1LCAwLjQpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjJzIGVhc2UnLFxuICAgICAgfSxcbiAgICAgICcuY20tbm9ubWF0Y2hpbmdCcmFja2V0Jzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAwLCAxMDAsIDAuMTUpJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMjU1LCAxMDAsIDEwMCwgMC4zKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVXBkYXRlIGxpc3RlbmVyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVMaXN0ZW5lcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyLm9mKCh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCAmJiB0aGlzLmVkaXRhYmxlKCkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB1cGRhdGUuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgICAgIGNvbnRlbnQ6IG5ld1ZhbHVlLFxuICAgICAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICAgICAgY29udGV4dENoYW5nZTogJ2NvbnRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBVQkxJQyBNRVRIT0RTIC0gTGludGVyIGZhY3RvcmllcyAoxJHGsOG7o2MgZ+G7jWkgdOG7qyByZWdpc3RyeSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVOG6oW8gSmF2YVNjcmlwdCBsaW50ZXJcbiAgICogU+G7rSBk4bulbmcgRnVuY3Rpb24gY29uc3RydWN0b3IgxJHhu4MgdmFsaWRhdGUgc3ludGF4XG4gICAqL1xuICBjcmVhdGVKc0xpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24odGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdldChlcnIsICdtZXNzYWdlJywgJycpO1xuICAgICAgICBjb25zdCBzaG91bGRJZ25vcmUgPSB0aGlzLmxpbnRJZ25vcmVQYXR0ZXJucygpLnNvbWUoKHBhdHRlcm4pID0+IG1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybikpO1xuXG4gICAgICAgIGlmICghc2hvdWxkSWdub3JlKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBKU09OIGxpbnRlclxuICAgKiBT4butIGThu6VuZyBKU09OLnBhcnNlIMSR4buDIHZhbGlkYXRlXG4gICAqL1xuICBjcmVhdGVKc29uTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICB0bzogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZ2V0KGVyciwgJ21lc3NhZ2UnLCAnJyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBTUUwgbGludGVyXG4gICAqL1xuICBjcmVhdGVTcWxMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICBjb25zdCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuXG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAoIW5vZGUudHlwZS5pc0Vycm9yKSByZXR1cm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb206IE1hdGgubWF4KDAsIG5vZGUuZnJvbSAtIDEpLFxuICAgICAgICAgICAgdG86IG5vZGUuZnJvbSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFNxbEVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNxbEVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKTtcbiAgICAgIHJldHVybiBgU1FMIHN5bnRheCBlcnJvciBuZWFyIFwiJHt0ZXh0fVwiYDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcblxuICAgIGlmICghcHJldlRva2VuKSB7XG4gICAgICByZXR1cm4gJ1NRTCBzeW50YXggZXJyb3IgYXQgYmVnaW5uaW5nIG9mIHN0YXRlbWVudCc7XG4gICAgfVxuXG4gICAgaWYgKC9GUk9NJC9pLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdFeHBlY3RlZCB0YWJsZSBuYW1lIGFmdGVyIEZST00nO1xuICAgIH1cblxuICAgIGlmICgvU0VMRUNUJC9pLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdFeHBlY3RlZCBjb2x1bW4gbGlzdCBhZnRlciBTRUxFQ1QnO1xuICAgIH1cblxuICAgIGlmICgvV0hFUkUkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBXSEVSRSc7XG4gICAgfVxuXG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICB9XG5cbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgZW5kIG9mIFNRTCBhZnRlciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5CZWZvcmUoZG9jOiBUZXh0LCBwb3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBwb3MgLSAzMCk7XG4gICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhzdGFydCwgcG9zKTtcblxuICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvKFxcUyspXFxzKiQvKTtcbiAgICByZXR1cm4gbWF0Y2g/LlsxXSA/PyAnJztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBNRVRIT0RTIC0gRXZlbnQgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNvcHkoKTogdm9pZCB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250ZW50KCkgfHwgJycpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0SW5mbygnU2FvIGNow6lwIHRow6BuaCBjw7RuZycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaW5lV3JhcCgpOiB2b2lkIHtcbiAgICAvLyBM4bqleSBu4buZaSBkdW5nIG3hu5tpIG5o4bqldCB04burIGVkaXRvciBzYXUga2hpIMSRw6MgeMOzYSBuZXdsaW5lc1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LnN0YXRlLmRvYy50b1N0cmluZygpIHx8ICcnO1xuICAgIGlmICh0aGlzLmlzV3JhcCgpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcC5zZXQoY3VycmVudENvbnRlbnQpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHRoaXMuaXNXcmFwKCkgJiYgY3VycmVudENvbnRlbnQgPyBjdXJyZW50Q29udGVudC5yZXBsYWNlKC9cXG4vZywgJyAnKSA6IHRoaXMuY29udGVudFN0YXRlTm9XcmFwKCk7XG4gICAgdGhpcy5pc1dyYXAudXBkYXRlKCh2YWwpID0+ICF2YWwpO1xuXG4gICAgaWYgKGN1cnJlbnRDb250ZW50ICE9PSB1cGRhdGVkQ29udGVudCkge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlczogeyBmcm9tOiAwLCB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLCBpbnNlcnQ6IHVwZGF0ZWRDb250ZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCYXRjaCBj4bqjIDIgZGlzcGF0Y2ggdGjDoG5oIDEgxJHhu4MgdOG7kWkgxrB1IHBlcmZvcm1hbmNlXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLndyYXBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgOiBbXSksIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKHRoaXMuaXNXcmFwKCkgPyBsaW5lTnVtYmVycygpIDogW10pXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZGF0YT8ua2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TGFuZyA9IGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KG5ld0xhbmcpO1xuXG4gICAgLy8gTG9hZCBsYW5ndWFnZSB2w6AgbGludGVyIG3hu5tpXG4gICAgY29uc3QgW2xhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKG5ld0xhbmcpLCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24obmV3TGFuZyldKTtcblxuICAgIC8vIFJlY29uZmlndXJlIHRoYXkgdsOsIHThuqFvIG3hu5tpIHN0YXRlIMSR4buDIGdp4buvIGzhuqFpIGRvY3VtZW50IGNvbnRlbnRcbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogW3RoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZUV4dGVuc2lvbiksIHRoaXMubGludGVyQ29tcGFydG1lbnQucmVjb25maWd1cmUobGludGVyRXh0ZW5zaW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgY29udGV4dENoYW5nZTogJ2xhbmd1YWdlJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktcHJldmlldy1kYXRhLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWF1dG8gcm91bmRlZC1bOHB4XSBsaWJzLXVpLWJvcmRlci1nZW5lcmFsIHB4LVs4cHhdXCJcbiAgW3N0eWxlLi0tYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kKClcIlxuICBbY2xhc3MucHQtWzhweF1dPVwiIWhpZGRlbkFjdGlvbigpXCI+XG4gIEBpZiAoIWhpZGRlbkFjdGlvbigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtYmV0d2VlbiBjb2xvci1bIzZhNzM4M11cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgY2xhc3NJbmNsdWRlPVwidy1bMjAwcHhdXCJcbiAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcoKVwiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
637
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBRSxjQUFjLEVBQXVDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQWEsSUFBSSxFQUFRLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1B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T0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpJLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3hILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDN0IsYUFBYSxFQUFFLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F0ckJVLHdDQUF3Qzs0RkFBeEMsd0NBQXdDLGd3REN6QnJELHE0REF5Q0EsbzNCRGxCWSxpQ0FBaUMsdTNEQUFFLHNDQUFzQzs7NEZBRXhFLHdDQUF3QztrQkFUcEQsU0FBUzsrQkFFRSxzQ0FBc0MsY0FHcEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsaUNBQWlDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhdXRvY29tcGxldGlvbiwgQ29tcGxldGlvbkNvbnRleHQsIENvbXBsZXRpb25SZXN1bHQgfSBmcm9tICdAY29kZW1pcnJvci9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEVkaXRvclN0YXRlLCBFeHRlbnNpb24sIFByZWMsIFRleHQsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldywgbGluZU51bWJlcnMsIFZpZXdVcGRhdGUgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB0eXBlIHsgU3ludGF4Tm9kZVJlZiB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGJhc2ljU2V0dXAgfSBmcm9tICdjb2RlbWlycm9yNic7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UsIGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcsIGxhbmd1YWdlUmVnaXN0cnksIG9wdGlvbnNMYW5nRGF0YSB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuZGVmaW5lJztcbmltcG9ydCB7IElMYW5ndWFnZU9wdGlvbnMsIElQcmV2aWV3VGV4dERhdGFDaGFuZ2UsIElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbSwgSVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbiwgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCwgVF9Gb3JiaWRkZW5QYXR0ZXJuIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXByZXZpZXdfdGV4dF9kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZWRpdG9yVmlld0luc3RhbmNlPzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSByZWFkb25seSB3cmFwQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGluZU51bWJlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGludGVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wbGV0aW9uc0NvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9yYmlkZGVuQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuICBwcml2YXRlIGNvbnRlbnRTdGF0ZU5vV3JhcCA9IHNpZ25hbCgnJyk7XG5cbiAgLyoqIENhY2hlIMSR4buDIHRyw6FuaCBsb2FkIGzhuqFpIGxhbmd1YWdlIMSRw6MgbG9hZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5zaW9uPigpO1xuXG4gIC8qKiBGbGFnIMSR4buDIHRyw6FuaCB1cGRhdGUgZWRpdG9yIGtoaSDEkWFuZyBraOG7n2kgdOG6oW8gKi9cbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5KRUNURUQgU0VSVklDRVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgU0lHTkFMU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc1dyYXAgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodW5kZWZpbmVkKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBsYWJlbExhbmcgPSBjb21wdXRlZCgoKSA9PiBvcHRpb25zTGFuZ0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gdGhpcy5sYW5nU2VsZWN0ZWQoKSk/LmxhYmVsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjY2VwdENoYW5nZUxhbmcgPSBjb21wdXRlZCgoKSA9PiAhKHRoaXMubGFuZ1NlbGVjdGVkKCkgJiYgdGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGggPT09IDEgJiYgdGhpcy5sYW5nc0FjY2VwdCgpPy5pbmNsdWRlcyh0aGlzLmxhbmdTZWxlY3RlZCgpKSkpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJycsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxhbmdTZWxlY3RlZCA9IG1vZGVsLnJlcXVpcmVkPFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+KCk7XG4gIHJlYWRvbmx5IGxhbmdzQWNjZXB0ID0gaW5wdXQ8QXJyYXk8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxhbmdzQ2hhbmdlTGFiZWwgPSBpbnB1dDxJTGFuZ3VhZ2VPcHRpb25zIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGVkaXRhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IGJvb2xlYW4pID0+IHZhbHVlID8/IGZhbHNlLFxuICB9KTtcblxuICByZWFkb25seSBoaWRkZW5BY3Rpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxpbnRJZ25vcmVQYXR0ZXJucyA9IGlucHV0PEFycmF5PHN0cmluZz4sIEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ+KFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IEFycmF5PHN0cmluZz4pID0+IHZhbHVlID8/IFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEYW5oIHPDoWNoIMSR4buRaSB0xrDhu6NuZy9iaeG6v24gZ+G7o2kgw70ga2hpIGfDtSDigJQgZ2nhu5FuZyBJbnRlbGxpU2Vuc2UgdHJvbmcgSURFLlxuICAgKiBI4buXIHRy4bujIGRvdC1ub3RhdGlvbjogxJHhu4tuaCBuZ2jEqWEgYHByb3BlcnRpZXNgIMSR4buDIGfhu6NpIMO9IHNhdSBk4bqldSBgLmBcbiAgICogQGV4YW1wbGVcbiAgICogW2NvbXBsZXRpb25zXT1cIlt7IGxhYmVsOiAndXNlcicsIHByb3BlcnRpZXM6IFt7IGxhYmVsOiAnbmFtZScsIGRldGFpbDogJ3N0cmluZycgfV0gfV1cIlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGxldGlvbnMgPSBpbnB1dDxJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtW10gfCB1bmRlZmluZWQ+KFtdLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSkgPT4gdmFsdWUgPz8gW10sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEYW5oIHPDoWNoIHBhdHRlcm4gY+G6pW0g4oCUIGNodeG7l2kgbGl0ZXJhbCBob+G6t2MgUmVnRXhwLlxuICAgKiBLaGkgcGjDoXQgaGnhu4duIHZpIHBo4bqhbTogaGlnaGxpZ2h0IMSR4buPIHThuqFpIMSRw7puZyB24buLIHRyw60gKyBjaOG6t24gcGFzdGUgKyBlbWl0IGAob3V0VmlvbGF0aW9ucylgLlxuICAgKiBEw7luZyBgREVGQVVMVF9TRUNVUklUWV9QQVRURVJOU2AgxJHhu4Mgw6FwIGThu6VuZyBi4buZIHF1eSB04bqvYyBi4bqjbyBt4bqtdCBt4bq3YyDEkeG7i25oIGNobyBsb3ctY29kZS5cbiAgICogQGV4YW1wbGVcbiAgICogW2ZvcmJpZGRlblBhdHRlcm5zXT1cImRlZmF1bHRTZWN1cml0eVBhdHRlcm5zXCJcbiAgICogW2ZvcmJpZGRlblBhdHRlcm5zXT1cIlsvZXZhbFxccypcXCgvLCAnbG9jYWxTdG9yYWdlJ11cIlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yYmlkZGVuUGF0dGVybnMgPSBpbnB1dDxUX0ZvcmJpZGRlblBhdHRlcm5bXSwgVF9Gb3JiaWRkZW5QYXR0ZXJuW10gfCB1bmRlZmluZWQ+KFtdLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBUX0ZvcmJpZGRlblBhdHRlcm5bXSkgPT4gdmFsdWUgPz8gW10sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJhY2tncm91bmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJyNmOGY5ZmEnLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcjZjhmOWZhJyxcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1VUUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IG91dENoYW5nZSA9IG91dHB1dDxJUHJldmlld1RleHREYXRhQ2hhbmdlPigpO1xuICByZWFkb25seSBzeW50YXhFcnJvcnMgPSBvdXRwdXQ8RGlhZ25vc3RpY1tdPigpO1xuICByZWFkb25seSBvdXRWaW9sYXRpb25zID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFWaW9sYXRpb25bXT4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWSUVXIENISUxEUkVOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJQcmV2aWV3ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyUHJldmlldycpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTlNUUlVDVE9SIC0gU2V0dXAgZWZmZWN0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVmZmVjdCDEkeG7gyBzeW5jIGNvbnRlbnQgdOG7qyBpbnB1dCB2w6BvIGVkaXRvclxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2Uuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgICAgICAgaW5zZXJ0OiBuZXdDb250ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRWZmZWN0IMSR4buDIGPhuq1wIG5o4bqtdCBjdXN0b20gY29tcGxldGlvbnMga2hpIGlucHV0IHRoYXkgxJHhu5VpXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jb21wbGV0aW9ucygpO1xuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSByZXR1cm47XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5kaXNwYXRjaCh7XG4gICAgICAgIGVmZmVjdHM6IHRoaXMuY29tcGxldGlvbnNDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShpdGVtcy5sZW5ndGggPyB0aGlzLmJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpdGVtcykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCDEkeG7gyBj4bqtcCBuaOG6rXQgZm9yYmlkZGVuIHBhdHRlcm5zIGtoaSBpbnB1dCB0aGF5IMSR4buVaVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkIHx8ICF0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICBlZmZlY3RzOiB0aGlzLmZvcmJpZGRlbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKHBhdHRlcm5zLmxlbmd0aCA/IHRoaXMuYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24ocGF0dGVybnMpIDogW10pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpLCB0aGlzLmxhbmdzQ2hhbmdlTGFiZWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IHRoaXMuY29udGVudCgpLFxuICAgICAgcGFyZW50OiB0aGlzLmNvbnRhaW5lclByZXZpZXcoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5jcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIGRhbmggc8OhY2ggZXh0ZW5zaW9ucyBjaG8gZWRpdG9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb246IEV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uOiBFeHRlbnNpb24pOiBFeHRlbnNpb25bXSB7XG4gICAgY29uc3QgaW5pdGlhbENvbXBsZXRpb25zID0gdGhpcy5jb21wbGV0aW9ucygpO1xuICAgIGNvbnN0IGluaXRpYWxQYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICByZXR1cm4gW1xuICAgICAgYmFzaWNTZXR1cCxcbiAgICAgIHRoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5vZihsYW5ndWFnZUV4dGVuc2lvbiksXG4gICAgICB0aGlzLmxpbnRlckNvbXBhcnRtZW50Lm9mKGxpbnRlckV4dGVuc2lvbiksXG4gICAgICAvLyBDb21wYXJ0bWVudCBjaG8gY3VzdG9tIGNvbXBsZXRpb25zIOKAlCBQcmVjLmhpZ2hlc3QgxJHhu4Mgb3ZlcnJpZGUgYmFzaWNTZXR1cCdzIGF1dG9jb21wbGV0aW9uXG4gICAgICBQcmVjLmhpZ2hlc3QodGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50Lm9mKGluaXRpYWxDb21wbGV0aW9ucy5sZW5ndGggPyB0aGlzLmJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpbml0aWFsQ29tcGxldGlvbnMpIDogW10pKSxcbiAgICAgIHRoaXMuZm9yYmlkZGVuQ29tcGFydG1lbnQub2YoaW5pdGlhbFBhdHRlcm5zLmxlbmd0aCA/IHRoaXMuYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24oaW5pdGlhbFBhdHRlcm5zKSA6IFtdKSxcbiAgICAgIHRoaXMuY3JlYXRlTGlnaHRUaGVtZSgpLFxuICAgICAgRWRpdG9yVmlldy5lZGl0YWJsZS5vZih0aGlzLmVkaXRhYmxlKCkpLFxuICAgICAgdGhpcy53cmFwQ29tcGFydG1lbnQub2YoRWRpdG9yVmlldy5saW5lV3JhcHBpbmcpLFxuICAgICAgdGhpcy5saW5lTnVtYmVyQ29tcGFydG1lbnQub2YobGluZU51bWJlcnMoKSksXG4gICAgICBsaW50R3V0dGVyKCksXG4gICAgICB0aGlzLmNyZWF0ZUJyYWNrZXRUaGVtZSgpLFxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVMaXN0ZW5lcigpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsYW5ndWFnZSBleHRlbnNpb24gduG7m2kgY2FjaGluZ1xuICAgKiBN4buXaSBsYW5ndWFnZSBjaOG7iSDEkcaw4bujYyBsb2FkIDEgbOG6p25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExhbmd1YWdlRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubGFuZ3VhZ2VDYWNoZS5nZXQobG93ZXJMYW5nKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcmVnaXN0cnlJdGVtID8gYXdhaXQgcmVnaXN0cnlJdGVtLmxvYWRlcigpIDogYXdhaXQgY3JlYXRlRGVmYXVsdExhbmd1YWdlKCk7XG5cbiAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuc2V0KGxvd2VyTGFuZywgZXh0ZW5zaW9uKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGludGVyIGV4dGVuc2lvbiBu4bq/dSBjw7NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExpbnRlckV4dGVuc2lvbihsYW5nOiBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKTogUHJvbWlzZTxFeHRlbnNpb24+IHtcbiAgICBjb25zdCBsb3dlckxhbmcgPSBsYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcmVnaXN0cnlJdGVtID0gbGFuZ3VhZ2VSZWdpc3RyeVtsb3dlckxhbmddO1xuXG4gICAgaWYgKHJlZ2lzdHJ5SXRlbT8ubGludGVyKSB7XG4gICAgICByZXR1cm4gcmVnaXN0cnlJdGVtLmxpbnRlcih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGludGVyKCgpID0+IFtdKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EUyAtIFRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZUxpZ2h0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnJic6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmQoKSwgY29sb3I6ICcjMzMzJyB9LFxuICAgICAgJy5jbS1jb250ZW50JzogeyBjYXJldENvbG9yOiAnIzExMScgfSxcbiAgICAgICcuY20tYWN0aXZlTGluZSc6IHsgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnJhY2tldFRoZW1lKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudGhlbWUoe1xuICAgICAgJy5jbS1tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMTAwLCAyMDAsIDI1NSwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgxMDAsIDIwMCwgMjU1LCAwLjQpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjJzIGVhc2UnLFxuICAgICAgfSxcbiAgICAgICcuY20tbm9ubWF0Y2hpbmdCcmFja2V0Jzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAwLCAxMDAsIDAuMTUpJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMjU1LCAxMDAsIDEwMCwgMC4zKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVXBkYXRlIGxpc3RlbmVyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVMaXN0ZW5lcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyLm9mKCh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCAmJiB0aGlzLmVkaXRhYmxlKCkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB1cGRhdGUuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgICAgIGNvbnRlbnQ6IG5ld1ZhbHVlLFxuICAgICAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICAgICAgY29udGV4dENoYW5nZTogJ2NvbnRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBVQkxJQyBNRVRIT0RTIC0gTGludGVyIGZhY3RvcmllcyAoxJHGsOG7o2MgZ+G7jWkgdOG7qyByZWdpc3RyeSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVOG6oW8gSmF2YVNjcmlwdCBsaW50ZXIgduG7m2kgMi1wYXNzIGRldGVjdGlvbjpcbiAgICogMS4gVGV4dC1iYXNlZCBzY2FuIGNobyB0cmFpbGluZyBkb3QgKHBhcnNlciB0aMaw4budbmcgxJHhurd0IGVycm9yIG5vZGUgc2FpIHbhu4sgdHLDrSB24bubaSBwYXR0ZXJuIG7DoHkpXG4gICAqIDIuIHN5bnRheFRyZWUgY2hvIGPDoWMgbOG7l2kgdGjhu7FjIHPhu7Ega2jDoWMsIGLhu48gcXVhIHbDuW5nIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgdHJhaWxpbmcgZG90XG4gICAqL1xuICBjcmVhdGVKc0xpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuXG4gICAgICAvLyBQYXNzIDE6IFRleHQtYmFzZWQgdHJhaWxpbmcgZG90IGRldGVjdGlvbiDigJQgxJHhurd0IGRpYWdub3N0aWMgxJHDum5nIHThuqFpIHbhu4sgdHLDrSBk4bqldSBjaOG6pW1cbiAgICAgIGNvbnN0IHRyYWlsaW5nRG90TGluZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgIGZvciAobGV0IGxpbmVOdW0gPSAxOyBsaW5lTnVtIDw9IGRvYy5saW5lczsgbGluZU51bSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2MubGluZShsaW5lTnVtKTtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudGV4dC50cmltRW5kKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaCgvKFxcdyspXFwuXFxzKiQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgICAgdHJhaWxpbmdEb3RMaW5lcy5hZGQobGluZU51bSk7XG4gICAgICAgIGNvbnN0IGRvdFBvcyA9IGxpbmUuZnJvbSArIHRyaW1tZWQubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgZnJvbTogZG90UG9zLFxuICAgICAgICAgIHRvOiBkb3RQb3MgKyAxLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbmNvbXBsZXRlIHByb3BlcnR5IGFjY2VzcyBvbiBcIiR7bWF0Y2hbMV19XCJgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gxJDDoW5oIGThuqV1IGPDoWMgZMOybmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSB0cmFpbGluZyBkb3QgKHRyYWlsaW5nLWRvdCBsaW5lICsgNCBkw7JuZyB0aeG6v3AgdGhlbylcbiAgICAgIC8vIMSR4buDIGzhu41jIGNhc2NhZGluZyBlcnJvcnMgdOG7qyBzeW50YXhUcmVlXG4gICAgICBjb25zdCB0YWludGVkTGluZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgbGluZU51bSBvZiB0cmFpbGluZ0RvdExpbmVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBsaW5lTnVtOyBpIDw9IE1hdGgubWluKGxpbmVOdW0gKyA0LCBkb2MubGluZXMpOyBpKyspIHtcbiAgICAgICAgICB0YWludGVkTGluZXMuYWRkKGkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgMjogc3ludGF4VHJlZSBjaG8gY8OhYyBs4buXaSBraMOhYyAoY2jhu4kgbm9uLWVtcHR5IHJhbmdlLCBi4buPIHF1YSB2w7luZyB0YWludGVkKVxuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAoIW5vZGUudHlwZS5pc0Vycm9yKSByZXR1cm47XG4gICAgICAgICAgaWYgKG5vZGUuZnJvbSA9PT0gbm9kZS50bykgcmV0dXJuOyAvLyBC4buPIHF1YSBlbXB0eS1yYW5nZSBub2RlIChjYXNjYWRpbmcgZXJyb3IpXG5cbiAgICAgICAgICBjb25zdCBlcnJvckxpbmVOdW0gPSBkb2MubGluZUF0KG5vZGUuZnJvbSkubnVtYmVyO1xuICAgICAgICAgIGlmICh0YWludGVkTGluZXMuaGFzKGVycm9yTGluZU51bSkpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogbm9kZS5mcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKG5vZGUudG8sIGRvYy5sZW5ndGgpLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkSnNFcnJvck1lc3NhZ2UoZG9jLCBub2RlKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRKc0Vycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgaWYgKHRleHQpIHJldHVybiBgSmF2YVNjcmlwdCBzeW50YXggZXJyb3IgbmVhciBcIiR7dGV4dH1cImA7XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcbiAgICBpZiAoIXByZXZUb2tlbikgcmV0dXJuICdKYXZhU2NyaXB0IHN5bnRheCBlcnJvcic7XG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICBpZiAoL1xcWyQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuICAgIGlmICgvXmZ1bmN0aW9uJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIG9yIFwiKFwiJztcbiAgICBpZiAoL15yZXR1cm4kL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0ludmFsaWQgZXhwcmVzc2lvbiBhZnRlciBcInJldHVyblwiJztcbiAgICBpZiAoL149PiQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBib2R5IGFmdGVyIFwiPT5cIic7XG4gICAgaWYgKC9eY29uc3QkfF5sZXQkfF52YXIkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIG5hbWUnO1xuXG4gICAgcmV0dXJuIGBKYXZhU2NyaXB0IHN5bnRheCBlcnJvciBuZWFyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIEpTT04gbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEpTT04ucGFyc2UgxJHhu4MgdmFsaWRhdGVcbiAgICovXG4gIGNyZWF0ZUpzb25MaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBnZXQoZXJyLCAnbWVzc2FnZScsICcnKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFNRTCBsaW50ZXJcbiAgICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogTWF0aC5tYXgoMCwgbm9kZS5mcm9tIC0gMSksXG4gICAgICAgICAgICB0bzogbm9kZS5mcm9tLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYzogVGV4dCwgbm9kZTogU3ludGF4Tm9kZVJlZik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuZnJvbSAhPT0gbm9kZS50bykge1xuICAgICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhub2RlLmZyb20sIG5vZGUudG8pO1xuICAgICAgcmV0dXJuIGBTUUwgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnU1FMIHN5bnRheCBlcnJvciBhdCBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50JztcbiAgICB9XG5cbiAgICBpZiAoL0ZST00kL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIHRhYmxlIG5hbWUgYWZ0ZXIgRlJPTSc7XG4gICAgfVxuXG4gICAgaWYgKC9TRUxFQ1QkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbHVtbiBsaXN0IGFmdGVyIFNFTEVDVCc7XG4gICAgfVxuXG4gICAgaWYgKC9XSEVSRSQvaS50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnRXhwZWN0ZWQgY29uZGl0aW9uIGFmdGVyIFdIRVJFJztcbiAgICB9XG5cbiAgICBpZiAoL1xcKCQvLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCIpXCInO1xuICAgIH1cblxuICAgIHJldHVybiBgVW5leHBlY3RlZCBlbmQgb2YgU1FMIGFmdGVyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbkJlZm9yZShkb2M6IFRleHQsIHBvczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIHBvcyAtIDMwKTtcbiAgICBjb25zdCB0ZXh0ID0gZG9jLnNsaWNlU3RyaW5nKHN0YXJ0LCBwb3MpO1xuXG4gICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC8oXFxTKylcXHMqJC8pO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFB5dGhvbiBsaW50ZXIgZOG7sWEgdHLDqm4gc3ludGF4VHJlZSBwYXJzZSBlcnJvciDigJQgY8O5bmcgYXBwcm9hY2ggduG7m2kgU1FMIGxpbnRlci5cbiAgICogUGjDoXQgaGnhu4duIGzhu5dpIGPDuiBwaMOhcCBtw6AgQ29kZU1pcnJvciBQeXRob24gcGFyc2VyIMSRw6FuaCBk4bqldSBsw6AgZXJyb3Igbm9kZS5cbiAgICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBub2RlLmZyb20gLSAxKTtcbiAgICAgICAgICBjb25zdCB0byA9IG5vZGUuZnJvbSA9PT0gbm9kZS50byA/IG5vZGUuZnJvbSArIDEgOiBub2RlLnRvO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKHRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgICByZXR1cm4gYFB5dGhvbiBzeW50YXggZXJyb3Ike3RleHQgPyBgIG5lYXIgXCIke3RleHR9XCJgIDogJyd9YDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcblxuICAgIGlmICghcHJldlRva2VuKSB7XG4gICAgICByZXR1cm4gJ1B5dGhvbiBzeW50YXggZXJyb3InO1xuICAgIH1cblxuICAgIGlmICgvXmRlZiQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgZnVuY3Rpb24gbmFtZSBhZnRlciBcImRlZlwiJztcbiAgICBpZiAoL15jbGFzcyQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgY2xhc3MgbmFtZSBhZnRlciBcImNsYXNzXCInO1xuICAgIGlmICgvXnJldHVybiQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnSW52YWxpZCBleHByZXNzaW9uIGFmdGVyIFwicmV0dXJuXCInO1xuICAgIGlmICgvXmltcG9ydCQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgbW9kdWxlIG5hbWUgYWZ0ZXIgXCJpbXBvcnRcIic7XG4gICAgaWYgKC9eZnJvbSQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgbW9kdWxlIG5hbWUgYWZ0ZXIgXCJmcm9tXCInO1xuICAgIGlmICgvXmlmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJpZlwiJztcbiAgICBpZiAoL15lbGlmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJlbGlmXCInO1xuICAgIGlmICgvXndoaWxlJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJ3aGlsZVwiJztcbiAgICBpZiAoL15mb3IkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIGFmdGVyIFwiZm9yXCInO1xuICAgIGlmICgvXFwuJC8udGVzdChwcmV2VG9rZW4pKSByZXR1cm4gYEluY29tcGxldGUgYXR0cmlidXRlIGFjY2VzcyBvbiBcIiR7cHJldlRva2VuLnNsaWNlKDAsIC0xKX1cImA7XG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICBpZiAoL1xcWyQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuXG4gICAgcmV0dXJuIGBQeXRob24gc3ludGF4IGVycm9yIG5lYXIgXCIke3ByZXZUb2tlbn1cImA7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gQ29kZU1pcnJvciBleHRlbnNpb24gY2hvIGN1c3RvbSBjb21wbGV0aW9ucyB04burIGRhbmggc8OhY2ggaW5wdXQuXG4gICAqIEjhu5cgdHLhu6MgMiBjaOG6vyDEkeG7mTpcbiAgICogMS4gR8O1IHTDqm4gYmnhur9uIOKGkiBn4bujaSDDvSB0b3AtbGV2ZWwgaXRlbXNcbiAgICogMi4gR8O1IGBvYmouYCDihpIgZ+G7o2kgw70gcHJvcGVydGllcyBj4bunYSBvYmpcbiAgICovXG4gIHByaXZhdGUgYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGl0ZW1zOiBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSk6IEV4dGVuc2lvbiB7XG4gICAgY29uc3QgY29tcGxldGlvblNvdXJjZSA9IChjb250ZXh0OiBDb21wbGV0aW9uQ29udGV4dCk6IENvbXBsZXRpb25SZXN1bHQgfCBudWxsID0+IHtcbiAgICAgIC8vIENo4bq/IMSR4buZIGRvdC1ub3RhdGlvbjogZ8O1IFwib2JqLnByb3BcIiDihpIgZ+G7o2kgw70gcHJvcGVydGllcyBj4bunYSBvYmpcbiAgICAgIGNvbnN0IGRvdE1hdGNoID0gY29udGV4dC5tYXRjaEJlZm9yZSgvXFx3K1xcLlxcdyovKTtcbiAgICAgIGlmIChkb3RNYXRjaCkge1xuICAgICAgICBjb25zdCBkb3RQb3MgPSBkb3RNYXRjaC50ZXh0LmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IGRvdE1hdGNoLnRleHQuc2xpY2UoMCwgZG90UG9zKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gaXRlbXMuZmluZCgoaSkgPT4gaS5sYWJlbCA9PT0gb2JqZWN0TmFtZSk7XG4gICAgICAgIGlmIChwYXJlbnQ/LnByb3BlcnRpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiBkb3RNYXRjaC5mcm9tICsgZG90UG9zICsgMSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHBhcmVudC5wcm9wZXJ0aWVzLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHAubGFiZWwsXG4gICAgICAgICAgICAgIHR5cGU6IHAudHlwZSA/PyAncHJvcGVydHknLFxuICAgICAgICAgICAgICBkZXRhaWw6IHAuZGV0YWlsID8/ICcnLFxuICAgICAgICAgICAgICBpbmZvOiBwLmluZm8gPz8gJycsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaOG6vyDEkeG7mSB0b3AtbGV2ZWw6IGfhu6NpIMO9IHTDqm4gYmnhur9uL29iamVjdCBraGkgZ8O1IGvDvSB04buxXG4gICAgICBjb25zdCB3b3JkID0gY29udGV4dC5tYXRjaEJlZm9yZSgvXFx3Ki8pO1xuICAgICAgaWYgKCF3b3JkIHx8ICh3b3JkLmZyb20gPT09IHdvcmQudG8gJiYgIWNvbnRleHQuZXhwbGljaXQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogd29yZC5mcm9tLFxuICAgICAgICBvcHRpb25zOiBpdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgdHlwZTogaXRlbS50eXBlID8/ICd2YXJpYWJsZScsXG4gICAgICAgICAgZGV0YWlsOiBpdGVtLmRldGFpbCA/PyAnJyxcbiAgICAgICAgICBpbmZvOiBpdGVtLmluZm8gPz8gJycsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBhdXRvY29tcGxldGlvbih7IG92ZXJyaWRlOiBbY29tcGxldGlvblNvdXJjZV0gfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gZXh0ZW5zaW9uIGLhuqNvIG3huq10IGfhu5NtIDIgbGF5ZXI6XG4gICAqIDEuIExpbnRlcjogaGlnaGxpZ2h0IMSR4buPIHThuqFpIMSRw7puZyB24buLIHRyw60gbWF0Y2ggKyBlbWl0IG91dFZpb2xhdGlvbnNcbiAgICogMi4gVHJhbnNhY3Rpb24gZmlsdGVyOiBjaOG6t24gcGFzdGUgbuG6v3UgbuG7mWkgZHVuZyBwYXN0ZSBjaOG7qWEgcGF0dGVybiBj4bqlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZvcmJpZGRlbkV4dGVuc2lvbihwYXR0ZXJuczogVF9Gb3JiaWRkZW5QYXR0ZXJuW10pOiBFeHRlbnNpb24ge1xuICAgIGNvbnN0IHRvR2xvYmFsUmVnZXggPSAocDogVF9Gb3JiaWRkZW5QYXR0ZXJuKTogUmVnRXhwID0+IHtcbiAgICAgIGlmIChwIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcC5mbGFncy5pbmNsdWRlcygnZycpID8gcC5mbGFncyA6IGAke3AuZmxhZ3N9Z2A7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHAuc291cmNlLCBmbGFncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KHApLCAnZ2knKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9yYmlkZGVuTGludGVyID0gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICBjb25zdCB2aW9sYXRpb25zOiBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIC8vIEJ1aWxkIGEgU2V0IG9mIGNvbW1lbnQgcmFuZ2VzIHThu6sgQVNUIMSR4buDIHNraXAgbWF0Y2ggbuG6sW0gdHJvbmcgY29tbWVudFxuICAgICAgY29uc3QgY29tbWVudFJhbmdlczogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfVtdID0gW107XG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnY29tbWVudCcpKSB7XG4gICAgICAgICAgICBjb21tZW50UmFuZ2VzLnB1c2goeyBmcm9tOiBub2RlLmZyb20sIHRvOiBub2RlLnRvIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc0luQ29tbWVudCA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBib29sZWFuID0+XG4gICAgICAgIGNvbW1lbnRSYW5nZXMuc29tZSgocikgPT4gZnJvbSA+PSByLmZyb20gJiYgdG8gPD0gci50byk7XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICBjb25zdCByZSA9IHRvR2xvYmFsUmVnZXgocGF0dGVybik7XG4gICAgICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgY29uc3QgdG8gPSBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKGlzSW5Db21tZW50KGZyb20sIHRvKSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLm51bWJlcjtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJuTGFiZWwgPSBwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwID8gcGF0dGVybi5zb3VyY2UgOiBwYXR0ZXJuO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNw6MgYuG7iyBj4bqlbTogXCIke21hdGNoWzBdfVwiIOKAlCB2aSBwaOG6oW0gY2jDrW5oIHPDoWNoIGLhuqNvIG3huq10YCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7IGZyb20sIHRvLCBsaW5lLCBwYXR0ZXJuOiBwYXR0ZXJuTGFiZWwsIG1hdGNoZWQ6IG1hdGNoWzBdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3V0VmlvbGF0aW9ucy5lbWl0KHZpb2xhdGlvbnMpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuXG4gICAgLy8gQ2jhurduIHBhc3RlIG7hur91IG7hu5lpIGR1bmcgcGFzdGUgY2jhu6lhIGLhuqV0IGvhu7MgcGF0dGVybiBj4bqlbSBuw6BvXG4gICAgY29uc3QgcGFzdGVGaWx0ZXIgPSBFZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlci5vZigodHI6IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRyLmRvY0NoYW5nZWQpIHJldHVybiB0cjtcbiAgICAgIGlmICghdHIuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpPy5zdGFydHNXaXRoKCdpbnB1dC5wYXN0ZScpKSByZXR1cm4gdHI7XG5cbiAgICAgIGNvbnN0IG5ld1RleHQgPSB0ci5uZXdEb2MudG9TdHJpbmcoKTtcbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICBjb25zdCByZSA9IHRvR2xvYmFsUmVnZXgocGF0dGVybik7XG4gICAgICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmIChyZS50ZXN0KG5ld1RleHQpKSByZXR1cm4gW107IC8vIFtdID0gYmxvY2sgdHJhbnNhY3Rpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cjtcbiAgICB9KTtcblxuICAgIHJldHVybiBbZm9yYmlkZGVuTGludGVyLCBwYXN0ZUZpbHRlcl07XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZVJlZ2V4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBpZiAodGhpcy5pc1dyYXAoKSkge1xuICAgICAgdGhpcy5jb250ZW50U3RhdGVOb1dyYXAuc2V0KGN1cnJlbnRDb250ZW50KTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEtleShkYXRhPzogSUVtaXRTZWxlY3RLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWRhdGE/LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xhbmcgPSBkYXRhLmtleSBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUO1xuICAgIHRoaXMubGFuZ1NlbGVjdGVkLnNldChuZXdMYW5nKTtcblxuICAgIC8vIExvYWQgbGFuZ3VhZ2UgdsOgIGxpbnRlciBt4bubaVxuICAgIGNvbnN0IFtsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbihuZXdMYW5nKSwgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKG5ld0xhbmcpXSk7XG5cbiAgICAvLyBSZWNvbmZpZ3VyZSB0aGF5IHbDrCB04bqhbyBt4bubaSBzdGF0ZSDEkeG7gyBnaeG7ryBs4bqhaSBkb2N1bWVudCBjb250ZW50XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQucmVjb25maWd1cmUobGFuZ3VhZ2VFeHRlbnNpb24pLCB0aGlzLmxpbnRlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxpbnRlckV4dGVuc2lvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtyZWFkb25seV09XCIhZWRpdGFibGUoKSB8fCAhYWNjZXB0Q2hhbmdlTGFuZygpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEtleSgkZXZlbnQpXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMYW5nKCkgfHwgJydcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAnIDogJydcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLVswcHhdJyArIChlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICcnIDogJyFwb2ludGVyLWV2ZW50cy1ub25lICFjdXJzb3ItZGVmYXVsdCBob3ZlcjohdGV4dC1bIzZBNzM4M10nKVwiIC8+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cImlzV3JhcCgpID8gJ2kxOG5fcmVtb3ZlX2xpbmVfd3JhcCcgOiAnaTE4bl9saW5lX3dyYXAnXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpc1dyYXAoKSA/ICdsaWJzLXVpLWljb24tdW53cmFwJyA6ICdsaWJzLXVpLWljb24td3JhcCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCBtby1saWItbXItMTZweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyTGluZVdyYXAoKVwiIC8+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fY29weSdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY29weSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ29weSgpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgI2NvbnRhaW5lclByZXZpZXc+PC9kaXY+XG48L2Rpdj5cbiJdfQ==