mmhglobal-dynamicform 2.44.3 → 2.44.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +113 -15
- package/fesm2015/mmhglobal-dynamicform.mjs +118 -16
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +112 -14
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/ztexteditor/ztexteditor.component.d.ts +8 -1
- package/package.json +1 -1
|
@@ -44,7 +44,7 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
44
44
|
CustomReplacements: [],
|
|
45
45
|
};
|
|
46
46
|
this.pluginsCallback = (defaultPlugins) => {
|
|
47
|
-
if (this.
|
|
47
|
+
if (this.isParagraphEnterBehavior()) {
|
|
48
48
|
return defaultPlugins;
|
|
49
49
|
}
|
|
50
50
|
return [this.enterAsLineBreakPlugin(), ...defaultPlugins];
|
|
@@ -132,7 +132,7 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
132
132
|
}
|
|
133
133
|
plainTextToEditorHtml(value) {
|
|
134
134
|
const lines = value.split('\n');
|
|
135
|
-
if (this.
|
|
135
|
+
if (this.isParagraphEnterBehavior()) {
|
|
136
136
|
return lines
|
|
137
137
|
.map(line => line.trim() ? `<p>${this.escapeHtml(line)}</p>` : '<p><br></p>')
|
|
138
138
|
.join('');
|
|
@@ -348,9 +348,12 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
348
348
|
}
|
|
349
349
|
const listRange = this.findSelectedListRange();
|
|
350
350
|
if (listRange) {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
351
|
+
if (!this.isListCommandActive(command)) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
const replacementHtml = this.buildSelectedListItemsParagraphHtml(listRange);
|
|
355
|
+
if (replacementHtml) {
|
|
356
|
+
this.replaceRangeWithHtml(listRange.from, listRange.to, replacementHtml);
|
|
354
357
|
return true;
|
|
355
358
|
}
|
|
356
359
|
}
|
|
@@ -365,6 +368,53 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
365
368
|
this.replaceRangeWithHtml(paragraphRange.from, paragraphRange.to, replacementHtml);
|
|
366
369
|
return true;
|
|
367
370
|
}
|
|
371
|
+
isListCommandActive(command) {
|
|
372
|
+
const selection = this.editor?.view?.state.selection;
|
|
373
|
+
const listNodeName = command === 'insertOrderedList' ? 'ordered_list' : 'bullet_list';
|
|
374
|
+
if (!selection) {
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
if (selection.empty) {
|
|
378
|
+
const activeList = this.findAncestorRange(['bullet_list', 'ordered_list']);
|
|
379
|
+
return activeList?.node?.type?.name === listNodeName;
|
|
380
|
+
}
|
|
381
|
+
const selectedRows = this.getSelectedTextBlockListTypes();
|
|
382
|
+
return selectedRows.length > 0 && selectedRows.every(row => row === listNodeName);
|
|
383
|
+
}
|
|
384
|
+
getSelectedTextBlockListTypes() {
|
|
385
|
+
const view = this.editor?.view;
|
|
386
|
+
const selection = view?.state.selection;
|
|
387
|
+
if (!view || !selection) {
|
|
388
|
+
return [];
|
|
389
|
+
}
|
|
390
|
+
const rows = [];
|
|
391
|
+
const seenPositions = new Set();
|
|
392
|
+
view.state.doc.descendants((node, pos) => {
|
|
393
|
+
const nodeFrom = pos;
|
|
394
|
+
const nodeTo = pos + node.nodeSize;
|
|
395
|
+
if (!node.isTextblock || seenPositions.has(pos) || nodeTo <= selection.from || nodeFrom >= selection.to) {
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
seenPositions.add(pos);
|
|
399
|
+
rows.push(this.findParentListTypeAtPosition(pos));
|
|
400
|
+
return true;
|
|
401
|
+
});
|
|
402
|
+
return rows;
|
|
403
|
+
}
|
|
404
|
+
findParentListTypeAtPosition(pos) {
|
|
405
|
+
const doc = this.editor?.view?.state.doc;
|
|
406
|
+
if (!doc) {
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
const resolvedPos = doc.resolve(pos);
|
|
410
|
+
for (let depth = resolvedPos.depth; depth > 0; depth--) {
|
|
411
|
+
const nodeName = resolvedPos.node(depth)?.type?.name;
|
|
412
|
+
if (nodeName === 'bullet_list' || nodeName === 'ordered_list') {
|
|
413
|
+
return nodeName;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
368
418
|
findAncestorRange(nodeNames) {
|
|
369
419
|
const selection = this.editor?.view?.state.selection;
|
|
370
420
|
if (!selection) {
|
|
@@ -486,15 +536,49 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
486
536
|
lines.push(current);
|
|
487
537
|
return lines;
|
|
488
538
|
}
|
|
489
|
-
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
539
|
+
buildSelectedListItemsParagraphHtml(listRange) {
|
|
540
|
+
const selection = this.editor?.view?.state.selection;
|
|
541
|
+
if (!selection) {
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
const listTag = listRange.node.type?.name === 'ordered_list' ? 'ol' : 'ul';
|
|
545
|
+
const htmlParts = [];
|
|
546
|
+
let pendingListItems = [];
|
|
547
|
+
let hasSelectedItem = false;
|
|
548
|
+
const flushPendingListItems = () => {
|
|
549
|
+
if (pendingListItems.length === 0) {
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
htmlParts.push(`<${listTag}>${pendingListItems.join('')}</${listTag}>`);
|
|
553
|
+
pendingListItems = [];
|
|
554
|
+
};
|
|
555
|
+
listRange.node.forEach((listItem, offset) => {
|
|
556
|
+
const itemFrom = listRange.from + 1 + offset;
|
|
557
|
+
const itemTo = itemFrom + listItem.nodeSize;
|
|
558
|
+
const text = this.nodeToHardBreakText(listItem).trim();
|
|
559
|
+
if (!text) {
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
if (this.isRangeSelected(itemFrom, itemTo)) {
|
|
563
|
+
hasSelectedItem = true;
|
|
564
|
+
flushPendingListItems();
|
|
565
|
+
htmlParts.push(this.linesToEditorParagraphHtml([text]));
|
|
566
|
+
return;
|
|
495
567
|
}
|
|
568
|
+
pendingListItems.push(`<li>${this.escapeHtml(text)}</li>`);
|
|
496
569
|
});
|
|
497
|
-
|
|
570
|
+
flushPendingListItems();
|
|
571
|
+
return hasSelectedItem ? htmlParts.join('') : null;
|
|
572
|
+
}
|
|
573
|
+
isRangeSelected(from, to) {
|
|
574
|
+
const selection = this.editor?.view?.state.selection;
|
|
575
|
+
if (!selection) {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
if (selection.empty) {
|
|
579
|
+
return selection.from >= from && selection.from <= to;
|
|
580
|
+
}
|
|
581
|
+
return to > selection.from && from < selection.to;
|
|
498
582
|
}
|
|
499
583
|
nodeToHardBreakText(node) {
|
|
500
584
|
let text = '';
|
|
@@ -525,6 +609,20 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
525
609
|
linesToHardBreakParagraphHtml(lines) {
|
|
526
610
|
return `<p>${lines.map(line => this.escapeHtml(line)).join('<br>')}</p>`;
|
|
527
611
|
}
|
|
612
|
+
linesToParagraphHtml(lines) {
|
|
613
|
+
return lines
|
|
614
|
+
.map(line => line.trim() ? `<p>${this.escapeHtml(line)}</p>` : '<p><br></p>')
|
|
615
|
+
.join('');
|
|
616
|
+
}
|
|
617
|
+
linesToEditorParagraphHtml(lines) {
|
|
618
|
+
if (this.isParagraphEnterBehavior()) {
|
|
619
|
+
return this.linesToParagraphHtml(lines);
|
|
620
|
+
}
|
|
621
|
+
return this.linesToHardBreakParagraphHtml(lines);
|
|
622
|
+
}
|
|
623
|
+
isParagraphEnterBehavior() {
|
|
624
|
+
return this.data?.EnterKeyBehavior !== 'lineBreak';
|
|
625
|
+
}
|
|
528
626
|
replaceRangeWithHtml(from, to, html) {
|
|
529
627
|
const view = this.editor?.view;
|
|
530
628
|
if (!view) {
|
|
@@ -844,12 +942,12 @@ export class ZtexteditorComponent extends InputFieldBase {
|
|
|
844
942
|
}
|
|
845
943
|
}
|
|
846
944
|
ZtexteditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }, { token: i3.DialogService }, { token: i2.AlertService }, { token: i2.CompressImageService }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
847
|
-
ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
|
|
945
|
+
ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
|
|
848
946
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, decorators: [{
|
|
849
947
|
type: Component,
|
|
850
|
-
args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
|
|
948
|
+
args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
|
|
851
949
|
}], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }, { type: i3.DialogService }, { type: i2.AlertService }, { type: i2.CompressImageService }, { type: i2.ToastService }]; }, propDecorators: { editor: [{
|
|
852
950
|
type: ViewChild,
|
|
853
951
|
args: ['editor']
|
|
854
952
|
}] } });
|
|
855
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsSUFBSSxvQkFBb0IsRUFDakMsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1gsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qyw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxD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QUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87YUFDUjtZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQXhnQ1Usb0JBQW9CO3FHQUFwQixvQkFBb0IsZ0xDdkNqQyxzNVVBMklBOzJGRHBHYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsaUJBQWlCOzhQQUtDLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCwgRWRpdG9yUGFzdGVFdmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWVkaXRvcic7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgY2hhaW5Db21tYW5kcyxcclxuICBET01QYXJzZXIgYXMgUHJvc2VNaXJyb3JET01QYXJzZXIsXHJcbiAgZXhpdENvZGUsXHJcbiAga2V5bWFwLFxyXG4gIFBsdWdpbixcclxuICBzcGxpdEJsb2NrXHJcbn0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWVkaXRvci1jb21tb24nO1xyXG5cclxuLyoqKioqKioqKiogUnhKUyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbnB1dEZpZWxkQmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLFxyXG4gIEFsZXJ0U2VydmljZSxcclxuICBDb21wcmVzc0ltYWdlU2VydmljZSxcclxuICBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyxcclxuICBUZXh0RWRpdG9yU3ltYm9sTm9ybWFsaXphdGlvbkNvbmZpZyxcclxuICBUZXh0RWRpdG9yU3ltYm9sUmVwbGFjZW1lbnQsXHJcbiAgVG9hc3RTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnQsXHJcbiAgWkNvbXBvbmVudEhlbHBlclxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC16dGV4dGVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3p0ZXh0ZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96dGV4dGVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWnRleHRlZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBJbnB1dEZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJykgcHVibGljIGVkaXRvciE6IEVkaXRvckNvbXBvbmVudDtcclxuXHJcbiAgcHVibGljIHBhc3RlQ2xlYW51cFNldHRpbmdzOiB7XHJcbiAgICByZW1vdmVNc0NsYXNzZXM6IGJvb2xlYW47XHJcbiAgICByZW1vdmVNc1N0eWxlczogYm9vbGVhbjtcclxuICAgIHJlbW92ZUludmFsaWRIVE1MOiBib29sZWFuO1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG4gIH0gPSB7XHJcbiAgICByZW1vdmVNc0NsYXNzZXM6IGZhbHNlLFxyXG4gICAgcmVtb3ZlTXNTdHlsZXM6IGZhbHNlLFxyXG4gICAgcmVtb3ZlSW52YWxpZEhUTUw6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5nczogeyBpZnJhbWU6IGJvb2xlYW47IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG4gICAgaWZyYW1lOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3M6IFJlcXVpcmVkPE9taXQ8VGV4dEVkaXRvclN5bWJvbE5vcm1hbGl6YXRpb25Db25maWcsICdDdXN0b21SZXBsYWNlbWVudHMnPj4gJiB7XHJcbiAgICBDdXN0b21SZXBsYWNlbWVudHM6IFRleHRFZGl0b3JTeW1ib2xSZXBsYWNlbWVudFtdO1xyXG4gIH0gPSB7XHJcbiAgICBFbmFibGVkOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplSHRtbEVudGl0aWVzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplRGFzaDogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZVF1b3RlczogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZVNwYWNlczogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZUVsbGlwc2lzOiB0cnVlLFxyXG4gICAgQ3VzdG9tUmVwbGFjZW1lbnRzOiBbXSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luc0NhbGxiYWNrID0gKGRlZmF1bHRQbHVnaW5zOiBQbHVnaW5bXSk6IFBsdWdpbltdID0+IHtcclxuICAgIGlmICh0aGlzLmRhdGE/LkVudGVyS2V5QmVoYXZpb3IgPT09ICdwYXJhZ3JhcGgnKSB7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0UGx1Z2lucztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3RoaXMuZW50ZXJBc0xpbmVCcmVha1BsdWdpbigpLCAuLi5kZWZhdWx0UGx1Z2luc107XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGlzQ29tcHJlc3NNb2RlT246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgQ2xvc2VFbmxhcmdlQnRuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBkaWFsb2dSZWY/OiBEaWFsb2dSZWY7XHJcblxyXG4gIHByaXZhdGUgb3JpZ2luYWxJbmxpbmVTdHlsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcHJlc3Npb25FbmFibGVJY29uOiBzdHJpbmcgPSAnay1pLXpvb20tYmVzdC1maXQnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcHJlc3Npb25EaXNhYmxlZEljb246IHN0cmluZyA9ICdrLWktem9vbS1hY3R1YWwtc2l6ZSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHVibGljIHJlYWRvbmx5IGZvbnRBd2VTb21lU2VydmljZTogRm9udEF3ZVNvbWVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcHJlc3NJbWFnZTogQ29tcHJlc3NJbWFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSk7XHJcbiAgfVxyXG5cclxuICAvKiogSW5pdGlhbGl6ZSBjb21wb25lbnQgc3RhdGUgYW5kIGVkaXRvciBjb25maWd1cmF0aW9uLiAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLnNldHVwSW5uZXJGaWVsZCgpO1xyXG5cclxuICAgIC8vIEJhY2t3YXJkLWNvbXBhdGlibGUgZGVmYXVsdDogd2hlbiBub3QgcHJvdmlkZWQsIHVzZSBleHBsb3Jlci5cclxuICAgIHRoaXMuZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPSB0aGlzLmRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kIHx8ICdleHBsb3Jlcic7XHJcblxyXG4gICAgdGhpcy5zZXR1cFBhc3RlQ2xlYW51cFNldHRpbmdzKCk7XHJcbiAgICB0aGlzLnNldHVwU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKCk7XHJcbiAgICBzdXBlci5zZXR1cENvbXBvbmVudFNldHRpbmdzKHRoaXMuY29tcG9uZW50U2V0dGluZ3MpO1xyXG4gICAgc3VwZXIuZm9jdXNPbkRlZmF1bHQodGhpcy5mb2N1cy5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAvLyBTYWZlIGNhc3QgdG8gYm9vbGVhbi5cclxuICAgIHRoaXMuaXNDb21wcmVzc01vZGVPbiA9ICEhdGhpcy5kYXRhPy5Db21wcmVzc2lvbjtcclxuICB9XHJcblxyXG4gIC8qKiBOb3RpZnkgY29tcG9uZW50IHNlcnZpY2Ugb25jZSB2aWV3IGlzIHJlYWR5LiAqL1xyXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3luYyBlZGl0b3IgY29udGVudCB0byB6TW9kZWwgYW5kIHRyaWdnZXIgY29uZmlndXJlZCBjaGFuZ2UgaGFuZGxlci4gKi9cclxuICBwdWJsaWMgb25DaGFuZ2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0VG9aTW9kZWwodGhpcy5kYXRhLlZhbHVlLCB2YWx1ZSwgdGhpcy5ncm91cCwgdGhpcy5kYXRhKTtcclxuICAgIHRoaXMudHJpZ2dlckV2ZW50KCdpbnB1dGZpZWxkLW9uQ2hhbmdlJywgdGhpcy5kYXRhLk9uQ2hhbmdlLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogSGFuZGxlIHBhc3RlOiBub3JtYWxpemUgcGxhaW4tdGV4dCBzcGVjaWFsIGVudGl0aWVzLCB0aGVuIG9wdGlvbmFsbHkgY29tcHJlc3MgcGFzdGVkIGJhc2U2NCBpbWFnZXMuICovXHJcbiAgcHVibGljIGFzeW5jIG9uUGFzdGUoZTogRWRpdG9yUGFzdGVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBQYXN0ZSBldmVudCBpcyB1bmRlZmluZWQuIFBhc3RlIGlnbm9yZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb21tb24gRXhjZWwvcGxhaW4tdGV4dCBpc3N1ZTogXCImYW1wO1wiIGdldHMgaW5zZXJ0ZWQgbGl0ZXJhbGx5IGNhdXNpbmcgXCImYW1wO2FtcDtcIiBpbiBIVE1MLlxyXG4gICAgY29uc3QgaXNIYW5kbGVkID0gdGhpcy5oYW5kbGVDb21tb25TeW1ib2xUYWdzKGUpO1xyXG4gICAgaWYgKGlzSGFuZGxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub3JtYWxpemVQYXN0ZWRIdG1sKGUpO1xyXG5cclxuICAgIC8vIENvbXByZXNzIG9ubHkgaWYgZW5hYmxlZCBhbmQgYmFzZTY0IGltYWdlcyBleGlzdC5cclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW1hZ2VDb21wcmVzc2lvbihlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRoZSBwYXN0ZSBpcyBwbGFpbiB0ZXh0IChubyBIVE1MIHRhZ3MgYW5kIG5vIGltYWdlcyksIG5vcm1hbGl6ZSBjb21tb24gZW50aXRpZXMgYW5kIGluc2VydCBhcyByZWFsIHRleHQuXHJcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGV2ZW50IGlzIGhhbmRsZWQgYW5kIGRlZmF1bHQgcGFzdGUgaXMgcHJldmVudGVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlQ29tbW9uU3ltYm9sVGFncyhlOiBFZGl0b3JQYXN0ZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaGFuZGxlIHBsYWluLXRleHQgbm9ybWFsaXphdGlvbi4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsaXBib2FyZCA9IChlLm9yaWdpbmFsRXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnQgfCB1bmRlZmluZWQpPy5jbGlwYm9hcmREYXRhO1xyXG4gICAgY29uc3QgcGxhaW5UZXh0ID0gY2xpcGJvYXJkPy5nZXREYXRhKCd0ZXh0L3BsYWluJykgPz8gJyc7XHJcbiAgICBjb25zdCBodG1sVGV4dCA9IGNsaXBib2FyZD8uZ2V0RGF0YSgndGV4dC9odG1sJykgPz8gJyc7XHJcbiAgICBjb25zdCBjbGVhbmVkSHRtbCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcblxyXG4gICAgY29uc3QgaHRtbEhhc0ltZyA9IC88aW1nXFxiL2kudGVzdChodG1sVGV4dCk7XHJcbiAgICBjb25zdCBjbGVhbmVkSGFzVGFncyA9IC88W14+XSs+Ly50ZXN0KGNsZWFuZWRIdG1sKTtcclxuXHJcbiAgICAvLyBJZiBwYXN0ZSBoYXMgSFRNTCB0YWdzIG9yIGltYWdlcywgZG8gTk9UIGludGVyZmVyZSAobGV0IEtlbmRvIGhhbmRsZSBpdCkuXHJcbiAgICBpZiAoaHRtbEhhc0ltZyB8fCBjbGVhbmVkSGFzVGFncykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplUGFzdGVkVGV4dChwbGFpblRleHQgfHwgY2xlYW5lZEh0bWwpO1xyXG5cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW5zZXJ0UGxhaW5UZXh0V2l0aEVkaXRvckxpbmVCcmVha3ModGhpcy5ub3JtYWxpemVMaW5lRW5kaW5ncyhub3JtYWxpemVkKSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybWFsaXplTGluZUVuZGluZ3ModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydFBsYWluVGV4dFdpdGhFZGl0b3JMaW5lQnJlYWtzKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmVkaXRvcj8udmlldztcclxuICAgIGlmICghdmlldykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIHZpZXcgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IHBhc3RlZCB0ZXh0LicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gdGhpcy5wbGFpblRleHRUb0VkaXRvckh0bWwodmFsdWUpO1xyXG5cclxuICAgIGNvbnN0IHNsaWNlID0gUHJvc2VNaXJyb3JET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSkucGFyc2VTbGljZShjb250YWluZXIpO1xyXG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnJlcGxhY2VTZWxlY3Rpb24oc2xpY2UpLnNjcm9sbEludG9WaWV3KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwbGFpblRleHRUb0VkaXRvckh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhPy5FbnRlcktleUJlaGF2aW9yID09PSAncGFyYWdyYXBoJykge1xyXG4gICAgICByZXR1cm4gbGluZXNcclxuICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50cmltKCkgPyBgPHA+JHt0aGlzLmVzY2FwZUh0bWwobGluZSl9PC9wPmAgOiAnPHA+PGJyPjwvcD4nKVxyXG4gICAgICAgIC5qb2luKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYDxwPiR7bGluZXMubWFwKGxpbmUgPT4gdGhpcy5lc2NhcGVIdG1sKGxpbmUpKS5qb2luKCc8YnI+Jyl9PC9wPmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxyXG4gICAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcclxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpXHJcbiAgICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxyXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIHRleHQgbm9kZXMgaW5zaWRlIHBhc3RlZCBIVE1MIHdpdGhvdXQgdG91Y2hpbmcgdGFncywgc3R5bGVzLCBsaW5rcywgb3IgaW1hZ2UgYXR0cmlidXRlcy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZEh0bWwoZTogRWRpdG9yUGFzdGVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGVhbmVkID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuICAgIGlmICghY2xlYW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRvYzogRG9jdW1lbnQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGNsZWFuZWQsICd0ZXh0L2h0bWwnKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHBhcnNlIHBhc3RlZCBIVE1MIGZvciBzeW1ib2wgbm9ybWFsaXphdGlvbi4gUGFzdGUgd2lsbCBjb250aW51ZS4nLCBlcnIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIoZG9jLmJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcclxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlLnRleHRDb250ZW50ID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KG5vZGUudGV4dENvbnRlbnQgPz8gJycpO1xyXG4gICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jKTtcclxuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZW1wdHlQYXJhZ3JhcGhzID0gQXJyYXkuZnJvbShkb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdwJykpLmZpbHRlcihwYXJhZ3JhcGggPT5cclxuICAgICAgdGhpcy5pc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaCksXHJcbiAgICApO1xyXG5cclxuICAgIGVtcHR5UGFyYWdyYXBocy5mb3JFYWNoKHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucmVtb3ZlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaDogSFRNTFBhcmFncmFwaEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFsbG93ZWRFbXB0eU5vZGVzID0gQXJyYXkuZnJvbShwYXJhZ3JhcGguY2hpbGROb2RlcykuZXZlcnkobm9kZSA9PiB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIHJldHVybiAhKG5vZGUudGV4dENvbnRlbnQgPz8gJycpLnRyaW0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnInO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWRFbXB0eU5vZGVzICYmICEocGFyYWdyYXBoLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGtub3duIHBhc3RlIHN5bWJvbCB2YXJpYW50cyBmcm9tIE9mZmljZS9lbWFpbCBjb250ZW50IGludG8gc3RhYmxlIGRpc3BsYXkgY2hhcmFjdGVycy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZFRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQgfHwgIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbm9ybWFsaXplZCA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVIdG1sRW50aXRpZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmFtcDsnLCAnJicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZsdDsnLCAnPCcpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZndDsnLCAnPicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZxdW90OycsICdcIicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyYjMzk7JywgXCInXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVEYXNoKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUyMDEwXFx1MjAxMVxcdTIwMTJcXHUyMDEzXFx1MjAxNFxcdTIyMTJdL2csICctJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZVF1b3Rlcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxyXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MjAxOFxcdTIwMTlcXHUyMDFBXFx1MjAxQl0vZywgXCInXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDFDXFx1MjAxRFxcdTIwMUVcXHUyMDFGXS9nLCAnXCInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplU3BhY2VzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUwMEEwXFx1MjAyRlxcdTIwMDddL2csICcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZUVsbGlwc2lzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1xcdTIwMjYvZywgJy4uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFwcGx5Q3VzdG9tU3ltYm9sUmVwbGFjZW1lbnRzKG5vcm1hbGl6ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUN1c3RvbVN5bWJvbFJlcGxhY2VtZW50cyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMucmVkdWNlKChyZXN1bHQsIHJlcGxhY2VtZW50KSA9PiB7XHJcbiAgICAgIGlmICghcmVwbGFjZW1lbnQ/LkZyb20pIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXBsYWNlbWVudC5Jc1JlZ2V4KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlbWVudC5Gcm9tLCByZXBsYWNlbWVudC5GbGFncyB8fCAnZycpLCByZXBsYWNlbWVudC5UbyA/PyAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2VBbGwocmVwbGFjZW1lbnQuRnJvbSwgcmVwbGFjZW1lbnQuVG8gPz8gJycpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gSW52YWxpZCBjdXN0b20gc3ltYm9sIHJlcGxhY2VtZW50IHNraXBwZWQuJywgeyByZXBsYWNlbWVudCwgZXJyIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH0sIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYW5kIGNvbXByZXNzIG1vZGUgaXMgT04sIGNvbXByZXNzIGFueSBwYXN0ZWQgYmFzZTY0IGltYWdlcyAoZGF0YTppbWFnZS8qKS5cclxuICAgKiBJTVBPUlRBTlQ6IG1vZGlmaWVzIGUuY2xlYW5lZEh0bWwgKHdoYXQgZ2V0cyBwYXN0ZWQpLCBub3QgZWRpdG9yLnZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW1hZ2VDb21wcmVzc2lvbihlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlzQ29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuICAgIGlmICghaXNDb21wcmVzc2lvbkVuYWJsZWQgfHwgIXRoaXMuaXNDb21wcmVzc01vZGVPbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcbiAgICBpZiAoIWNsZWFuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkb2M6IERvY3VtZW50O1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhjbGVhbmVkLCAndGV4dC9odG1sJyk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byBwYXJzZSBwYXN0ZWQgSFRNTCBmb3IgaW1hZ2UgY29tcHJlc3Npb24uIFBhc3RlIHdpbGwgY29udGludWUuJywgZXJyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0VsZW1lbnRzID0gQXJyYXkuZnJvbShkb2MucXVlcnlTZWxlY3RvckFsbCgnaW1nJykpXHJcbiAgICAgIC5tYXAoaW1nID0+IGltZyBhcyBIVE1MSW1hZ2VFbGVtZW50KVxyXG4gICAgICAuZmlsdGVyKGltZyA9PiB0eXBlb2YgaW1nPy5zcmMgPT09ICdzdHJpbmcnICYmIGltZy5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS8nKSk7XHJcblxyXG4gICAgaWYgKGltZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJlZm9yZVNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgYWZ0ZXJTaXplQnl0ZXMgPSAwO1xyXG4gICAgbGV0IGZhaWxlZENvdW50ID0gMDtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW1nRWxlbWVudHMubWFwKGFzeW5jIChpbWcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3JjID0gaW1nLnNyYztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmJhc2U2NFRvRmlsZShzcmMsIGBwYXN0ZWQtaW1hZ2UtJHtpbmRleH1gKTtcclxuICAgICAgICAgIGJlZm9yZVNpemVCeXRlcyArPSBmaWxlLnNpemU7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbihmaWxlKTtcclxuICAgICAgICAgIGlmICghY29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gc2tpcHBlZC9mYWlsZWQgZm9yIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChjb21wcmVzc2VkKTtcclxuICAgICAgICAgIGFmdGVyU2l6ZUJ5dGVzICs9IGNvbXByZXNzZWQuc2l6ZTtcclxuICAgICAgICAgIGltZy5zcmMgPSBiYXNlNjQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIEVycm9yIGNvbXByZXNzaW5nIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmAsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gSGVscGZ1bCBjb25zb2xlIGxvZ3MgZm9yIHRyb3VibGVzaG9vdGluZy5cclxuICAgIGNvbnN0IGJlZm9yZUtiID0gKGJlZm9yZVNpemVCeXRlcyAvIDEwMjQpLnRvRml4ZWQoMik7XHJcbiAgICBjb25zdCBhZnRlcktiID0gKGFmdGVyU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtadGV4dGVkaXRvcl0gUGFzdGVkIGltYWdlIGNvbXByZXNzaW9uIGNvbXBsZXRlZC4gSW1hZ2VzPSR7aW1nRWxlbWVudHMubGVuZ3RofSwgRmFpbGVkPSR7ZmFpbGVkQ291bnR9LCBCZWZvcmU9JHtiZWZvcmVLYn1LQiwgQWZ0ZXI9JHthZnRlcktifUtCYCxcclxuICAgICk7XHJcblxyXG4gICAgLy8gTW9kaWZ5IHdoYXQgZ2V0cyBwYXN0ZWQsIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbXByZXNzIG1vZGUgdmlhIGNvbmZpcm1hdGlvbiBkaWFsb2cuXHJcbiAgICovXHJcbiAgcHVibGljIG9uT2ZmQ29tcHJlc3NNb2RlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZGVyID0gJ0NvbmZpcm1hdGlvbic7XHJcbiAgICBjb25zdCBhY3Rpb25UZXh0ID0gdGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ2Rpc2FibGUnIDogJ2VuYWJsZSc7XHJcblxyXG4gICAgLy8gS2VlcCBleGlzdGluZyBiZWhhdmlvcjogdG9nZ2xpbmcgcmVzZXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtZXNzYWdlID1cclxuICAgICAgYERvIHlvdSB3YW50IHRvIDxiPiR7YWN0aW9uVGV4dH08L2I+IGltYWdlIGNvbXByZXNzaW9uIHdoZW4gaW5wdXQgY29udGVudD9gICtcclxuICAgICAgYDxici8+Tm90ZTogQ2xpY2sgXCJZZXNcIiB0aGUgY29udGVudCB3aWxsIGJlIHJlc2V0IHRvIGJsYW5rLmA7XHJcblxyXG4gICAgY29uc3QgYnV0dG9ucyA9IHtcclxuICAgICAgeWVzOiB7IHRleHQ6ICdZZXMnLCBjc3NDbGFzczogJ3ByaW1hcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgIG5vOiB7IHRleHQ6ICdObycsIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhoZWFkZXIsIG1lc3NhZ2UsIFtidXR0b25zLnllcywgYnV0dG9ucy5ub10sIFsnY29sLTQnXSlcclxuICAgICAgLnN1YnNjcmliZShyZXBseSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5ICE9PSAnWWVzJykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgdG9nZ2xlIGNvbXByZXNzaW9uIG1vZGUuJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IudmFsdWUgPSAnJztcclxuICAgICAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhdGhpcy5pc0NvbXByZXNzTW9kZU9uO1xyXG5cclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFxyXG4gICAgICAgICAgYCR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ0VuYWJsZScgOiAnRGlzYWJsZSd9IGltYWdlIGNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseS5gLFxyXG4gICAgICAgICAgJ3RvcCcsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIDI1MDAsXHJcbiAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhckljb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgay1pLWltYWdlICR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gdGhpcy5jb21wcmVzc2lvbkRpc2FibGVkSWNvbiA6IHRoaXMuY29tcHJlc3Npb25FbmFibGVJY29ufWA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBhcHBseSBsaXN0IGZvcm1hdHRpbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9nZ2xlSGFyZEJyZWFrTGlzdChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVkaXRvci5leGVjKGNvbW1hbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVIYXJkQnJlYWtMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFJhbmdlID0gdGhpcy5maW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTtcbiAgICBpZiAobGlzdFJhbmdlKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuZ2V0TGlzdEl0ZW1MaW5lcyhsaXN0UmFuZ2Uubm9kZSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VSYW5nZVdpdGhIdG1sKGxpc3RSYW5nZS5mcm9tLCBsaXN0UmFuZ2UudG8sIHRoaXMubGluZXNUb0hhcmRCcmVha1BhcmFncmFwaEh0bWwobGluZXMpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYWdyYXBoUmFuZ2UgPSB0aGlzLmZpbmRTZWxlY3RlZEhhcmRCcmVha1BhcmFncmFwaFJhbmdlKCk7XG4gICAgaWYgKCFwYXJhZ3JhcGhSYW5nZSB8fCAhdGhpcy5oYXNIYXJkQnJlYWsocGFyYWdyYXBoUmFuZ2Uubm9kZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBsYWNlbWVudEh0bWwgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRQYXJhZ3JhcGhMaXN0SHRtbChwYXJhZ3JhcGhSYW5nZSwgY29tbWFuZCk7XG4gICAgaWYgKCFyZXBsYWNlbWVudEh0bWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcGxhY2VSYW5nZVdpdGhIdG1sKHBhcmFncmFwaFJhbmdlLmZyb20sIHBhcmFncmFwaFJhbmdlLnRvLCByZXBsYWNlbWVudEh0bWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQW5jZXN0b3JSYW5nZShub2RlTmFtZXM6IHN0cmluZ1tdKTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3I/LnZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWxlY3Rpb24uJGZyb20uZGVwdGg7IGRlcHRoID4gMDsgZGVwdGgtLSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbi4kZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgIGlmIChub2RlTmFtZXMuaW5jbHVkZXMobm9kZS50eXBlLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBmcm9tOiBzZWxlY3Rpb24uJGZyb20uYmVmb3JlKGRlcHRoKSxcbiAgICAgICAgICB0bzogc2VsZWN0aW9uLiRmcm9tLmFmdGVyKGRlcHRoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlbGVjdGVkTGlzdFJhbmdlKCk6IHsgbm9kZTogYW55OyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmVkaXRvcj8udmlldztcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB2aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCF2aWV3IHx8ICFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5maW5kQW5jZXN0b3JSYW5nZShbJ2J1bGxldF9saXN0JywgJ29yZGVyZWRfbGlzdCddKTtcbiAgICBpZiAoYW5jZXN0b3IpIHtcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcbiAgICB9XG5cbiAgICBsZXQgc2VsZWN0ZWRMaXN0OiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB2aWV3LnN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oc2VsZWN0aW9uLmZyb20sIHNlbGVjdGlvbi50bywgKG5vZGU6IGFueSwgcG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZExpc3QgfHwgIVsnYnVsbGV0X2xpc3QnLCAnb3JkZXJlZF9saXN0J10uaW5jbHVkZXMobm9kZS50eXBlPy5uYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0ZWRMaXN0ID0ge1xuICAgICAgICBub2RlLFxuICAgICAgICBmcm9tOiBwb3MsXG4gICAgICAgIHRvOiBwb3MgKyBub2RlLm5vZGVTaXplLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkTGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlbGVjdGVkSGFyZEJyZWFrUGFyYWdyYXBoUmFuZ2UoKTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXZpZXcgfHwgIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLmZpbmRBbmNlc3RvclJhbmdlKFsncGFyYWdyYXBoJ10pO1xuICAgIGlmIChhbmNlc3Rvcj8ubm9kZSAmJiB0aGlzLmhhc0hhcmRCcmVhayhhbmNlc3Rvci5ub2RlKSkge1xuICAgICAgcmV0dXJuIGFuY2VzdG9yO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZFBhcmFncmFwaDogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgdmlldy5zdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKHNlbGVjdGlvbi5mcm9tLCBzZWxlY3Rpb24udG8sIChub2RlOiBhbnksIHBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0ZWRQYXJhZ3JhcGggfHwgbm9kZS50eXBlPy5uYW1lICE9PSAncGFyYWdyYXBoJyB8fCAhdGhpcy5oYXNIYXJkQnJlYWsobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkUGFyYWdyYXBoID0ge1xuICAgICAgICBub2RlLFxuICAgICAgICBmcm9tOiBwb3MsXG4gICAgICAgIHRvOiBwb3MgKyBub2RlLm5vZGVTaXplLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkUGFyYWdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhZ3JhcGhIYXJkQnJlYWtMaW5lcyhwYXJhZ3JhcGg6IGFueSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlVG9IYXJkQnJlYWtUZXh0KHBhcmFncmFwaClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIobGluZSA9PiAhIWxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdGVkUGFyYWdyYXBoTGlzdEh0bWwoXG4gICAgcGFyYWdyYXBoUmFuZ2U6IHsgbm9kZTogYW55OyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSxcbiAgICBjb21tYW5kOiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcgfCAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuZ2V0UGFyYWdyYXBoTGluZVJhbmdlcyhwYXJhZ3JhcGhSYW5nZS5ub2RlLCBwYXJhZ3JhcGhSYW5nZS5mcm9tKTtcbiAgICBjb25zdCBzZWxlY3RlZExpbmVzID0gbGluZXMuZmlsdGVyKGxpbmUgPT4gbGluZS50ZXh0LnRyaW0oKSAmJiBsaW5lLnRvID4gc2VsZWN0aW9uLmZyb20gJiYgbGluZS5mcm9tIDwgc2VsZWN0aW9uLnRvKTtcblxuICAgIGlmIChzZWxlY3RlZExpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RTZWxlY3RlZEluZGV4ID0gbGluZXMuaW5kZXhPZihzZWxlY3RlZExpbmVzWzBdKTtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJbmRleCA9IGxpbmVzLmluZGV4T2Yoc2VsZWN0ZWRMaW5lc1tzZWxlY3RlZExpbmVzLmxlbmd0aCAtIDFdKTtcbiAgICBjb25zdCBiZWZvcmVMaW5lcyA9IGxpbmVzLnNsaWNlKDAsIGZpcnN0U2VsZWN0ZWRJbmRleCkubWFwKGxpbmUgPT4gbGluZS50ZXh0KTtcbiAgICBjb25zdCBhZnRlckxpbmVzID0gbGluZXMuc2xpY2UobGFzdFNlbGVjdGVkSW5kZXggKyAxKS5tYXAobGluZSA9PiBsaW5lLnRleHQpO1xuICAgIGNvbnN0IGxpc3RUYWcgPSBjb21tYW5kID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnID8gJ29sJyA6ICd1bCc7XG4gICAgY29uc3QgbGlzdEh0bWwgPVxuICAgICAgYDwke2xpc3RUYWd9PmAgK1xuICAgICAgc2VsZWN0ZWRMaW5lcy5tYXAobGluZSA9PiBgPGxpPiR7dGhpcy5lc2NhcGVIdG1sKGxpbmUudGV4dC50cmltKCkpfTwvbGk+YCkuam9pbignJykgK1xuICAgICAgYDwvJHtsaXN0VGFnfT5gO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGJlZm9yZUxpbmVzLmxlbmd0aCA/IHRoaXMubGluZXNUb0hhcmRCcmVha1BhcmFncmFwaEh0bWwoYmVmb3JlTGluZXMpIDogJycsXG4gICAgICBsaXN0SHRtbCxcbiAgICAgIGFmdGVyTGluZXMubGVuZ3RoID8gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChhZnRlckxpbmVzKSA6ICcnLFxuICAgIF0uam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFncmFwaExpbmVSYW5nZXMocGFyYWdyYXBoOiBhbnksIHBhcmFncmFwaFBvczogbnVtYmVyKTogQXJyYXk8eyB0ZXh0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9PiB7XG4gICAgY29uc3QgbGluZXM6IEFycmF5PHsgdGV4dDogc3RyaW5nOyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHtcbiAgICAgIHRleHQ6ICcnLFxuICAgICAgZnJvbTogcGFyYWdyYXBoUG9zICsgMSxcbiAgICAgIHRvOiBwYXJhZ3JhcGhQb3MgKyAxLFxuICAgIH07XG5cbiAgICBwYXJhZ3JhcGguZm9yRWFjaCgoY2hpbGQ6IGFueSwgb2Zmc2V0OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkRnJvbSA9IHBhcmFncmFwaFBvcyArIDEgKyBvZmZzZXQ7XG4gICAgICBjb25zdCBjaGlsZFRvID0gY2hpbGRGcm9tICsgY2hpbGQubm9kZVNpemU7XG5cbiAgICAgIGlmIChjaGlsZC50eXBlPy5uYW1lID09PSAnaGFyZF9icmVhaycpIHtcbiAgICAgICAgY3VycmVudC50byA9IGNoaWxkRnJvbTtcbiAgICAgICAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgICAgICAgY3VycmVudCA9IHtcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICBmcm9tOiBjaGlsZFRvLFxuICAgICAgICAgIHRvOiBjaGlsZFRvLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQudGV4dCArPSBjaGlsZC50ZXh0Q29udGVudCA/PyAnJztcbiAgICAgIGN1cnJlbnQudG8gPSBjaGlsZFRvO1xuICAgIH0pO1xuXG4gICAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIGdldExpc3RJdGVtTGluZXMobGlzdDogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGlzdC5mb3JFYWNoKChsaXN0SXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5ub2RlVG9IYXJkQnJlYWtUZXh0KGxpc3RJdGVtKS50cmltKCk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBub2RlVG9IYXJkQnJlYWtUZXh0KG5vZGU6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSAnJztcblxuICAgIG5vZGUuZGVzY2VuZGFudHMoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlPy5uYW1lID09PSAnaGFyZF9icmVhaycpIHtcbiAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIHRleHQgKz0gY2hpbGQudGV4dCA/PyAnJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYXJkQnJlYWsobm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICBub2RlLmRlc2NlbmRhbnRzKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQudHlwZT8ubmFtZSA9PT0gJ2hhcmRfYnJlYWsnKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWZvdW5kO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgPHA+JHtsaW5lcy5tYXAobGluZSA9PiB0aGlzLmVzY2FwZUh0bWwobGluZSkpLmpvaW4oJzxicj4nKX08L3A+YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVJhbmdlV2l0aEh0bWwoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBQcm9zZU1pcnJvckRPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKS5wYXJzZShjb250YWluZXIpLmNvbnRlbnQ7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBmcmFnbWVudCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgdmlldy5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnRlckFzTGluZUJyZWFrUGx1Z2luKCk6IFBsdWdpbiB7XG4gICAgcmV0dXJuIGtleW1hcCh7XG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCBzcGxpdEJsb2NrKSxcbiAgICAgIEVudGVyOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFyZEJyZWFrID0gc3RhdGUuc2NoZW1hLm5vZGVzLmhhcmRfYnJlYWs7XHJcbiAgICAgICAgaWYgKCFoYXJkQnJlYWsgfHwgIXN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XHJcbiAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChoYXJkQnJlYWsuY3JlYXRlKCkpLnNjcm9sbEludG9WaWV3KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1cyBlZGl0b3IgaWYgYXZhaWxhYmxlLiBSZXR1cm5zIHRydWUgaWYgZm9jdXMgc3VjY2VlZGVkLiAqL1xyXG4gIHB1YmxpYyBmb2N1cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb250QXdlc29tZShpY29uTmFtZTogc3RyaW5nLCBmb250QXdlc29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSk6IHVua25vd24ge1xyXG4gICAgY29uc3QgaWNvbk5hbWVWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShpY29uTmFtZSwgdGhpcy5ncm91cCk7XHJcbiAgICBpZiAoaWNvbk5hbWVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShpY29uTmFtZVZhbHVlLCBmb250QXdlc29tZVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGljb25OYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIEtlbmRvIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgZnJvbSBQYXN0ZUNsZWFudXBTZXR0aW5ncywgd2l0aCBkYXRhLk9wdGlvbnMga2VwdCBhcyBhIGxlZ2FjeSBmYWxsYmFjay4gKi9cclxuICBwcml2YXRlIHNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kYXRhPy5QYXN0ZUNsZWFudXBTZXR0aW5ncyA/PyB0aGlzLmRhdGE/Lk9wdGlvbnM7XHJcbiAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUob3B0aW9ucywgdGhpcy5ncm91cCk7XHJcbiAgICAgIGlmIChyZXNvbHZlZCAmJiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhc3RlQ2xlYW51cFNldHRpbmdzLCByZXNvbHZlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGNsZWFudXAgc2V0dGluZ3MgcmVzb2x2ZWQgdmFsdWUgaXMgbm90IGFuIG9iamVjdC4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgICAgIHJlc29sdmVkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5zdXBwb3J0ZWQgcGFzdGUgY2xlYW51cCBzZXR0aW5ncyB0eXBlLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICB0eXBlOiB0eXBlb2Ygb3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgb3B0aW9uYWwgcGFzdGUgc3ltYm9sIG5vcm1hbGl6YXRpb24gc2V0dGluZ3MgZnJvbSBmaWVsZCBjb25maWcuICovXHJcbiAgcHJpdmF0ZSBzZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5kYXRhPy5TeW1ib2xOb3JtYWxpemF0aW9uO1xyXG4gICAgaWYgKHNldHRpbmdzID09PSB1bmRlZmluZWQgfHwgc2V0dGluZ3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdib29sZWFuJykge1xyXG4gICAgICB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkID0gc2V0dGluZ3M7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCByZXNvbHZlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzZXR0aW5ncywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MocmVzb2x2ZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHNldHRpbmdzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzZXR0aW5ncyB8fCB0eXBlb2Ygc2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2V0dGluZ3MpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTeW1ib2xOb3JtYWxpemF0aW9uIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhIHN1cHBvcnRlZCBjb25maWcuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncywgc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzID1cclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMpXHJcbiAgICAgICAgPyB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHNcclxuICAgICAgICA6IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBDdXN0b20gSW1hZ2UgVXBsb2FkIC8gRW5sYXJnZVxyXG5cclxuICAvKiogVHJpZ2dlciBoaWRkZW4gZmlsZSBpbnB1dCBjbGljayBmb3IgaW1hZ2UgdXBsb2FkLiAqL1xyXG4gIHB1YmxpYyBvcGVuRmlsZUV4cGxvcmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBgJHt0aGlzLmRhdGEuVmFsdWV9LXVwbG9hZC1maWxlYDtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbnB1dCBlbGVtZW50IG5vdCBmb3VuZCAoaWQ9XCIke2lkfVwiKS5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbiBhbiBlbmxhcmdlZCBwb3B1cCBlZGl0b3IuICovXHJcbiAgcHVibGljIG9wZW5Qb3B1cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBvcGVuIHBvcHVwLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBkaWFsb2dcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgd2lkdGg6ICc5OCUnLFxyXG4gICAgICBoZWlnaHQ6ICc5NyUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXBDb21wb25lbnQgPSB0aGlzLmRpYWxvZ1JlZi5jb250ZW50Lmluc3RhbmNlIGFzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEuQWxsb3dFbmxhcmdlID0gZmFsc2U7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZjtcclxuICAgIHBvcHVwQ29tcG9uZW50LkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIHN0eWxlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNsb3NlLlxyXG4gICAgdGhpcy5vcmlnaW5hbElubGluZVN0eWxlID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxID8/ICcnO1xyXG4gICAgaWYgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXM/LnN0eWxlKSB7XHJcbiAgICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID1cclxuICAgICAgICAocG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPz8gJycpICtcclxuICAgICAgICBgaGVpZ2h0OiR7KHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCkudG9TdHJpbmcoKX1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdXBDb21wb25lbnQuZ3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50U2V0dGluZ3MgPSB0aGlzLmNvbXBvbmVudFNldHRpbmdzO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZm9ybSA9IHRoaXMuZm9ybTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIHN0YXRlIGFuZCBwdXNoIHZhbHVlIGJhY2sgaW50byBlZGl0b3Igb24gY2xvc2UuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRhLkFsbG93RW5sYXJnZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPSB0aGlzLm9yaWdpbmFsSW5saW5lU3R5bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFB1bGwgY3VycmVudCB6TW9kZWwgaW50byBlZGl0b3IgYW5kIHRyaWdnZXIgb25DaGFuZ2UgKGV4aXN0aW5nIGJlaGF2aW9yKS5cclxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdyb3VwPy56TW9kZWw/Llt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgICBlZGl0b3IudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlIHRoZSBwb3B1cCBlZGl0b3IgaWYgb3Blbi4gKi9cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIDxpbnB1dCB0eXBlPVwiZmlsZVwiPiBjaGFuZ2UgYW5kIGluc2VydCBzZWxlY3RlZCBpbWFnZSBpbnRvIGVkaXRvci5cclxuICAgKiBOT1RFOiBQcmVmZXIgdHlwaW5nIGZpbGVJbnB1dCBhcyBFdmVudCBmb3IgYmV0dGVyIHNhZmV0eS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSW1hZ2UoZmlsZUlucHV0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dD8uZmlsZXM/LlswXTtcclxuXHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIE5vIGltYWdlIHNlbGVjdGVkIGZvciB1cGxvYWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2b2lkIHRoaXMuaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBpbWFnZSBpbnRvIGVkaXRvciwgb3B0aW9uYWxseSBjb21wcmVzc2luZyBmaXJzdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIGluc2VydEltYWdlSW50b0VkaXRvcihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IGltYWdlLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdvcmtpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IGZpbGU7XHJcblxyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG5cclxuICAgIGlmIChjb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtadGV4dGVkaXRvcl0gVXBsb2FkIGltYWdlIGJlZm9yZSBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuXHJcbiAgICAgIHdvcmtpbmdGaWxlID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKHdvcmtpbmdGaWxlKTtcclxuICAgICAgaWYgKCF3b3JraW5nRmlsZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBmYWlsZWQuIFVwbG9hZCBpbWFnZSBpbnNlcnRpb24gYWJvcnRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBhZnRlciBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKHdvcmtpbmdGaWxlKTtcclxuICAgICAgZWRpdG9yLmV4ZWMoJ2luc2VydEltYWdlJywgeyBzcmM6IGJhc2U2NCB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHJlYWQgdXBsb2FkZWQgaW1hZ2UgYXMgYmFzZTY0LicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydCBiYXNlNjQgKGRhdGEgVVJMKSB0byBGaWxlLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvLyBVc2luZyBmZXRjaCBvbiBkYXRhIFVSTCBpcyBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzOyBrZWVwIGV4aXN0aW5nIGxvZ2ljLlxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlNjRTdHJpbmcpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge1xyXG4gICAgICB0eXBlOiBibG9iLnR5cGUsXHJcbiAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyBhbiBpbWFnZSBhbmQgYWJvdmUgbWluIHRocmVzaG9sZC5cclxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBmaWxlIHdoZW4gY29tcHJlc3Npb24gaXMgc2tpcHBlZCwgYW5kIG51bGwgb25seSB3aGVuIGNvbXByZXNzaW9uIGZhaWxzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaW1hZ2VDb21wcmVzc2lvbihmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBpbWFnZUNvbXByZXNzaW9uIGNhbGxlZCB3aXRoIGVtcHR5IGZpbGUuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmlsZS50eXBlIHx8ICFmaWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJykpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIGlzIG5vdCBhbiBpbWFnZS4nLCB7IHR5cGU6IGZpbGUudHlwZSB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgLy8gQ29tcHJlc3Npb24gbm90IGNvbmZpZ3VyZWQ7IGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0NvbmZpZyA9IHRoaXMuY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGNvbmZpZyk7XHJcblxyXG4gICAgLy8gSWYgZmlsZSBpcyBiZWxvdyB0aHJlc2hvbGQsIGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICBpZiAoZmlsZS5zaXplIDw9IGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIHNpemUgJHsoZmlsZS5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX1LQiBpcyBiZWxvdyB0aHJlc2hvbGQgJHsoaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCLmAsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWQkID0gdGhpcy5jb21wcmVzc0ltYWdlLmNvbXByZXNzKGZpbGUsIGltZ0NvbmZpZyk7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY29tcHJlc3NlZCQpO1xyXG4gICAgICByZXR1cm4gY29tcHJlc3NlZEZpbGUgPz8gbnVsbDtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gQ29tcHJlc3Npb24gc2VydmljZSB0aHJldyBhbiBlcnJvci4nLCBlcnIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgaW1hZ2UgY29tcHJlc3Npb24gY29uZmlnIGludG8gYnl0ZS1iYXNlZCB0aHJlc2hvbGRzLiAqL1xyXG4gIHByaXZhdGUgY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGltZ0NvbmZpZzogSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyk6IEltYWdlQ29tcHJlc3Npb25Db25maWcge1xyXG4gICAgaWYgKCFpbWdDb25maWcpIHtcclxuICAgICAgLy8gRGVmZW5zaXZlOiBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY2FsbGVyIGNoZWNrcy5cclxuICAgICAgcmV0dXJuIGltZ0NvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSkge1xyXG4gICAgICBpbWdDb25maWcuRmlsZVNpemVNYXhTaXplQnl0ZSA9IHRoaXMuY29udmVydFNpemVUb0J5dGUoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIGxpa2UgXCIxMDBrYlwiLCBcIjEgTUJcIiwgXCIyZ2JcIiB0byBieXRlcy5cclxuICAgKiBJZiBubyB1bml0IGlzIHByb3ZpZGVkLCBieXRlcyBhcmUgYXNzdW1lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRTaXplVG9CeXRlKHNpemVTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoIXNpemVTdHJpbmcgfHwgdHlwZW9mIHNpemVTdHJpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBjb252ZXJ0U2l6ZVRvQnl0ZSByZWNlaXZlZCBpbnZhbGlkIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBhbGwgc3BhY2VzLCBlLmcuIFwiMSBNQlwiIC0+IFwiMU1CXCJcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBzaXplU3RyaW5nLnJlcGxhY2UoLyAvZywgJycpLnRyaW0oKTtcclxuICAgIGlmICghdHJpbW1lZCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHRyYWN0IG51bWVyaWMgcGFydCBhbmQgdW5pdCBwYXJ0IChsZXR0ZXJzKS5cclxuICAgIC8vIEV4YW1wbGU6IFwiMS41TUJcIiA9PiBudW1iZXI9MS41LCB1bml0PVwibWJcIlxyXG4gICAgY29uc3QgbWF0Y2ggPSAvXihbMC05XSpcXC4/WzAtOV0rKShbYS16QS1aXSopJC8uZXhlYyh0cmltbWVkKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuYWJsZSB0byBwYXJzZSBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKG1hdGNoWzFdKTtcclxuICAgIGNvbnN0IHVuaXQgPSAobWF0Y2hbMl0gfHwgJ2InKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtZXJpYykgfHwgbnVtZXJpYyA8IDApIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEludmFsaWQgbnVtZXJpYyBzaXplIGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICBjYXNlICdiJzpcclxuICAgICAgY2FzZSAnJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgICAgY2FzZSAna2InOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNDtcclxuICAgICAgY2FzZSAnbWInOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ2diJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0ICogMTAyNDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5rbm93biB1bml0IGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gYnl0ZXMuJywgeyBzaXplU3RyaW5nLCB1bml0IH0pO1xyXG4gICAgICAgIHJldHVybiBudW1lcmljO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlYWQgYSBGaWxlIGFzIGJhc2U2NCBkYXRhIFVSTC4gKi9cclxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmlsZSBpcyByZXF1aXJlZC4nKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ6dGV4dGVkaXRvci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGV4cGFuZC1idG4tY29udGFpbmVyXCI+XHJcbiAgPGlvbi1idXR0b24gICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJkYXRhLkFsbG93RW5sYXJnZVwiIChjbGljayk9XCJvcGVuUG9wdXAoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2ZhRXhwYW5kQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbiAgPGlvbi1idXR0b24gIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiAqbmdJZj1cIkNsb3NlRW5sYXJnZUJ0blwiIChjbGljayk9XCJvblBvcHVwQ2xvc2UoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUNvbXByZXNzQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbjwvZGl2PlxyXG4gIDxrZW5kby1lZGl0b3IgI2VkaXRvclxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiZGF0YS5SZXNpemFibGUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BsdWdpbnNdPVwicGx1Z2luc0NhbGxiYWNrXCJcclxuICAgICAgICAgICAgICAgIFtwYXN0ZUNsZWFudXBTZXR0aW5nc109XCJwYXN0ZUNsZWFudXBTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpZnJhbWVdPVwiY29tcG9uZW50U2V0dGluZ3MuaWZyYW1lXCI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnYmFzaWMnXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3I+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBpY29uPVwibGlzdC1vcmRlcmVkXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRGaWxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiIFtpY29uXT1cImNvbXByZXNzaW9uVG9vbGJhckljb25cIiAoY2xpY2spPVwib25PZmZDb21wcmVzc01vZGUoKVwiIFt0aXRsZV09XCJjb21wcmVzc2lvblRvb2xiYXJUaXRsZVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwva2VuZG8tdG9vbGJhcj5cclxuICAgIDxrZW5kby10b29sYmFyICpuZ0lmPVwiZGF0YS5Ub29sQmFyU3R5bGUgPT09ICdmdWxsJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBpY29uPVwibGlzdC1vcmRlcmVkXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JNZXJnZUNlbGxzQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3BsaXRDZWxsQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgPC9rZW5kby1lZGl0b3I+XHJcbiAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHR5cGU9XCJmaWxlXCIgW2lkXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgW25hbWVdPVwiZGF0YS5WYWx1ZSArJy11cGxvYWQtZmlsZSdcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbmdmLW1heC1zaXplPVwiNU1CXCIgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCI+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
953
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsSUFBSSxvQkFBb0IsRUFDakMsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1gsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qyw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxD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QUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDdkMsT0FBTzthQUNSO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFnQixDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7aUhBcm9DVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixnTEN2Q2pDLDBuVkEySUE7MkZEcEdhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxpQkFBaUI7OFBBS0MsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgRWRpdG9yQ29tcG9uZW50LCBFZGl0b3JQYXN0ZUV2ZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZWRpdG9yJztcclxuaW1wb3J0IHsgRGlhbG9nUmVmLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGlhbG9nJztcclxuaW1wb3J0IHtcclxuICBjaGFpbkNvbW1hbmRzLFxyXG4gIERPTVBhcnNlciBhcyBQcm9zZU1pcnJvckRPTVBhcnNlcixcclxuICBleGl0Q29kZSxcclxuICBrZXltYXAsXHJcbiAgUGx1Z2luLFxyXG4gIHNwbGl0QmxvY2tcclxufSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZWRpdG9yLWNvbW1vbic7XHJcblxyXG4vKioqKioqKioqKiBSeEpTICoqKioqKioqKiovXHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IElucHV0RmllbGRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sXHJcbiAgQWxlcnRTZXJ2aWNlLFxyXG4gIENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gIEZvbnRBd2VTb21lU2VydmljZSxcclxuICBJbWFnZUNvbXByZXNzaW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xOb3JtYWxpemF0aW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xSZXBsYWNlbWVudCxcclxuICBUb2FzdFNlcnZpY2UsXHJcbiAgWkNvbXBvbmVudCxcclxuICBaQ29tcG9uZW50SGVscGVyXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXp0ZXh0ZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4venRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p0ZXh0ZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadGV4dGVkaXRvckNvbXBvbmVudCBleHRlbmRzIElucHV0RmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBAVmlld0NoaWxkKCdlZGl0b3InKSBwdWJsaWMgZWRpdG9yITogRWRpdG9yQ29tcG9uZW50O1xyXG5cclxuICBwdWJsaWMgcGFzdGVDbGVhbnVwU2V0dGluZ3M6IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogYm9vbGVhbjtcclxuICAgIHJlbW92ZU1zU3R5bGVzOiBib29sZWFuO1xyXG4gICAgcmVtb3ZlSW52YWxpZEhUTUw6IGJvb2xlYW47XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbiAgfSA9IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogZmFsc2UsXHJcbiAgICByZW1vdmVNc1N0eWxlczogZmFsc2UsXHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzOiB7IGlmcmFtZTogYm9vbGVhbjsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBpZnJhbWU6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5nczogUmVxdWlyZWQ8T21pdDxUZXh0RWRpdG9yU3ltYm9sTm9ybWFsaXphdGlvbkNvbmZpZywgJ0N1c3RvbVJlcGxhY2VtZW50cyc+PiAmIHtcclxuICAgIEN1c3RvbVJlcGxhY2VtZW50czogVGV4dEVkaXRvclN5bWJvbFJlcGxhY2VtZW50W107XHJcbiAgfSA9IHtcclxuICAgIEVuYWJsZWQ6IHRydWUsXHJcbiAgICBOb3JtYWxpemVIdG1sRW50aXRpZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVEYXNoOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplUXVvdGVzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplU3BhY2VzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplRWxsaXBzaXM6IHRydWUsXHJcbiAgICBDdXN0b21SZXBsYWNlbWVudHM6IFtdLFxyXG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnNDYWxsYmFjayA9IChkZWZhdWx0UGx1Z2luczogUGx1Z2luW10pOiBQbHVnaW5bXSA9PiB7XG4gICAgaWYgKHRoaXMuaXNQYXJhZ3JhcGhFbnRlckJlaGF2aW9yKCkpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0UGx1Z2lucztcbiAgICB9XG5cbiAgICByZXR1cm4gW3RoaXMuZW50ZXJBc0xpbmVCcmVha1BsdWdpbigpLCAuLi5kZWZhdWx0UGx1Z2luc107XG4gIH07XG5cclxuICBwdWJsaWMgaXNDb21wcmVzc01vZGVPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBDbG9zZUVubGFyZ2VCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGRpYWxvZ1JlZj86IERpYWxvZ1JlZjtcclxuXHJcbiAgcHJpdmF0ZSBvcmlnaW5hbElubGluZVN0eWxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkVuYWJsZUljb246IHN0cmluZyA9ICdrLWktem9vbS1iZXN0LWZpdCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkRpc2FibGVkSWNvbjogc3RyaW5nID0gJ2staS16b29tLWFjdHVhbC1zaXplJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEF3ZVNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc0ltYWdlOiBDb21wcmVzc0ltYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplIGNvbXBvbmVudCBzdGF0ZSBhbmQgZWRpdG9yIGNvbmZpZ3VyYXRpb24uICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcblxyXG4gICAgLy8gQmFja3dhcmQtY29tcGF0aWJsZSBkZWZhdWx0OiB3aGVuIG5vdCBwcm92aWRlZCwgdXNlIGV4cGxvcmVyLlxyXG4gICAgdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9IHRoaXMuZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgfHwgJ2V4cGxvcmVyJztcclxuXHJcbiAgICB0aGlzLnNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuc2V0dXBTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MoKTtcclxuICAgIHN1cGVyLnNldHVwQ29tcG9uZW50U2V0dGluZ3ModGhpcy5jb21wb25lbnRTZXR0aW5ncyk7XHJcbiAgICBzdXBlci5mb2N1c09uRGVmYXVsdCh0aGlzLmZvY3VzLmJpbmQodGhpcykpO1xyXG5cclxuICAgIC8vIFNhZmUgY2FzdCB0byBib29sZWFuLlxyXG4gICAgdGhpcy5pc0NvbXByZXNzTW9kZU9uID0gISF0aGlzLmRhdGE/LkNvbXByZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5vdGlmeSBjb21wb25lbnQgc2VydmljZSBvbmNlIHZpZXcgaXMgcmVhZHkuICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTeW5jIGVkaXRvciBjb250ZW50IHRvIHpNb2RlbCBhbmQgdHJpZ2dlciBjb25maWd1cmVkIGNoYW5nZSBoYW5kbGVyLiAqL1xyXG4gIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRUb1pNb2RlbCh0aGlzLmRhdGEuVmFsdWUsIHZhbHVlLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2lucHV0ZmllbGQtb25DaGFuZ2UnLCB0aGlzLmRhdGEuT25DaGFuZ2UsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kbGUgcGFzdGU6IG5vcm1hbGl6ZSBwbGFpbi10ZXh0IHNwZWNpYWwgZW50aXRpZXMsIHRoZW4gb3B0aW9uYWxseSBjb21wcmVzcyBwYXN0ZWQgYmFzZTY0IGltYWdlcy4gKi9cclxuICBwdWJsaWMgYXN5bmMgb25QYXN0ZShlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGV2ZW50IGlzIHVuZGVmaW5lZC4gUGFzdGUgaWdub3JlZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbW1vbiBFeGNlbC9wbGFpbi10ZXh0IGlzc3VlOiBcIiZhbXA7XCIgZ2V0cyBpbnNlcnRlZCBsaXRlcmFsbHkgY2F1c2luZyBcIiZhbXA7YW1wO1wiIGluIEhUTUwuXHJcbiAgICBjb25zdCBpc0hhbmRsZWQgPSB0aGlzLmhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZSk7XHJcbiAgICBpZiAoaXNIYW5kbGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vcm1hbGl6ZVBhc3RlZEh0bWwoZSk7XHJcblxyXG4gICAgLy8gQ29tcHJlc3Mgb25seSBpZiBlbmFibGVkIGFuZCBiYXNlNjQgaW1hZ2VzIGV4aXN0LlxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbWFnZUNvbXByZXNzaW9uKGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgdGhlIHBhc3RlIGlzIHBsYWluIHRleHQgKG5vIEhUTUwgdGFncyBhbmQgbm8gaW1hZ2VzKSwgbm9ybWFsaXplIGNvbW1vbiBlbnRpdGllcyBhbmQgaW5zZXJ0IGFzIHJlYWwgdGV4dC5cclxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZXZlbnQgaXMgaGFuZGxlZCBhbmQgZGVmYXVsdCBwYXN0ZSBpcyBwcmV2ZW50ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb21tb25TeW1ib2xUYWdzKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBoYW5kbGUgcGxhaW4tdGV4dCBub3JtYWxpemF0aW9uLicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xpcGJvYXJkID0gKGUub3JpZ2luYWxFdmVudCBhcyBDbGlwYm9hcmRFdmVudCB8IHVuZGVmaW5lZCk/LmNsaXBib2FyZERhdGE7XHJcbiAgICBjb25zdCBwbGFpblRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvcGxhaW4nKSA/PyAnJztcclxuICAgIGNvbnN0IGh0bWxUZXh0ID0gY2xpcGJvYXJkPy5nZXREYXRhKCd0ZXh0L2h0bWwnKSA/PyAnJztcclxuICAgIGNvbnN0IGNsZWFuZWRIdG1sID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuXHJcbiAgICBjb25zdCBodG1sSGFzSW1nID0gLzxpbWdcXGIvaS50ZXN0KGh0bWxUZXh0KTtcclxuICAgIGNvbnN0IGNsZWFuZWRIYXNUYWdzID0gLzxbXj5dKz4vLnRlc3QoY2xlYW5lZEh0bWwpO1xyXG5cclxuICAgIC8vIElmIHBhc3RlIGhhcyBIVE1MIHRhZ3Mgb3IgaW1hZ2VzLCBkbyBOT1QgaW50ZXJmZXJlIChsZXQgS2VuZG8gaGFuZGxlIGl0KS5cclxuICAgIGlmIChodG1sSGFzSW1nIHx8IGNsZWFuZWRIYXNUYWdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KHBsYWluVGV4dCB8fCBjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbnNlcnRQbGFpblRleHRXaXRoRWRpdG9yTGluZUJyZWFrcyh0aGlzLm5vcm1hbGl6ZUxpbmVFbmRpbmdzKG5vcm1hbGl6ZWQpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVMaW5lRW5kaW5ncyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0UGxhaW5UZXh0V2l0aEVkaXRvckxpbmVCcmVha3ModmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgdmlldyBpcyBub3QgcmVhZHkuIENhbm5vdCBpbnNlcnQgcGFzdGVkIHRleHQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0aGlzLnBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZSk7XHJcblxyXG4gICAgY29uc3Qgc2xpY2UgPSBQcm9zZU1pcnJvckRPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKS5wYXJzZVNsaWNlKGNvbnRhaW5lcik7XHJcbiAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbihzbGljZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCdcXG4nKTtcblxuICAgIGlmICh0aGlzLmlzUGFyYWdyYXBoRW50ZXJCZWhhdmlvcigpKSB7XG4gICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpID8gYDxwPiR7dGhpcy5lc2NhcGVIdG1sKGxpbmUpfTwvcD5gIDogJzxwPjxicj48L3A+JylcbiAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYDxwPiR7bGluZXMubWFwKGxpbmUgPT4gdGhpcy5lc2NhcGVIdG1sKGxpbmUpKS5qb2luKCc8YnI+Jyl9PC9wPmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxyXG4gICAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcclxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpXHJcbiAgICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxyXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIHRleHQgbm9kZXMgaW5zaWRlIHBhc3RlZCBIVE1MIHdpdGhvdXQgdG91Y2hpbmcgdGFncywgc3R5bGVzLCBsaW5rcywgb3IgaW1hZ2UgYXR0cmlidXRlcy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZEh0bWwoZTogRWRpdG9yUGFzdGVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGVhbmVkID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuICAgIGlmICghY2xlYW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRvYzogRG9jdW1lbnQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGNsZWFuZWQsICd0ZXh0L2h0bWwnKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHBhcnNlIHBhc3RlZCBIVE1MIGZvciBzeW1ib2wgbm9ybWFsaXphdGlvbi4gUGFzdGUgd2lsbCBjb250aW51ZS4nLCBlcnIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIoZG9jLmJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcclxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlLnRleHRDb250ZW50ID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KG5vZGUudGV4dENvbnRlbnQgPz8gJycpO1xyXG4gICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jKTtcclxuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZW1wdHlQYXJhZ3JhcGhzID0gQXJyYXkuZnJvbShkb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdwJykpLmZpbHRlcihwYXJhZ3JhcGggPT5cclxuICAgICAgdGhpcy5pc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaCksXHJcbiAgICApO1xyXG5cclxuICAgIGVtcHR5UGFyYWdyYXBocy5mb3JFYWNoKHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucmVtb3ZlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaDogSFRNTFBhcmFncmFwaEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFsbG93ZWRFbXB0eU5vZGVzID0gQXJyYXkuZnJvbShwYXJhZ3JhcGguY2hpbGROb2RlcykuZXZlcnkobm9kZSA9PiB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIHJldHVybiAhKG5vZGUudGV4dENvbnRlbnQgPz8gJycpLnRyaW0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnInO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWRFbXB0eU5vZGVzICYmICEocGFyYWdyYXBoLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGtub3duIHBhc3RlIHN5bWJvbCB2YXJpYW50cyBmcm9tIE9mZmljZS9lbWFpbCBjb250ZW50IGludG8gc3RhYmxlIGRpc3BsYXkgY2hhcmFjdGVycy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZFRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQgfHwgIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbm9ybWFsaXplZCA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVIdG1sRW50aXRpZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmFtcDsnLCAnJicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZsdDsnLCAnPCcpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZndDsnLCAnPicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZxdW90OycsICdcIicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyYjMzk7JywgXCInXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVEYXNoKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUyMDEwXFx1MjAxMVxcdTIwMTJcXHUyMDEzXFx1MjAxNFxcdTIyMTJdL2csICctJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZVF1b3Rlcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxyXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MjAxOFxcdTIwMTlcXHUyMDFBXFx1MjAxQl0vZywgXCInXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDFDXFx1MjAxRFxcdTIwMUVcXHUyMDFGXS9nLCAnXCInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplU3BhY2VzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUwMEEwXFx1MjAyRlxcdTIwMDddL2csICcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZUVsbGlwc2lzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1xcdTIwMjYvZywgJy4uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFwcGx5Q3VzdG9tU3ltYm9sUmVwbGFjZW1lbnRzKG5vcm1hbGl6ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUN1c3RvbVN5bWJvbFJlcGxhY2VtZW50cyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMucmVkdWNlKChyZXN1bHQsIHJlcGxhY2VtZW50KSA9PiB7XHJcbiAgICAgIGlmICghcmVwbGFjZW1lbnQ/LkZyb20pIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXBsYWNlbWVudC5Jc1JlZ2V4KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlbWVudC5Gcm9tLCByZXBsYWNlbWVudC5GbGFncyB8fCAnZycpLCByZXBsYWNlbWVudC5UbyA/PyAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2VBbGwocmVwbGFjZW1lbnQuRnJvbSwgcmVwbGFjZW1lbnQuVG8gPz8gJycpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gSW52YWxpZCBjdXN0b20gc3ltYm9sIHJlcGxhY2VtZW50IHNraXBwZWQuJywgeyByZXBsYWNlbWVudCwgZXJyIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH0sIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYW5kIGNvbXByZXNzIG1vZGUgaXMgT04sIGNvbXByZXNzIGFueSBwYXN0ZWQgYmFzZTY0IGltYWdlcyAoZGF0YTppbWFnZS8qKS5cclxuICAgKiBJTVBPUlRBTlQ6IG1vZGlmaWVzIGUuY2xlYW5lZEh0bWwgKHdoYXQgZ2V0cyBwYXN0ZWQpLCBub3QgZWRpdG9yLnZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW1hZ2VDb21wcmVzc2lvbihlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlzQ29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuICAgIGlmICghaXNDb21wcmVzc2lvbkVuYWJsZWQgfHwgIXRoaXMuaXNDb21wcmVzc01vZGVPbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcbiAgICBpZiAoIWNsZWFuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkb2M6IERvY3VtZW50O1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhjbGVhbmVkLCAndGV4dC9odG1sJyk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byBwYXJzZSBwYXN0ZWQgSFRNTCBmb3IgaW1hZ2UgY29tcHJlc3Npb24uIFBhc3RlIHdpbGwgY29udGludWUuJywgZXJyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0VsZW1lbnRzID0gQXJyYXkuZnJvbShkb2MucXVlcnlTZWxlY3RvckFsbCgnaW1nJykpXHJcbiAgICAgIC5tYXAoaW1nID0+IGltZyBhcyBIVE1MSW1hZ2VFbGVtZW50KVxyXG4gICAgICAuZmlsdGVyKGltZyA9PiB0eXBlb2YgaW1nPy5zcmMgPT09ICdzdHJpbmcnICYmIGltZy5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS8nKSk7XHJcblxyXG4gICAgaWYgKGltZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJlZm9yZVNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgYWZ0ZXJTaXplQnl0ZXMgPSAwO1xyXG4gICAgbGV0IGZhaWxlZENvdW50ID0gMDtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW1nRWxlbWVudHMubWFwKGFzeW5jIChpbWcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3JjID0gaW1nLnNyYztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmJhc2U2NFRvRmlsZShzcmMsIGBwYXN0ZWQtaW1hZ2UtJHtpbmRleH1gKTtcclxuICAgICAgICAgIGJlZm9yZVNpemVCeXRlcyArPSBmaWxlLnNpemU7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbihmaWxlKTtcclxuICAgICAgICAgIGlmICghY29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gc2tpcHBlZC9mYWlsZWQgZm9yIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChjb21wcmVzc2VkKTtcclxuICAgICAgICAgIGFmdGVyU2l6ZUJ5dGVzICs9IGNvbXByZXNzZWQuc2l6ZTtcclxuICAgICAgICAgIGltZy5zcmMgPSBiYXNlNjQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIEVycm9yIGNvbXByZXNzaW5nIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmAsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gSGVscGZ1bCBjb25zb2xlIGxvZ3MgZm9yIHRyb3VibGVzaG9vdGluZy5cclxuICAgIGNvbnN0IGJlZm9yZUtiID0gKGJlZm9yZVNpemVCeXRlcyAvIDEwMjQpLnRvRml4ZWQoMik7XHJcbiAgICBjb25zdCBhZnRlcktiID0gKGFmdGVyU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtadGV4dGVkaXRvcl0gUGFzdGVkIGltYWdlIGNvbXByZXNzaW9uIGNvbXBsZXRlZC4gSW1hZ2VzPSR7aW1nRWxlbWVudHMubGVuZ3RofSwgRmFpbGVkPSR7ZmFpbGVkQ291bnR9LCBCZWZvcmU9JHtiZWZvcmVLYn1LQiwgQWZ0ZXI9JHthZnRlcktifUtCYCxcclxuICAgICk7XHJcblxyXG4gICAgLy8gTW9kaWZ5IHdoYXQgZ2V0cyBwYXN0ZWQsIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbXByZXNzIG1vZGUgdmlhIGNvbmZpcm1hdGlvbiBkaWFsb2cuXHJcbiAgICovXHJcbiAgcHVibGljIG9uT2ZmQ29tcHJlc3NNb2RlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZGVyID0gJ0NvbmZpcm1hdGlvbic7XHJcbiAgICBjb25zdCBhY3Rpb25UZXh0ID0gdGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ2Rpc2FibGUnIDogJ2VuYWJsZSc7XHJcblxyXG4gICAgLy8gS2VlcCBleGlzdGluZyBiZWhhdmlvcjogdG9nZ2xpbmcgcmVzZXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtZXNzYWdlID1cclxuICAgICAgYERvIHlvdSB3YW50IHRvIDxiPiR7YWN0aW9uVGV4dH08L2I+IGltYWdlIGNvbXByZXNzaW9uIHdoZW4gaW5wdXQgY29udGVudD9gICtcclxuICAgICAgYDxici8+Tm90ZTogQ2xpY2sgXCJZZXNcIiB0aGUgY29udGVudCB3aWxsIGJlIHJlc2V0IHRvIGJsYW5rLmA7XHJcblxyXG4gICAgY29uc3QgYnV0dG9ucyA9IHtcclxuICAgICAgeWVzOiB7IHRleHQ6ICdZZXMnLCBjc3NDbGFzczogJ3ByaW1hcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgIG5vOiB7IHRleHQ6ICdObycsIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhoZWFkZXIsIG1lc3NhZ2UsIFtidXR0b25zLnllcywgYnV0dG9ucy5ub10sIFsnY29sLTQnXSlcclxuICAgICAgLnN1YnNjcmliZShyZXBseSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5ICE9PSAnWWVzJykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgdG9nZ2xlIGNvbXByZXNzaW9uIG1vZGUuJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IudmFsdWUgPSAnJztcclxuICAgICAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhdGhpcy5pc0NvbXByZXNzTW9kZU9uO1xyXG5cclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFxyXG4gICAgICAgICAgYCR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ0VuYWJsZScgOiAnRGlzYWJsZSd9IGltYWdlIGNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseS5gLFxyXG4gICAgICAgICAgJ3RvcCcsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIDI1MDAsXHJcbiAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhckljb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgay1pLWltYWdlICR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gdGhpcy5jb21wcmVzc2lvbkRpc2FibGVkSWNvbiA6IHRoaXMuY29tcHJlc3Npb25FbmFibGVJY29ufWA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBhcHBseSBsaXN0IGZvcm1hdHRpbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9nZ2xlSGFyZEJyZWFrTGlzdChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVkaXRvci5leGVjKGNvbW1hbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVIYXJkQnJlYWtMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFJhbmdlID0gdGhpcy5maW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTtcbiAgICBpZiAobGlzdFJhbmdlKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMaXN0Q29tbWFuZEFjdGl2ZShjb21tYW5kKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50SHRtbCA9IHRoaXMuYnVpbGRTZWxlY3RlZExpc3RJdGVtc1BhcmFncmFwaEh0bWwobGlzdFJhbmdlKTtcbiAgICAgIGlmIChyZXBsYWNlbWVudEh0bWwpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoSHRtbChsaXN0UmFuZ2UuZnJvbSwgbGlzdFJhbmdlLnRvLCByZXBsYWNlbWVudEh0bWwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhZ3JhcGhSYW5nZSA9IHRoaXMuZmluZFNlbGVjdGVkSGFyZEJyZWFrUGFyYWdyYXBoUmFuZ2UoKTtcbiAgICBpZiAoIXBhcmFncmFwaFJhbmdlIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhwYXJhZ3JhcGhSYW5nZS5ub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcGxhY2VtZW50SHRtbCA9IHRoaXMuYnVpbGRTZWxlY3RlZFBhcmFncmFwaExpc3RIdG1sKHBhcmFncmFwaFJhbmdlLCBjb21tYW5kKTtcbiAgICBpZiAoIXJlcGxhY2VtZW50SHRtbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVwbGFjZVJhbmdlV2l0aEh0bWwocGFyYWdyYXBoUmFuZ2UuZnJvbSwgcGFyYWdyYXBoUmFuZ2UudG8sIHJlcGxhY2VtZW50SHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgaXNMaXN0Q29tbWFuZEFjdGl2ZShjb21tYW5kOiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcgfCAnaW5zZXJ0T3JkZXJlZExpc3QnKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3I/LnZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBjb25zdCBsaXN0Tm9kZU5hbWUgPSBjb21tYW5kID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnID8gJ29yZGVyZWRfbGlzdCcgOiAnYnVsbGV0X2xpc3QnO1xuXG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICBjb25zdCBhY3RpdmVMaXN0ID0gdGhpcy5maW5kQW5jZXN0b3JSYW5nZShbJ2J1bGxldF9saXN0JywgJ29yZGVyZWRfbGlzdCddKTtcbiAgICAgIHJldHVybiBhY3RpdmVMaXN0Py5ub2RlPy50eXBlPy5uYW1lID09PSBsaXN0Tm9kZU5hbWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFRleHRCbG9ja0xpc3RUeXBlcygpO1xuICAgIHJldHVybiBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCAmJiBzZWxlY3RlZFJvd3MuZXZlcnkocm93ID0+IHJvdyA9PT0gbGlzdE5vZGVOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRUZXh0QmxvY2tMaXN0VHlwZXMoKTogQXJyYXk8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmVkaXRvcj8udmlldztcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB2aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCF2aWV3IHx8ICFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzOiBBcnJheTxzdHJpbmcgfCBudWxsPiA9IFtdO1xuICAgIGNvbnN0IHNlZW5Qb3NpdGlvbnMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgIHZpZXcuc3RhdGUuZG9jLmRlc2NlbmRhbnRzKChub2RlOiBhbnksIHBvczogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBub2RlRnJvbSA9IHBvcztcbiAgICAgIGNvbnN0IG5vZGVUbyA9IHBvcyArIG5vZGUubm9kZVNpemU7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2sgfHwgc2VlblBvc2l0aW9ucy5oYXMocG9zKSB8fCBub2RlVG8gPD0gc2VsZWN0aW9uLmZyb20gfHwgbm9kZUZyb20gPj0gc2VsZWN0aW9uLnRvKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuUG9zaXRpb25zLmFkZChwb3MpO1xuICAgICAgcm93cy5wdXNoKHRoaXMuZmluZFBhcmVudExpc3RUeXBlQXRQb3NpdGlvbihwb3MpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnRMaXN0VHlwZUF0UG9zaXRpb24ocG9zOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkb2MgPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuZG9jO1xuICAgIGlmICghZG9jKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSByZXNvbHZlZFBvcy5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKSB7XG4gICAgICBjb25zdCBub2RlTmFtZSA9IHJlc29sdmVkUG9zLm5vZGUoZGVwdGgpPy50eXBlPy5uYW1lO1xuICAgICAgaWYgKG5vZGVOYW1lID09PSAnYnVsbGV0X2xpc3QnIHx8IG5vZGVOYW1lID09PSAnb3JkZXJlZF9saXN0Jykge1xuICAgICAgICByZXR1cm4gbm9kZU5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbmNlc3RvclJhbmdlKG5vZGVOYW1lczogc3RyaW5nW10pOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkZXB0aCA9IHNlbGVjdGlvbi4kZnJvbS5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKSB7XG4gICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uLiRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgaWYgKG5vZGVOYW1lcy5pbmNsdWRlcyhub2RlLnR5cGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGZyb206IHNlbGVjdGlvbi4kZnJvbS5iZWZvcmUoZGVwdGgpLFxuICAgICAgICAgIHRvOiBzZWxlY3Rpb24uJGZyb20uYWZ0ZXIoZGVwdGgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXZpZXcgfHwgIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLmZpbmRBbmNlc3RvclJhbmdlKFsnYnVsbGV0X2xpc3QnLCAnb3JkZXJlZF9saXN0J10pO1xuICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgcmV0dXJuIGFuY2VzdG9yO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZExpc3Q6IHsgbm9kZTogYW55OyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHZpZXcuc3RhdGUuZG9jLm5vZGVzQmV0d2VlbihzZWxlY3Rpb24uZnJvbSwgc2VsZWN0aW9uLnRvLCAobm9kZTogYW55LCBwb3M6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkTGlzdCB8fCAhWydidWxsZXRfbGlzdCcsICdvcmRlcmVkX2xpc3QnXS5pbmNsdWRlcyhub2RlLnR5cGU/Lm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZExpc3QgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRIYXJkQnJlYWtQYXJhZ3JhcGhSYW5nZSgpOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghdmlldyB8fCAhc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZmluZEFuY2VzdG9yUmFuZ2UoWydwYXJhZ3JhcGgnXSk7XG4gICAgaWYgKGFuY2VzdG9yPy5ub2RlICYmIHRoaXMuaGFzSGFyZEJyZWFrKGFuY2VzdG9yLm5vZGUpKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdGVkUGFyYWdyYXBoOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB2aWV3LnN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oc2VsZWN0aW9uLmZyb20sIHNlbGVjdGlvbi50bywgKG5vZGU6IGFueSwgcG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZFBhcmFncmFwaCB8fCBub2RlLnR5cGU/Lm5hbWUgIT09ICdwYXJhZ3JhcGgnIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0ZWRQYXJhZ3JhcGggPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRQYXJhZ3JhcGg7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFncmFwaEhhcmRCcmVha0xpbmVzKHBhcmFncmFwaDogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVUb0hhcmRCcmVha1RleHQocGFyYWdyYXBoKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKVxuICAgICAgLmZpbHRlcihsaW5lID0+ICEhbGluZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0ZWRQYXJhZ3JhcGhMaXN0SHRtbChcbiAgICBwYXJhZ3JhcGhSYW5nZTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9LFxuICAgIGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yPy52aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5nZXRQYXJhZ3JhcGhMaW5lUmFuZ2VzKHBhcmFncmFwaFJhbmdlLm5vZGUsIHBhcmFncmFwaFJhbmdlLmZyb20pO1xuICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5maWx0ZXIobGluZSA9PiBsaW5lLnRleHQudHJpbSgpICYmIGxpbmUudG8gPiBzZWxlY3Rpb24uZnJvbSAmJiBsaW5lLmZyb20gPCBzZWxlY3Rpb24udG8pO1xuXG4gICAgaWYgKHNlbGVjdGVkTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFNlbGVjdGVkSW5kZXggPSBsaW5lcy5pbmRleE9mKHNlbGVjdGVkTGluZXNbMF0pO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEluZGV4ID0gbGluZXMuaW5kZXhPZihzZWxlY3RlZExpbmVzW3NlbGVjdGVkTGluZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGJlZm9yZUxpbmVzID0gbGluZXMuc2xpY2UoMCwgZmlyc3RTZWxlY3RlZEluZGV4KS5tYXAobGluZSA9PiBsaW5lLnRleHQpO1xuICAgIGNvbnN0IGFmdGVyTGluZXMgPSBsaW5lcy5zbGljZShsYXN0U2VsZWN0ZWRJbmRleCArIDEpLm1hcChsaW5lID0+IGxpbmUudGV4dCk7XG4gICAgY29uc3QgbGlzdFRhZyA9IGNvbW1hbmQgPT09ICdpbnNlcnRPcmRlcmVkTGlzdCcgPyAnb2wnIDogJ3VsJztcbiAgICBjb25zdCBsaXN0SHRtbCA9XG4gICAgICBgPCR7bGlzdFRhZ30+YCArXG4gICAgICBzZWxlY3RlZExpbmVzLm1hcChsaW5lID0+IGA8bGk+JHt0aGlzLmVzY2FwZUh0bWwobGluZS50ZXh0LnRyaW0oKSl9PC9saT5gKS5qb2luKCcnKSArXG4gICAgICBgPC8ke2xpc3RUYWd9PmA7XG5cbiAgICByZXR1cm4gW1xuICAgICAgYmVmb3JlTGluZXMubGVuZ3RoID8gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChiZWZvcmVMaW5lcykgOiAnJyxcbiAgICAgIGxpc3RIdG1sLFxuICAgICAgYWZ0ZXJMaW5lcy5sZW5ndGggPyB0aGlzLmxpbmVzVG9IYXJkQnJlYWtQYXJhZ3JhcGhIdG1sKGFmdGVyTGluZXMpIDogJycsXG4gICAgXS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYWdyYXBoTGluZVJhbmdlcyhwYXJhZ3JhcGg6IGFueSwgcGFyYWdyYXBoUG9zOiBudW1iZXIpOiBBcnJheTx7IHRleHQ6IHN0cmluZzsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBsaW5lczogQXJyYXk8eyB0ZXh0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0ge1xuICAgICAgdGV4dDogJycsXG4gICAgICBmcm9tOiBwYXJhZ3JhcGhQb3MgKyAxLFxuICAgICAgdG86IHBhcmFncmFwaFBvcyArIDEsXG4gICAgfTtcblxuICAgIHBhcmFncmFwaC5mb3JFYWNoKChjaGlsZDogYW55LCBvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgY2hpbGRGcm9tID0gcGFyYWdyYXBoUG9zICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGNoaWxkVG8gPSBjaGlsZEZyb20gKyBjaGlsZC5ub2RlU2l6ZTtcblxuICAgICAgaWYgKGNoaWxkLnR5cGU/Lm5hbWUgPT09ICdoYXJkX2JyZWFrJykge1xuICAgICAgICBjdXJyZW50LnRvID0gY2hpbGRGcm9tO1xuICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0ge1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIGZyb206IGNoaWxkVG8sXG4gICAgICAgICAgdG86IGNoaWxkVG8sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC50ZXh0ICs9IGNoaWxkLnRleHRDb250ZW50ID8/ICcnO1xuICAgICAgY3VycmVudC50byA9IGNoaWxkVG87XG4gICAgfSk7XG5cbiAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RlZExpc3RJdGVtc1BhcmFncmFwaEh0bWwobGlzdFJhbmdlOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0VGFnID0gbGlzdFJhbmdlLm5vZGUudHlwZT8ubmFtZSA9PT0gJ29yZGVyZWRfbGlzdCcgPyAnb2wnIDogJ3VsJztcbiAgICBjb25zdCBodG1sUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHBlbmRpbmdMaXN0SXRlbXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGhhc1NlbGVjdGVkSXRlbSA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmx1c2hQZW5kaW5nTGlzdEl0ZW1zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdMaXN0SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaHRtbFBhcnRzLnB1c2goYDwke2xpc3RUYWd9PiR7cGVuZGluZ0xpc3RJdGVtcy5qb2luKCcnKX08LyR7bGlzdFRhZ30+YCk7XG4gICAgICBwZW5kaW5nTGlzdEl0ZW1zID0gW107XG4gICAgfTtcblxuICAgIGxpc3RSYW5nZS5ub2RlLmZvckVhY2goKGxpc3RJdGVtOiBhbnksIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtRnJvbSA9IGxpc3RSYW5nZS5mcm9tICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGl0ZW1UbyA9IGl0ZW1Gcm9tICsgbGlzdEl0ZW0ubm9kZVNpemU7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5ub2RlVG9IYXJkQnJlYWtUZXh0KGxpc3RJdGVtKS50cmltKCk7XG5cbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzUmFuZ2VTZWxlY3RlZChpdGVtRnJvbSwgaXRlbVRvKSkge1xuICAgICAgICBoYXNTZWxlY3RlZEl0ZW0gPSB0cnVlO1xuICAgICAgICBmbHVzaFBlbmRpbmdMaXN0SXRlbXMoKTtcbiAgICAgICAgaHRtbFBhcnRzLnB1c2godGhpcy5saW5lc1RvRWRpdG9yUGFyYWdyYXBoSHRtbChbdGV4dF0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nTGlzdEl0ZW1zLnB1c2goYDxsaT4ke3RoaXMuZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmApO1xuICAgIH0pO1xuXG4gICAgZmx1c2hQZW5kaW5nTGlzdEl0ZW1zKCk7XG5cbiAgICByZXR1cm4gaGFzU2VsZWN0ZWRJdGVtID8gaHRtbFBhcnRzLmpvaW4oJycpIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSYW5nZVNlbGVjdGVkKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yPy52aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICByZXR1cm4gc2VsZWN0aW9uLmZyb20gPj0gZnJvbSAmJiBzZWxlY3Rpb24uZnJvbSA8PSB0bztcbiAgICB9XG5cbiAgICByZXR1cm4gdG8gPiBzZWxlY3Rpb24uZnJvbSAmJiBmcm9tIDwgc2VsZWN0aW9uLnRvO1xuICB9XG5cbiAgcHJpdmF0ZSBub2RlVG9IYXJkQnJlYWtUZXh0KG5vZGU6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSAnJztcblxuICAgIG5vZGUuZGVzY2VuZGFudHMoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlPy5uYW1lID09PSAnaGFyZF9icmVhaycpIHtcbiAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIHRleHQgKz0gY2hpbGQudGV4dCA/PyAnJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYXJkQnJlYWsobm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICBub2RlLmRlc2NlbmRhbnRzKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQudHlwZT8ubmFtZSA9PT0gJ2hhcmRfYnJlYWsnKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWZvdW5kO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgPHA+JHtsaW5lcy5tYXAobGluZSA9PiB0aGlzLmVzY2FwZUh0bWwobGluZSkpLmpvaW4oJzxicj4nKX08L3A+YDtcbiAgfVxuXG4gIHByaXZhdGUgbGluZXNUb1BhcmFncmFwaEh0bWwobGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSA/IGA8cD4ke3RoaXMuZXNjYXBlSHRtbChsaW5lKX08L3A+YCA6ICc8cD48YnI+PC9wPicpXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGxpbmVzVG9FZGl0b3JQYXJhZ3JhcGhIdG1sKGxpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXJhZ3JhcGhFbnRlckJlaGF2aW9yKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmVzVG9QYXJhZ3JhcGhIdG1sKGxpbmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lcyk7XG4gIH1cblxuICBwcml2YXRlIGlzUGFyYWdyYXBoRW50ZXJCZWhhdmlvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5FbnRlcktleUJlaGF2aW9yICE9PSAnbGluZUJyZWFrJztcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVJhbmdlV2l0aEh0bWwoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBQcm9zZU1pcnJvckRPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKS5wYXJzZShjb250YWluZXIpLmNvbnRlbnQ7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBmcmFnbWVudCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgdmlldy5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnRlckFzTGluZUJyZWFrUGx1Z2luKCk6IFBsdWdpbiB7XG4gICAgcmV0dXJuIGtleW1hcCh7XG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCBzcGxpdEJsb2NrKSxcbiAgICAgIEVudGVyOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhcmRCcmVhayA9IHN0YXRlLnNjaGVtYS5ub2Rlcy5oYXJkX2JyZWFrO1xuICAgICAgICBpZiAoIWhhcmRCcmVhayB8fCAhc3RhdGUuc2VsZWN0aW9uLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XHJcbiAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChoYXJkQnJlYWsuY3JlYXRlKCkpLnNjcm9sbEludG9WaWV3KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1cyBlZGl0b3IgaWYgYXZhaWxhYmxlLiBSZXR1cm5zIHRydWUgaWYgZm9jdXMgc3VjY2VlZGVkLiAqL1xyXG4gIHB1YmxpYyBmb2N1cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb250QXdlc29tZShpY29uTmFtZTogc3RyaW5nLCBmb250QXdlc29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSk6IHVua25vd24ge1xyXG4gICAgY29uc3QgaWNvbk5hbWVWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShpY29uTmFtZSwgdGhpcy5ncm91cCk7XHJcbiAgICBpZiAoaWNvbk5hbWVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShpY29uTmFtZVZhbHVlLCBmb250QXdlc29tZVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGljb25OYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIEtlbmRvIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgZnJvbSBQYXN0ZUNsZWFudXBTZXR0aW5ncywgd2l0aCBkYXRhLk9wdGlvbnMga2VwdCBhcyBhIGxlZ2FjeSBmYWxsYmFjay4gKi9cclxuICBwcml2YXRlIHNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kYXRhPy5QYXN0ZUNsZWFudXBTZXR0aW5ncyA/PyB0aGlzLmRhdGE/Lk9wdGlvbnM7XHJcbiAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUob3B0aW9ucywgdGhpcy5ncm91cCk7XHJcbiAgICAgIGlmIChyZXNvbHZlZCAmJiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhc3RlQ2xlYW51cFNldHRpbmdzLCByZXNvbHZlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGNsZWFudXAgc2V0dGluZ3MgcmVzb2x2ZWQgdmFsdWUgaXMgbm90IGFuIG9iamVjdC4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgICAgIHJlc29sdmVkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5zdXBwb3J0ZWQgcGFzdGUgY2xlYW51cCBzZXR0aW5ncyB0eXBlLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICB0eXBlOiB0eXBlb2Ygb3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgb3B0aW9uYWwgcGFzdGUgc3ltYm9sIG5vcm1hbGl6YXRpb24gc2V0dGluZ3MgZnJvbSBmaWVsZCBjb25maWcuICovXHJcbiAgcHJpdmF0ZSBzZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5kYXRhPy5TeW1ib2xOb3JtYWxpemF0aW9uO1xyXG4gICAgaWYgKHNldHRpbmdzID09PSB1bmRlZmluZWQgfHwgc2V0dGluZ3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdib29sZWFuJykge1xyXG4gICAgICB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkID0gc2V0dGluZ3M7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCByZXNvbHZlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzZXR0aW5ncywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MocmVzb2x2ZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHNldHRpbmdzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzZXR0aW5ncyB8fCB0eXBlb2Ygc2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2V0dGluZ3MpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTeW1ib2xOb3JtYWxpemF0aW9uIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhIHN1cHBvcnRlZCBjb25maWcuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncywgc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzID1cclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMpXHJcbiAgICAgICAgPyB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHNcclxuICAgICAgICA6IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBDdXN0b20gSW1hZ2UgVXBsb2FkIC8gRW5sYXJnZVxyXG5cclxuICAvKiogVHJpZ2dlciBoaWRkZW4gZmlsZSBpbnB1dCBjbGljayBmb3IgaW1hZ2UgdXBsb2FkLiAqL1xyXG4gIHB1YmxpYyBvcGVuRmlsZUV4cGxvcmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBgJHt0aGlzLmRhdGEuVmFsdWV9LXVwbG9hZC1maWxlYDtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbnB1dCBlbGVtZW50IG5vdCBmb3VuZCAoaWQ9XCIke2lkfVwiKS5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbiBhbiBlbmxhcmdlZCBwb3B1cCBlZGl0b3IuICovXHJcbiAgcHVibGljIG9wZW5Qb3B1cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBvcGVuIHBvcHVwLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBkaWFsb2dcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgd2lkdGg6ICc5OCUnLFxyXG4gICAgICBoZWlnaHQ6ICc5NyUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXBDb21wb25lbnQgPSB0aGlzLmRpYWxvZ1JlZi5jb250ZW50Lmluc3RhbmNlIGFzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEuQWxsb3dFbmxhcmdlID0gZmFsc2U7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZjtcclxuICAgIHBvcHVwQ29tcG9uZW50LkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIHN0eWxlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNsb3NlLlxyXG4gICAgdGhpcy5vcmlnaW5hbElubGluZVN0eWxlID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxID8/ICcnO1xyXG4gICAgaWYgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXM/LnN0eWxlKSB7XHJcbiAgICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID1cclxuICAgICAgICAocG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPz8gJycpICtcclxuICAgICAgICBgaGVpZ2h0OiR7KHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCkudG9TdHJpbmcoKX1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdXBDb21wb25lbnQuZ3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50U2V0dGluZ3MgPSB0aGlzLmNvbXBvbmVudFNldHRpbmdzO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZm9ybSA9IHRoaXMuZm9ybTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIHN0YXRlIGFuZCBwdXNoIHZhbHVlIGJhY2sgaW50byBlZGl0b3Igb24gY2xvc2UuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRhLkFsbG93RW5sYXJnZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPSB0aGlzLm9yaWdpbmFsSW5saW5lU3R5bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFB1bGwgY3VycmVudCB6TW9kZWwgaW50byBlZGl0b3IgYW5kIHRyaWdnZXIgb25DaGFuZ2UgKGV4aXN0aW5nIGJlaGF2aW9yKS5cclxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdyb3VwPy56TW9kZWw/Llt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgICBlZGl0b3IudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlIHRoZSBwb3B1cCBlZGl0b3IgaWYgb3Blbi4gKi9cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIDxpbnB1dCB0eXBlPVwiZmlsZVwiPiBjaGFuZ2UgYW5kIGluc2VydCBzZWxlY3RlZCBpbWFnZSBpbnRvIGVkaXRvci5cclxuICAgKiBOT1RFOiBQcmVmZXIgdHlwaW5nIGZpbGVJbnB1dCBhcyBFdmVudCBmb3IgYmV0dGVyIHNhZmV0eS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSW1hZ2UoZmlsZUlucHV0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dD8uZmlsZXM/LlswXTtcclxuXHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIE5vIGltYWdlIHNlbGVjdGVkIGZvciB1cGxvYWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2b2lkIHRoaXMuaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBpbWFnZSBpbnRvIGVkaXRvciwgb3B0aW9uYWxseSBjb21wcmVzc2luZyBmaXJzdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIGluc2VydEltYWdlSW50b0VkaXRvcihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IGltYWdlLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdvcmtpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IGZpbGU7XHJcblxyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG5cclxuICAgIGlmIChjb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtadGV4dGVkaXRvcl0gVXBsb2FkIGltYWdlIGJlZm9yZSBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuXHJcbiAgICAgIHdvcmtpbmdGaWxlID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKHdvcmtpbmdGaWxlKTtcclxuICAgICAgaWYgKCF3b3JraW5nRmlsZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBmYWlsZWQuIFVwbG9hZCBpbWFnZSBpbnNlcnRpb24gYWJvcnRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBhZnRlciBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKHdvcmtpbmdGaWxlKTtcclxuICAgICAgZWRpdG9yLmV4ZWMoJ2luc2VydEltYWdlJywgeyBzcmM6IGJhc2U2NCB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHJlYWQgdXBsb2FkZWQgaW1hZ2UgYXMgYmFzZTY0LicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydCBiYXNlNjQgKGRhdGEgVVJMKSB0byBGaWxlLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvLyBVc2luZyBmZXRjaCBvbiBkYXRhIFVSTCBpcyBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzOyBrZWVwIGV4aXN0aW5nIGxvZ2ljLlxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlNjRTdHJpbmcpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge1xyXG4gICAgICB0eXBlOiBibG9iLnR5cGUsXHJcbiAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyBhbiBpbWFnZSBhbmQgYWJvdmUgbWluIHRocmVzaG9sZC5cclxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBmaWxlIHdoZW4gY29tcHJlc3Npb24gaXMgc2tpcHBlZCwgYW5kIG51bGwgb25seSB3aGVuIGNvbXByZXNzaW9uIGZhaWxzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaW1hZ2VDb21wcmVzc2lvbihmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBpbWFnZUNvbXByZXNzaW9uIGNhbGxlZCB3aXRoIGVtcHR5IGZpbGUuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmlsZS50eXBlIHx8ICFmaWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJykpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIGlzIG5vdCBhbiBpbWFnZS4nLCB7IHR5cGU6IGZpbGUudHlwZSB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgLy8gQ29tcHJlc3Npb24gbm90IGNvbmZpZ3VyZWQ7IGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0NvbmZpZyA9IHRoaXMuY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGNvbmZpZyk7XHJcblxyXG4gICAgLy8gSWYgZmlsZSBpcyBiZWxvdyB0aHJlc2hvbGQsIGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICBpZiAoZmlsZS5zaXplIDw9IGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIHNpemUgJHsoZmlsZS5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX1LQiBpcyBiZWxvdyB0aHJlc2hvbGQgJHsoaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCLmAsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWQkID0gdGhpcy5jb21wcmVzc0ltYWdlLmNvbXByZXNzKGZpbGUsIGltZ0NvbmZpZyk7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY29tcHJlc3NlZCQpO1xyXG4gICAgICByZXR1cm4gY29tcHJlc3NlZEZpbGUgPz8gbnVsbDtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gQ29tcHJlc3Npb24gc2VydmljZSB0aHJldyBhbiBlcnJvci4nLCBlcnIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgaW1hZ2UgY29tcHJlc3Npb24gY29uZmlnIGludG8gYnl0ZS1iYXNlZCB0aHJlc2hvbGRzLiAqL1xyXG4gIHByaXZhdGUgY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGltZ0NvbmZpZzogSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyk6IEltYWdlQ29tcHJlc3Npb25Db25maWcge1xyXG4gICAgaWYgKCFpbWdDb25maWcpIHtcclxuICAgICAgLy8gRGVmZW5zaXZlOiBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY2FsbGVyIGNoZWNrcy5cclxuICAgICAgcmV0dXJuIGltZ0NvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSkge1xyXG4gICAgICBpbWdDb25maWcuRmlsZVNpemVNYXhTaXplQnl0ZSA9IHRoaXMuY29udmVydFNpemVUb0J5dGUoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIGxpa2UgXCIxMDBrYlwiLCBcIjEgTUJcIiwgXCIyZ2JcIiB0byBieXRlcy5cclxuICAgKiBJZiBubyB1bml0IGlzIHByb3ZpZGVkLCBieXRlcyBhcmUgYXNzdW1lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRTaXplVG9CeXRlKHNpemVTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoIXNpemVTdHJpbmcgfHwgdHlwZW9mIHNpemVTdHJpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBjb252ZXJ0U2l6ZVRvQnl0ZSByZWNlaXZlZCBpbnZhbGlkIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBhbGwgc3BhY2VzLCBlLmcuIFwiMSBNQlwiIC0+IFwiMU1CXCJcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBzaXplU3RyaW5nLnJlcGxhY2UoLyAvZywgJycpLnRyaW0oKTtcclxuICAgIGlmICghdHJpbW1lZCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHRyYWN0IG51bWVyaWMgcGFydCBhbmQgdW5pdCBwYXJ0IChsZXR0ZXJzKS5cclxuICAgIC8vIEV4YW1wbGU6IFwiMS41TUJcIiA9PiBudW1iZXI9MS41LCB1bml0PVwibWJcIlxyXG4gICAgY29uc3QgbWF0Y2ggPSAvXihbMC05XSpcXC4/WzAtOV0rKShbYS16QS1aXSopJC8uZXhlYyh0cmltbWVkKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuYWJsZSB0byBwYXJzZSBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKG1hdGNoWzFdKTtcclxuICAgIGNvbnN0IHVuaXQgPSAobWF0Y2hbMl0gfHwgJ2InKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtZXJpYykgfHwgbnVtZXJpYyA8IDApIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEludmFsaWQgbnVtZXJpYyBzaXplIGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICBjYXNlICdiJzpcclxuICAgICAgY2FzZSAnJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgICAgY2FzZSAna2InOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNDtcclxuICAgICAgY2FzZSAnbWInOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ2diJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0ICogMTAyNDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5rbm93biB1bml0IGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gYnl0ZXMuJywgeyBzaXplU3RyaW5nLCB1bml0IH0pO1xyXG4gICAgICAgIHJldHVybiBudW1lcmljO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlYWQgYSBGaWxlIGFzIGJhc2U2NCBkYXRhIFVSTC4gKi9cclxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmlsZSBpcyByZXF1aXJlZC4nKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ6dGV4dGVkaXRvci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGV4cGFuZC1idG4tY29udGFpbmVyXCI+XHJcbiAgPGlvbi1idXR0b24gICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJkYXRhLkFsbG93RW5sYXJnZVwiIChjbGljayk9XCJvcGVuUG9wdXAoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2ZhRXhwYW5kQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbiAgPGlvbi1idXR0b24gIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiAqbmdJZj1cIkNsb3NlRW5sYXJnZUJ0blwiIChjbGljayk9XCJvblBvcHVwQ2xvc2UoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUNvbXByZXNzQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbjwvZGl2PlxyXG4gIDxrZW5kby1lZGl0b3IgI2VkaXRvclxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiZGF0YS5SZXNpemFibGUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BsdWdpbnNdPVwicGx1Z2luc0NhbGxiYWNrXCJcclxuICAgICAgICAgICAgICAgIFtwYXN0ZUNsZWFudXBTZXR0aW5nc109XCJwYXN0ZUNsZWFudXBTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpZnJhbWVdPVwiY29tcG9uZW50U2V0dGluZ3MuaWZyYW1lXCI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnYmFzaWMnXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3I+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgW3NlbGVjdGVkXT1cImlzTGlzdENvbW1hbmRBY3RpdmUoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIFtzZWxlY3RlZF09XCJpc0xpc3RDb21tYW5kQWN0aXZlKCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRGaWxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiIFtpY29uXT1cImNvbXByZXNzaW9uVG9vbGJhckljb25cIiAoY2xpY2spPVwib25PZmZDb21wcmVzc01vZGUoKVwiIFt0aXRsZV09XCJjb21wcmVzc2lvblRvb2xiYXJUaXRsZVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwva2VuZG8tdG9vbGJhcj5cclxuICAgIDxrZW5kby10b29sYmFyICpuZ0lmPVwiZGF0YS5Ub29sQmFyU3R5bGUgPT09ICdmdWxsJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgW3NlbGVjdGVkXT1cImlzTGlzdENvbW1hbmRBY3RpdmUoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIFtzZWxlY3RlZF09XCJpc0xpc3RDb21tYW5kQWN0aXZlKCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JNZXJnZUNlbGxzQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3BsaXRDZWxsQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgPC9rZW5kby1lZGl0b3I+XHJcbiAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHR5cGU9XCJmaWxlXCIgW2lkXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgW25hbWVdPVwiZGF0YS5WYWx1ZSArJy11cGxvYWQtZmlsZSdcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbmdmLW1heC1zaXplPVwiNU1CXCIgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCI+XHJcbjwvZGl2PlxyXG4iXX0=
|