simpo-component-library 3.6.863 → 3.6.864
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/esm2022/lib/elements/text-editor/text-editor.component.mjs +19 -17
- package/fesm2022/simpo-component-library.mjs +17 -15
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/elements/text-editor/text-editor.component.d.ts +1 -1
- package/package.json +1 -1
- package/simpo-component-library-3.6.864.tgz +0 -0
- package/simpo-component-library-3.6.863.tgz +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
// text-editor.component.ts
|
|
2
1
|
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, PLATFORM_ID, inject } from '@angular/core';
|
|
3
2
|
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
|
4
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
3
|
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
6
5
|
import { MatIconModule } from '@angular/material/icon';
|
|
7
6
|
import { CdkDrag } from '@angular/cdk/drag-drop';
|
|
8
7
|
import { MatSelectModule } from '@angular/material/select';
|
|
@@ -44,6 +43,12 @@ export class TextEditorComponent {
|
|
|
44
43
|
}, 300);
|
|
45
44
|
};
|
|
46
45
|
}
|
|
46
|
+
ngOnChanges(changes) {
|
|
47
|
+
if (changes['value']) {
|
|
48
|
+
console.log('INPUT VALUE:', this.value);
|
|
49
|
+
this.updateSafeHtml();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
47
52
|
async ngAfterViewInit() {
|
|
48
53
|
this.updateSafeHtml();
|
|
49
54
|
if (this.editable &&
|
|
@@ -51,11 +56,6 @@ export class TextEditorComponent {
|
|
|
51
56
|
await this.initializeEditor();
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
|
-
ngOnChanges(changes) {
|
|
55
|
-
if (changes['value']) {
|
|
56
|
-
this.updateSafeHtml();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
59
|
ngOnDestroy() {
|
|
60
60
|
if (this.editor &&
|
|
61
61
|
isPlatformBrowser(this.platformId)) {
|
|
@@ -64,7 +64,8 @@ export class TextEditorComponent {
|
|
|
64
64
|
}
|
|
65
65
|
updateSafeHtml() {
|
|
66
66
|
this.safeHtml =
|
|
67
|
-
this.sanitizer
|
|
67
|
+
this.sanitizer
|
|
68
|
+
.bypassSecurityTrustHtml(this.value || '');
|
|
68
69
|
}
|
|
69
70
|
async initializeEditor() {
|
|
70
71
|
if (!this.editorElement)
|
|
@@ -107,6 +108,7 @@ export class TextEditorComponent {
|
|
|
107
108
|
},
|
|
108
109
|
onUpdate: ({ editor }) => {
|
|
109
110
|
const html = editor.getHTML();
|
|
111
|
+
console.log('EDITOR HTML:', html);
|
|
110
112
|
this.value = html;
|
|
111
113
|
this.updateSafeHtml();
|
|
112
114
|
this.valueChange.emit(html);
|
|
@@ -281,12 +283,12 @@ export class TextEditorComponent {
|
|
|
281
283
|
return;
|
|
282
284
|
const existingStyles = this.editor.getAttributes('textStyle');
|
|
283
285
|
const gradient = `
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
286
|
+
linear - gradient(
|
|
287
|
+
to right,
|
|
288
|
+
${this.primaryColor},
|
|
289
|
+
${this.secondaryColor}
|
|
290
|
+
)
|
|
291
|
+
`;
|
|
290
292
|
this.editor
|
|
291
293
|
.chain()
|
|
292
294
|
.focus()
|
|
@@ -332,7 +334,7 @@ export class TextEditorComponent {
|
|
|
332
334
|
.run();
|
|
333
335
|
}
|
|
334
336
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
335
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TextEditorComponent, isStandalone: true, selector: "simpo-text-editor", inputs: { value: "value", editable: "editable", sectionId: "sectionId", label: "label", type: "type" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:mousedown": "onMouseDown()" } }, viewQueries: [{ propertyName: "editorElement", first: true, predicate: ["editorContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- text-editor.component.html -->\r\n\r\n<div class=\"editor-container\" *ngIf=\"editable; else viewMode\">\r\n\r\n <!-- FLOATING TOOLBAR -->\r\n <div class=\"toolbar\" *ngIf=\"showToolbar\" [style.top.px]=\"toolbarY\" [style.left.px]=\"toolbarX\" cdkDrag>\r\n <button class=\"tool drag-handle w-auto\" cdkDragHandle>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-grip-vertical\">\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n </button>\r\n <mat-form-field appearance=\"outline\" class=\"font-size-field\">\r\n\r\n <mat-select [value]=\"selectedFontSize\" (selectionChange)=\"changeFontSize($event.value)\" disableOptionCentering>\r\n\r\n <mat-option value=\"\">\r\n Default\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1rem)\">\r\n 14\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1.25rem)\">\r\n 16\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1rem, 3vw, 1.5rem)\">\r\n 20\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1.25rem, 4vw, 2rem)\">\r\n 24\r\n </mat-option>\r\n <mat-option value=\"clamp(2rem, 5vw, 3rem)\">\r\n 32\r\n </mat-option>\r\n <mat-option value=\"clamp(3.1rem, 7vw, 4.5rem)\">\r\n 48\r\n </mat-option>\r\n </mat-select>\r\n\r\n </mat-form-field>\r\n <!-- BOLD -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('bold')\" (click)=\"toggleBold()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-bold\">\r\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ITALIC -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('italic')\" (click)=\"toggleItalic()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-italic\">\r\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\r\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- UNDERLINE -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('underline')\" (click)=\"toggleUnderline()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-underline\">\r\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN LEFT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('left')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-left\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"17\" x2=\"3\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN CENTER -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('center')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-center\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"17\" x2=\"7\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"19\" x2=\"5\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN RIGHT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('right')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-right\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"21\" x2=\"7\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ORDERED LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleOrderedList()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list-ordered\">\r\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <path d=\"M4 6h1v4\" />\r\n <path d=\"M4 10h2\" />\r\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\r\n </svg>\r\n </button>\r\n <!-- BULLET LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleBulletList()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list\">\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- SOLID / GRADIENT -->\r\n <!-- SOLID / GRADIENT -->\r\n <div class=\"colorType\">\r\n\r\n <button class=\"solid w-auto\" [class.solidColorSelected]=\"selectedColorType === 'SOLID'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToSolid($event)\">\r\n Solid\r\n </button>\r\n\r\n <button class=\"gradient w-auto\" [class.gradientColorSelected]=\"selectedColorType === 'GRADIENT'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToGradient($event)\">\r\n Gradient\r\n </button>\r\n\r\n </div>\r\n\r\n <!-- SOLID COLOR -->\r\n <button class=\"tool color-picker-btn w-auto\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n\r\n <mat-icon>format_color_text</mat-icon>\r\n\r\n <input type=\"color\" class=\"hidden-color-picker\" [(ngModel)]=\"selectedColor\" (click)=\"openColorPicker()\"\r\n (input)=\"changeColor()\">\r\n\r\n </button>\r\n\r\n <!-- GRADIENT -->\r\n <div class=\"gradient-picker\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <input type=\"color\" [(ngModel)]=\"primaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n <input type=\"color\" [(ngModel)]=\"secondaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- TIPTAP EDITOR -->\r\n <div #editorContainer class=\"editable-text\">\r\n </div>\r\n\r\n</div>\r\n<ng-template #viewMode>\r\n <div class=\"read-only-text\" [innerHTML]=\"value\">\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;width:100%}.editable-text{cursor:text;width:100%;border:1px solid lightgrey;border-radius:10px}.editable-text ::ng-deep p{margin-bottom:0!important}::ng-deep .ProseMirror ol,::ng-deep .ProseMirror ul{padding-left:2rem;margin-left:0;list-style-position:inside}::ng-deep .ProseMirror li{text-align:inherit;margin-bottom:5px}::ng-deep .ProseMirror li p{display:inline}.ProseMirror{outline:none;min-height:120px;padding:5px}.ProseMirror p{margin:0}.toolbar{position:absolute;left:0;top:0;display:flex;align-items:center;gap:5px;background:#fff;padding:8px 14px;border-radius:22px;z-index:100000;box-shadow:#00000029 0 1px 4px;max-width:calc(100vw - 20px);overflow-x:auto;box-sizing:border-box}.tool{background:none;border:none;padding:5px 8px;cursor:pointer;display:flex;align-items:center}.tool:hover{background:#eee;border-radius:5px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}.color-picker-btn{position:relative}.color-picker-btn mat-icon{font-size:22px!important}.hidden-color-picker{position:absolute;inset:0;opacity:0;cursor:pointer}.gradient-text{background:linear-gradient(to right,var(--gradient-start),var(--gradient-end));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;display:inline-block}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:9px;overflow:hidden}.colorType button{font-size:12px!important;padding:7px 9px!important;border:none;background:#fff;cursor:pointer}.solid{border-right:1px solid #E9E9E9!important}.solidColorSelected,.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff}.gradient-picker{display:flex;gap:5px}.gradient-picker input{width:32px;height:32px;border:none;padding:0;cursor:pointer}.white-space-nowrap{white-space:nowrap}.font-size-field{width:120px;border:1px solid lightgrey;border-radius:10px}::ng-deep .font-size-field .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .font-size-field .mdc-notched-outline{display:none}::ng-deep .font-size-field .mat-mdc-text-field-wrapper{background:transparent!important;padding-left:8px!important;padding-right:8px!important;height:36px!important}::ng-deep .font-size-field .mat-mdc-select-value{font-size:14px;font-weight:600}::ng-deep .mat-mdc-select-panel{border-radius:12px!important}@media screen and (max-width: 475px){.toolbar{max-width:95%;flex-wrap:wrap;row-gap:10px}}@media screen and (max-width: 768px){.toolbar{width:max-content;max-width:calc(100vw - 20px);flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
337
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TextEditorComponent, isStandalone: true, selector: "simpo-text-editor", inputs: { value: "value", editable: "editable", sectionId: "sectionId", label: "label", type: "type" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:mousedown": "onMouseDown()" } }, viewQueries: [{ propertyName: "editorElement", first: true, predicate: ["editorContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- text-editor.component.html -->\r\n\r\n<div class=\"editor-container\" *ngIf=\"editable; else viewMode\">\r\n\r\n <!-- FLOATING TOOLBAR -->\r\n <div class=\"toolbar\" *ngIf=\"showToolbar\" [style.top.px]=\"toolbarY\" [style.left.px]=\"toolbarX\" cdkDrag>\r\n <button class=\"tool drag-handle w-auto\" cdkDragHandle>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-grip-vertical\">\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n </button>\r\n <mat-form-field appearance=\"outline\" class=\"font-size-field\">\r\n\r\n <mat-select [value]=\"selectedFontSize\" (selectionChange)=\"changeFontSize($event.value)\" disableOptionCentering>\r\n\r\n <mat-option value=\"\">\r\n Default\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1rem)\">\r\n 14\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1.25rem)\">\r\n 16\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1rem, 3vw, 1.5rem)\">\r\n 20\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1.25rem, 4vw, 2rem)\">\r\n 24\r\n </mat-option>\r\n <mat-option value=\"clamp(2rem, 5vw, 3rem)\">\r\n 32\r\n </mat-option>\r\n <mat-option value=\"clamp(3.1rem, 7vw, 4.5rem)\">\r\n 48\r\n </mat-option>\r\n </mat-select>\r\n\r\n </mat-form-field>\r\n <!-- BOLD -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('bold')\" (click)=\"toggleBold()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-bold\">\r\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ITALIC -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('italic')\" (click)=\"toggleItalic()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-italic\">\r\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\r\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- UNDERLINE -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('underline')\" (click)=\"toggleUnderline()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-underline\">\r\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN LEFT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('left')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-left\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"17\" x2=\"3\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN CENTER -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('center')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-center\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"17\" x2=\"7\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"19\" x2=\"5\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN RIGHT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('right')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-right\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"21\" x2=\"7\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ORDERED LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleOrderedList()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list-ordered\">\r\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <path d=\"M4 6h1v4\" />\r\n <path d=\"M4 10h2\" />\r\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\r\n </svg>\r\n </button>\r\n <!-- BULLET LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleBulletList()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list\">\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- SOLID / GRADIENT -->\r\n <!-- SOLID / GRADIENT -->\r\n <div class=\"colorType\">\r\n\r\n <button class=\"solid w-auto\" [class.solidColorSelected]=\"selectedColorType === 'SOLID'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToSolid($event)\">\r\n Solid\r\n </button>\r\n\r\n <button class=\"gradient w-auto\" [class.gradientColorSelected]=\"selectedColorType === 'GRADIENT'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToGradient($event)\">\r\n Gradient\r\n </button>\r\n\r\n </div>\r\n\r\n <!-- SOLID COLOR -->\r\n <button class=\"tool color-picker-btn w-auto\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n\r\n <mat-icon>format_color_text</mat-icon>\r\n\r\n <input type=\"color\" class=\"hidden-color-picker\" [(ngModel)]=\"selectedColor\" (click)=\"openColorPicker()\"\r\n (input)=\"changeColor()\">\r\n\r\n </button>\r\n\r\n <!-- GRADIENT -->\r\n <div class=\"gradient-picker\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <input type=\"color\" [(ngModel)]=\"primaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n <input type=\"color\" [(ngModel)]=\"secondaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- TIPTAP EDITOR -->\r\n <div #editorContainer class=\"editable-text\">\r\n </div>\r\n\r\n</div>\r\n<ng-template #viewMode>\r\n <div class=\"read-only-text\" [innerHTML]=\"safeHtml\">\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;width:100%}.editable-text{cursor:text;width:100%;border:1px solid lightgrey;border-radius:10px}.editable-text ::ng-deep p{margin-bottom:0!important}::ng-deep .ProseMirror ol,::ng-deep .ProseMirror ul{padding-left:2rem;margin-left:0;list-style-position:inside}::ng-deep .ProseMirror li{text-align:inherit;margin-bottom:5px}::ng-deep .ProseMirror li p{display:inline}.ProseMirror{outline:none;min-height:120px;padding:5px}.ProseMirror p{margin:0}.toolbar{position:absolute;left:0;top:0;display:flex;align-items:center;gap:5px;background:#fff;padding:8px 14px;border-radius:22px;z-index:100000;box-shadow:#00000029 0 1px 4px;max-width:calc(100vw - 20px);overflow-x:auto;box-sizing:border-box}.tool{background:none;border:none;padding:5px 8px;cursor:pointer;display:flex;align-items:center}.tool:hover{background:#eee;border-radius:5px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}.color-picker-btn{position:relative}.color-picker-btn mat-icon{font-size:22px!important}.hidden-color-picker{position:absolute;inset:0;opacity:0;cursor:pointer}.gradient-text{background:linear-gradient(to right,var(--gradient-start),var(--gradient-end));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;display:inline-block}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:9px;overflow:hidden}.colorType button{font-size:12px!important;padding:7px 9px!important;border:none;background:#fff;cursor:pointer}.solid{border-right:1px solid #E9E9E9!important}.solidColorSelected,.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff}.gradient-picker{display:flex;gap:5px}.gradient-picker input{width:32px;height:32px;border:none;padding:0;cursor:pointer}.white-space-nowrap{white-space:nowrap}.font-size-field{width:120px;border:1px solid lightgrey;border-radius:10px}::ng-deep .font-size-field .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .font-size-field .mdc-notched-outline{display:none}::ng-deep .font-size-field .mat-mdc-text-field-wrapper{background:transparent!important;padding-left:8px!important;padding-right:8px!important;height:36px!important}::ng-deep .font-size-field .mat-mdc-select-value{font-size:14px;font-weight:600}::ng-deep .mat-mdc-select-panel{border-radius:12px!important}@media screen and (max-width: 475px){.toolbar{max-width:95%;flex-wrap:wrap;row-gap:10px}}@media screen and (max-width: 768px){.toolbar{width:max-content;max-width:calc(100vw - 20px);flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
336
338
|
}
|
|
337
339
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextEditorComponent, decorators: [{
|
|
338
340
|
type: Component,
|
|
@@ -344,7 +346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
344
346
|
MatSelectModule,
|
|
345
347
|
MatFormFieldModule,
|
|
346
348
|
ContenteditableValueAccessor
|
|
347
|
-
], template: "<!-- text-editor.component.html -->\r\n\r\n<div class=\"editor-container\" *ngIf=\"editable; else viewMode\">\r\n\r\n <!-- FLOATING TOOLBAR -->\r\n <div class=\"toolbar\" *ngIf=\"showToolbar\" [style.top.px]=\"toolbarY\" [style.left.px]=\"toolbarX\" cdkDrag>\r\n <button class=\"tool drag-handle w-auto\" cdkDragHandle>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-grip-vertical\">\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n </button>\r\n <mat-form-field appearance=\"outline\" class=\"font-size-field\">\r\n\r\n <mat-select [value]=\"selectedFontSize\" (selectionChange)=\"changeFontSize($event.value)\" disableOptionCentering>\r\n\r\n <mat-option value=\"\">\r\n Default\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1rem)\">\r\n 14\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1.25rem)\">\r\n 16\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1rem, 3vw, 1.5rem)\">\r\n 20\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1.25rem, 4vw, 2rem)\">\r\n 24\r\n </mat-option>\r\n <mat-option value=\"clamp(2rem, 5vw, 3rem)\">\r\n 32\r\n </mat-option>\r\n <mat-option value=\"clamp(3.1rem, 7vw, 4.5rem)\">\r\n 48\r\n </mat-option>\r\n </mat-select>\r\n\r\n </mat-form-field>\r\n <!-- BOLD -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('bold')\" (click)=\"toggleBold()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-bold\">\r\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ITALIC -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('italic')\" (click)=\"toggleItalic()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-italic\">\r\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\r\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- UNDERLINE -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('underline')\" (click)=\"toggleUnderline()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-underline\">\r\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN LEFT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('left')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-left\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"17\" x2=\"3\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN CENTER -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('center')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-center\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"17\" x2=\"7\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"19\" x2=\"5\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN RIGHT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('right')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-right\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"21\" x2=\"7\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ORDERED LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleOrderedList()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list-ordered\">\r\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <path d=\"M4 6h1v4\" />\r\n <path d=\"M4 10h2\" />\r\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\r\n </svg>\r\n </button>\r\n <!-- BULLET LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleBulletList()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list\">\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- SOLID / GRADIENT -->\r\n <!-- SOLID / GRADIENT -->\r\n <div class=\"colorType\">\r\n\r\n <button class=\"solid w-auto\" [class.solidColorSelected]=\"selectedColorType === 'SOLID'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToSolid($event)\">\r\n Solid\r\n </button>\r\n\r\n <button class=\"gradient w-auto\" [class.gradientColorSelected]=\"selectedColorType === 'GRADIENT'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToGradient($event)\">\r\n Gradient\r\n </button>\r\n\r\n </div>\r\n\r\n <!-- SOLID COLOR -->\r\n <button class=\"tool color-picker-btn w-auto\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n\r\n <mat-icon>format_color_text</mat-icon>\r\n\r\n <input type=\"color\" class=\"hidden-color-picker\" [(ngModel)]=\"selectedColor\" (click)=\"openColorPicker()\"\r\n (input)=\"changeColor()\">\r\n\r\n </button>\r\n\r\n <!-- GRADIENT -->\r\n <div class=\"gradient-picker\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <input type=\"color\" [(ngModel)]=\"primaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n <input type=\"color\" [(ngModel)]=\"secondaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- TIPTAP EDITOR -->\r\n <div #editorContainer class=\"editable-text\">\r\n </div>\r\n\r\n</div>\r\n<ng-template #viewMode>\r\n <div class=\"read-only-text\" [innerHTML]=\"value\">\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;width:100%}.editable-text{cursor:text;width:100%;border:1px solid lightgrey;border-radius:10px}.editable-text ::ng-deep p{margin-bottom:0!important}::ng-deep .ProseMirror ol,::ng-deep .ProseMirror ul{padding-left:2rem;margin-left:0;list-style-position:inside}::ng-deep .ProseMirror li{text-align:inherit;margin-bottom:5px}::ng-deep .ProseMirror li p{display:inline}.ProseMirror{outline:none;min-height:120px;padding:5px}.ProseMirror p{margin:0}.toolbar{position:absolute;left:0;top:0;display:flex;align-items:center;gap:5px;background:#fff;padding:8px 14px;border-radius:22px;z-index:100000;box-shadow:#00000029 0 1px 4px;max-width:calc(100vw - 20px);overflow-x:auto;box-sizing:border-box}.tool{background:none;border:none;padding:5px 8px;cursor:pointer;display:flex;align-items:center}.tool:hover{background:#eee;border-radius:5px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}.color-picker-btn{position:relative}.color-picker-btn mat-icon{font-size:22px!important}.hidden-color-picker{position:absolute;inset:0;opacity:0;cursor:pointer}.gradient-text{background:linear-gradient(to right,var(--gradient-start),var(--gradient-end));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;display:inline-block}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:9px;overflow:hidden}.colorType button{font-size:12px!important;padding:7px 9px!important;border:none;background:#fff;cursor:pointer}.solid{border-right:1px solid #E9E9E9!important}.solidColorSelected,.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff}.gradient-picker{display:flex;gap:5px}.gradient-picker input{width:32px;height:32px;border:none;padding:0;cursor:pointer}.white-space-nowrap{white-space:nowrap}.font-size-field{width:120px;border:1px solid lightgrey;border-radius:10px}::ng-deep .font-size-field .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .font-size-field .mdc-notched-outline{display:none}::ng-deep .font-size-field .mat-mdc-text-field-wrapper{background:transparent!important;padding-left:8px!important;padding-right:8px!important;height:36px!important}::ng-deep .font-size-field .mat-mdc-select-value{font-size:14px;font-weight:600}::ng-deep .mat-mdc-select-panel{border-radius:12px!important}@media screen and (max-width: 475px){.toolbar{max-width:95%;flex-wrap:wrap;row-gap:10px}}@media screen and (max-width: 768px){.toolbar{width:max-content;max-width:calc(100vw - 20px);flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden}}\n"] }]
|
|
349
|
+
], template: "<!-- text-editor.component.html -->\r\n\r\n<div class=\"editor-container\" *ngIf=\"editable; else viewMode\">\r\n\r\n <!-- FLOATING TOOLBAR -->\r\n <div class=\"toolbar\" *ngIf=\"showToolbar\" [style.top.px]=\"toolbarY\" [style.left.px]=\"toolbarX\" cdkDrag>\r\n <button class=\"tool drag-handle w-auto\" cdkDragHandle>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-grip-vertical\">\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n </button>\r\n <mat-form-field appearance=\"outline\" class=\"font-size-field\">\r\n\r\n <mat-select [value]=\"selectedFontSize\" (selectionChange)=\"changeFontSize($event.value)\" disableOptionCentering>\r\n\r\n <mat-option value=\"\">\r\n Default\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1rem)\">\r\n 14\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(0.75rem, 2vw, 1.25rem)\">\r\n 16\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1rem, 3vw, 1.5rem)\">\r\n 20\r\n </mat-option>\r\n\r\n <mat-option value=\"clamp(1.25rem, 4vw, 2rem)\">\r\n 24\r\n </mat-option>\r\n <mat-option value=\"clamp(2rem, 5vw, 3rem)\">\r\n 32\r\n </mat-option>\r\n <mat-option value=\"clamp(3.1rem, 7vw, 4.5rem)\">\r\n 48\r\n </mat-option>\r\n </mat-select>\r\n\r\n </mat-form-field>\r\n <!-- BOLD -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('bold')\" (click)=\"toggleBold()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-bold\">\r\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ITALIC -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('italic')\" (click)=\"toggleItalic()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-italic\">\r\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\r\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- UNDERLINE -->\r\n <button class=\"tool w-auto\" [class.selectedTool]=\"editor?.isActive('underline')\" (click)=\"toggleUnderline()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-underline\">\r\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN LEFT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('left')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-left\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"17\" x2=\"3\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN CENTER -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('center')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-center\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"17\" x2=\"7\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"19\" x2=\"5\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ALIGN RIGHT -->\r\n <button class=\"tool w-auto\" (click)=\"setAlign('right')\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-align-right\">\r\n <line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"21\" x2=\"7\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- ORDERED LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleOrderedList()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list-ordered\">\r\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <path d=\"M4 6h1v4\" />\r\n <path d=\"M4 10h2\" />\r\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\r\n </svg>\r\n </button>\r\n <!-- BULLET LIST -->\r\n <button class=\"tool w-auto\" (click)=\"toggleBulletList()\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-list\">\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- SOLID / GRADIENT -->\r\n <!-- SOLID / GRADIENT -->\r\n <div class=\"colorType\">\r\n\r\n <button class=\"solid w-auto\" [class.solidColorSelected]=\"selectedColorType === 'SOLID'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToSolid($event)\">\r\n Solid\r\n </button>\r\n\r\n <button class=\"gradient w-auto\" [class.gradientColorSelected]=\"selectedColorType === 'GRADIENT'\"\r\n (mousedown)=\"$event.preventDefault()\" (click)=\"switchToGradient($event)\">\r\n Gradient\r\n </button>\r\n\r\n </div>\r\n\r\n <!-- SOLID COLOR -->\r\n <button class=\"tool color-picker-btn w-auto\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n\r\n <mat-icon>format_color_text</mat-icon>\r\n\r\n <input type=\"color\" class=\"hidden-color-picker\" [(ngModel)]=\"selectedColor\" (click)=\"openColorPicker()\"\r\n (input)=\"changeColor()\">\r\n\r\n </button>\r\n\r\n <!-- GRADIENT -->\r\n <div class=\"gradient-picker\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <input type=\"color\" [(ngModel)]=\"primaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n <input type=\"color\" [(ngModel)]=\"secondaryColor\" (click)=\"openColorPicker()\" (input)=\"applyGradient()\" />\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- TIPTAP EDITOR -->\r\n <div #editorContainer class=\"editable-text\">\r\n </div>\r\n\r\n</div>\r\n<ng-template #viewMode>\r\n <div class=\"read-only-text\" [innerHTML]=\"safeHtml\">\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;width:100%}.editable-text{cursor:text;width:100%;border:1px solid lightgrey;border-radius:10px}.editable-text ::ng-deep p{margin-bottom:0!important}::ng-deep .ProseMirror ol,::ng-deep .ProseMirror ul{padding-left:2rem;margin-left:0;list-style-position:inside}::ng-deep .ProseMirror li{text-align:inherit;margin-bottom:5px}::ng-deep .ProseMirror li p{display:inline}.ProseMirror{outline:none;min-height:120px;padding:5px}.ProseMirror p{margin:0}.toolbar{position:absolute;left:0;top:0;display:flex;align-items:center;gap:5px;background:#fff;padding:8px 14px;border-radius:22px;z-index:100000;box-shadow:#00000029 0 1px 4px;max-width:calc(100vw - 20px);overflow-x:auto;box-sizing:border-box}.tool{background:none;border:none;padding:5px 8px;cursor:pointer;display:flex;align-items:center}.tool:hover{background:#eee;border-radius:5px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}.color-picker-btn{position:relative}.color-picker-btn mat-icon{font-size:22px!important}.hidden-color-picker{position:absolute;inset:0;opacity:0;cursor:pointer}.gradient-text{background:linear-gradient(to right,var(--gradient-start),var(--gradient-end));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;display:inline-block}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:9px;overflow:hidden}.colorType button{font-size:12px!important;padding:7px 9px!important;border:none;background:#fff;cursor:pointer}.solid{border-right:1px solid #E9E9E9!important}.solidColorSelected,.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff}.gradient-picker{display:flex;gap:5px}.gradient-picker input{width:32px;height:32px;border:none;padding:0;cursor:pointer}.white-space-nowrap{white-space:nowrap}.font-size-field{width:120px;border:1px solid lightgrey;border-radius:10px}::ng-deep .font-size-field .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .font-size-field .mdc-notched-outline{display:none}::ng-deep .font-size-field .mat-mdc-text-field-wrapper{background:transparent!important;padding-left:8px!important;padding-right:8px!important;height:36px!important}::ng-deep .font-size-field .mat-mdc-select-value{font-size:14px;font-weight:600}::ng-deep .mat-mdc-select-panel{border-radius:12px!important}@media screen and (max-width: 475px){.toolbar{max-width:95%;flex-wrap:wrap;row-gap:10px}}@media screen and (max-width: 768px){.toolbar{width:max-content;max-width:calc(100vw - 20px);flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden}}\n"] }]
|
|
348
350
|
}], propDecorators: { value: [{
|
|
349
351
|
type: Input
|
|
350
352
|
}], valueChange: [{
|
|
@@ -364,4 +366,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
364
366
|
type: HostListener,
|
|
365
367
|
args: ['document:mousedown']
|
|
366
368
|
}] } });
|
|
367
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUUzQixPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxZQUFZLEVBRWIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7OztBQW9CNUQsTUFBTSxPQUFPLG1CQUFtQjtJQWxCaEM7UUF5QkUs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SUFBSSxFQUFFLEVBQUUsRUFBRSxHQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFFOUIsSUFBSSxJQUFJLEtBQUssRUFBRTtZQUNiLE9BQU87UUFFVCxJQUFJLENBQUMsTUFBTTthQUNSLEtBQUssRUFBRTthQUNQLEtBQUssRUFBRTthQUNQLGdCQUFnQixDQUFDO1lBQ2hCLElBQUk7WUFDSixFQUFFO1NBQ0gsQ0FBQzthQUNELE9BQU8sQ0FDTixXQUFXLEVBQ1g7WUFDRSxRQUFRO1NBQ1QsQ0FDRjthQUNBLEdBQUcsRUFBRSxDQUFDO0lBRVgsQ0FBQzsrR0ExbUJVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHFhQzlEaEMsK3BRQTZMYyxpckZENUlWLFlBQVksa0lBQ1osV0FBVyw4bUJBQ1gsYUFBYSxvTEFDYixPQUFPLHVjQUNQLGVBQWUsODNCQUNmLGtCQUFrQjs7NEZBUVQsbUJBQW1CO2tCQWxCL0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUVQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxhQUFhO3dCQUNiLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLDRCQUE0QjtxQkFDN0I7OEJBYUQsS0FBSztzQkFESixLQUFLO2dCQUtOLFdBQVc7c0JBRFYsTUFBTTtnQkFLUCxRQUFRO3NCQURQLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixTQUFTO3VCQUFDLGlCQUFpQjtnQkFtaUI1QixXQUFXO3NCQUpWLFlBQVk7dUJBQ1gsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdGV4dC1lZGl0b3IuY29tcG9uZW50LnRzXHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBQTEFURk9STV9JRCxcclxuICBpbmplY3QsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29tbW9uTW9kdWxlLFxyXG4gIGlzUGxhdGZvcm1Ccm93c2VyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRG9tU2FuaXRpemVyLFxyXG4gIFNhZmVIdG1sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuXHJcbmltcG9ydCB7IENka0RyYWcgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuXHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcblxyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuXHJcbmltcG9ydCB7IENvbnRlbnRlZGl0YWJsZVZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGVudGVkaXRhYmxlLmRpcmVjdGl2ZSc7XHJcblxyXG5pbXBvcnQgeyBHcmFkaWVudEV4dGVuc2lvbiB9IGZyb20gJy4uLy4uL3N0eWxlcy9ncmFkaWVudC1leHRlbnNpb24nO1xyXG5cclxuaW1wb3J0IHsgRm9udFNpemUgfSBmcm9tICcuLi8uLi9zdHlsZXMvdGV4dC1zaXplLmV4dGVuc2lvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXRleHQtZWRpdG9yJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG5cclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBDZGtEcmFnLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgQ29udGVudGVkaXRhYmxlVmFsdWVBY2Nlc3NvclxyXG4gIF0sXHJcblxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dEVkaXRvckNvbXBvbmVudFxyXG4gIGltcGxlbWVudHNcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHZhbHVlOiBzdHJpbmcgPVxyXG4gICAgJzxwPkhlbGxvIHRoaXMgaXMgcGFsYXNoIG1ha2hpamE8L3A+JztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgdmFsdWVDaGFuZ2UgPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWN0aW9uSWQ/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdHlwZT86IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yQ29udGFpbmVyJylcclxuICBlZGl0b3JFbGVtZW50ITogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBwbGF0Zm9ybUlkID1cclxuICAgIGluamVjdChQTEFURk9STV9JRCk7XHJcblxyXG4gIHByaXZhdGUgc2FuaXRpemVyID1cclxuICAgIGluamVjdChEb21TYW5pdGl6ZXIpO1xyXG5cclxuICBlZGl0b3I6IGFueTtcclxuXHJcbiAgc2FmZUh0bWwhOiBTYWZlSHRtbDtcclxuXHJcbiAgc2VsZWN0ZWRGb250U2l6ZSA9ICcnO1xyXG5cclxuICBzaG93VG9vbGJhciA9IGZhbHNlO1xyXG5cclxuICB0b29sYmFyWCA9IDA7XHJcblxyXG4gIHRvb2xiYXJZID0gMTAwO1xyXG5cclxuICBzZWxlY3RlZENvbG9yID0gJyMwMDAwMDAnO1xyXG5cclxuICBwcmltYXJ5Q29sb3IgPSAnIzAwMDAwMCc7XHJcblxyXG4gIHNlY29uZGFyeUNvbG9yID0gJyNmZjAwMDAnO1xyXG5cclxuICBpc0NvbG9yUGlja2VyT3BlbiA9IGZhbHNlO1xyXG5cclxuICBzZWxlY3RlZENvbG9yVHlwZTpcclxuICAgICdTT0xJRCcgfCAnR1JBRElFTlQnID0gJ1NPTElEJztcclxuXHJcbiAgc2F2ZWRTZWxlY3Rpb246IGFueSA9IG51bGw7XHJcblxyXG4gIGlzRm9udFNpemVNZW51T3BlbiA9IGZhbHNlO1xyXG5cclxuICB0b29sYmFyRGF0YTogYW55ID0ge1xyXG4gICAgc2VsZWN0ZWRTaXplOiAnJ1xyXG4gIH07XHJcblxyXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVNhZmVIdG1sKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmVkaXRhYmxlICYmXHJcbiAgICAgIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZClcclxuICAgICkge1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplRWRpdG9yKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKFxyXG4gICAgY2hhbmdlczogU2ltcGxlQ2hhbmdlc1xyXG4gICk6IHZvaWQge1xyXG5cclxuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddKSB7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZVNhZmVIdG1sKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5lZGl0b3IgJiZcclxuICAgICAgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKVxyXG4gICAgKSB7XHJcblxyXG4gICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZVNhZmVIdG1sKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuc2FmZUh0bWwgPVxyXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgICB0aGlzLnZhbHVlIHx8ICcnXHJcbiAgICAgICk7XHJcblxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdGlhbGl6ZUVkaXRvcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZWRpdG9yRWxlbWVudClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgRWRpdG9yIH0gPVxyXG4gICAgICBhd2FpdCBpbXBvcnQoJ0B0aXB0YXAvY29yZScpO1xyXG5cclxuICAgIGNvbnN0IFN0YXJ0ZXJLaXQgPVxyXG4gICAgICAoYXdhaXQgaW1wb3J0KCdAdGlwdGFwL3N0YXJ0ZXIta2l0JykpLmRlZmF1bHQ7XHJcblxyXG4gICAgY29uc3QgVGV4dFN0eWxlID1cclxuICAgICAgKGF3YWl0IGltcG9ydCgnQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZScpKVxyXG4gICAgICAgIC5UZXh0U3R5bGU7XHJcblxyXG4gICAgY29uc3QgQ29sb3IgPVxyXG4gICAgICAoYXdhaXQgaW1wb3J0KCdAdGlwdGFwL2V4dGVuc2lvbi1jb2xvcicpKVxyXG4gICAgICAgIC5kZWZhdWx0O1xyXG5cclxuICAgIGNvbnN0IFVuZGVybGluZSA9XHJcbiAgICAgIChhd2FpdCBpbXBvcnQoJ0B0aXB0YXAvZXh0ZW5zaW9uLXVuZGVybGluZScpKVxyXG4gICAgICAgIC5kZWZhdWx0O1xyXG5cclxuICAgIGNvbnN0IFRleHRBbGlnbiA9XHJcbiAgICAgIChhd2FpdCBpbXBvcnQoJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQtYWxpZ24nKSlcclxuICAgICAgICAuZGVmYXVsdDtcclxuXHJcbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xyXG5cclxuICAgICAgZWxlbWVudDpcclxuICAgICAgICB0aGlzLmVkaXRvckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuXHJcbiAgICAgIGVkaXRvclByb3BzOiB7XHJcblxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgIGNsYXNzOiAnUHJvc2VNaXJyb3InXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSxcclxuXHJcbiAgICAgIGV4dGVuc2lvbnM6IFtcclxuXHJcbiAgICAgICAgU3RhcnRlcktpdCxcclxuXHJcbiAgICAgICAgVGV4dFN0eWxlLFxyXG5cclxuICAgICAgICBGb250U2l6ZSxcclxuXHJcbiAgICAgICAgQ29sb3IsXHJcblxyXG4gICAgICAgIEdyYWRpZW50RXh0ZW5zaW9uLFxyXG5cclxuICAgICAgICBVbmRlcmxpbmUsXHJcblxyXG4gICAgICAgIFRleHRBbGlnbi5jb25maWd1cmUoe1xyXG4gICAgICAgICAgdHlwZXM6IFtcclxuICAgICAgICAgICAgJ2hlYWRpbmcnLFxyXG4gICAgICAgICAgICAncGFyYWdyYXBoJyxcclxuICAgICAgICAgICAgJ2xpc3RJdGVtJ1xyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KSxcclxuXHJcbiAgICAgIF0sXHJcblxyXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlLFxyXG5cclxuICAgICAgb25TZWxlY3Rpb25VcGRhdGU6ICgpID0+IHtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvblVwZGF0ZTogKHsgZWRpdG9yIH06IGFueSkgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sID1cclxuICAgICAgICAgIGVkaXRvci5nZXRIVE1MKCk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWUgPSBodG1sO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVNhZmVIdG1sKCk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChodG1sKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVFbXB0eUVkaXRvckNsYXNzKCk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVFbXB0eUVkaXRvckNsYXNzKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRW1wdHlFZGl0b3JDbGFzcygpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZWRpdG9yRWxlbWVudClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGVkaXRvcldyYXBwZXIgPVxyXG4gICAgICB0aGlzLmVkaXRvckVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgIC5jbG9zZXN0KCcuZWRpdGFibGUtdGV4dCcpO1xyXG5cclxuICAgIGlmICghZWRpdG9yV3JhcHBlcilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRvcj8uaXNFbXB0eSkge1xyXG5cclxuICAgICAgZWRpdG9yV3JhcHBlci5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICdlZGl0b3ItZW1wdHknXHJcbiAgICAgICk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGVkaXRvcldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZShcclxuICAgICAgICAnZWRpdG9yLWVtcHR5J1xyXG4gICAgICApO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzYXZlU2VsZWN0aW9uKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPVxyXG4gICAgICB0aGlzLmVkaXRvci5zdGF0ZS5zZWxlY3Rpb247XHJcblxyXG4gIH1cclxuXHJcbiAgcmVzdG9yZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuc2F2ZWRTZWxlY3Rpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAuc2V0VGV4dFNlbGVjdGlvbihcclxuICAgICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uXHJcbiAgICAgIClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHN3aXRjaFRvU29saWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNhdmVTZWxlY3Rpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JUeXBlID0gJ1NPTElEJztcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3dpdGNoVG9HcmFkaWVudChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2F2ZVNlbGVjdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2xvclR5cGUgPSAnR1JBRElFTlQnO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBvcGVuQ29sb3JQaWNrZXIoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5pc0NvbG9yUGlja2VyT3BlbiA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAnZm9jdXMnLFxyXG4gICAgICAgIHRoaXMuaGFuZGxlV2luZG93Rm9jdXMsXHJcbiAgICAgICAgeyBvbmNlOiB0cnVlIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBoYW5kbGVXaW5kb3dGb2N1cyA9ICgpOiB2b2lkID0+IHtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuaXNDb2xvclBpY2tlck9wZW4gPSBmYWxzZTtcclxuXHJcbiAgICB9LCAzMDApO1xyXG5cclxuICB9XHJcblxyXG4gIGhhbmRsZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPVxyXG4gICAgICB0aGlzLmVkaXRvci5zdGF0ZS5zZWxlY3Rpb247XHJcblxyXG4gICAgaWYgKGZyb20gPT09IHRvKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb2xvclBpY2tlck9wZW4pIHtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPVxyXG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhc2VsZWN0aW9uIHx8XHJcbiAgICAgIHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwXHJcbiAgICApIHtcclxuXHJcbiAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPVxyXG4gICAgICBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICBjb25zdCByZWN0ID1cclxuICAgICAgcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgY29uc3QgZWRpdG9yUmVjdCA9XHJcbiAgICAgIHRoaXMuZWRpdG9yRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0cnVlO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgY29uc3QgdG9vbGJhciA9XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICcudG9vbGJhcidcclxuICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKCF0b29sYmFyKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IHRvb2xiYXJXaWR0aCA9XHJcbiAgICAgICAgdG9vbGJhci5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgIGxldCBsZWZ0ID1cclxuICAgICAgICByZWN0LmxlZnQgLVxyXG4gICAgICAgIGVkaXRvclJlY3QubGVmdCArXHJcbiAgICAgICAgKHJlY3Qud2lkdGggLyAyKSAtXHJcbiAgICAgICAgKHRvb2xiYXJXaWR0aCAvIDIpO1xyXG5cclxuICAgICAgbGVmdCA9IE1hdGgubWF4KDEwLCBsZWZ0KTtcclxuXHJcbiAgICAgIGNvbnN0IG1heExlZnQgPVxyXG4gICAgICAgIGVkaXRvclJlY3Qud2lkdGggLVxyXG4gICAgICAgIHRvb2xiYXJXaWR0aCAtXHJcbiAgICAgICAgMTA7XHJcblxyXG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgbWF4TGVmdCk7XHJcblxyXG4gICAgICBsZWZ0ID0gTWF0aC5tYXgoMTAsIGxlZnQpO1xyXG5cclxuICAgICAgdGhpcy50b29sYmFyWCA9IGxlZnQ7XHJcblxyXG4gICAgICB0aGlzLnRvb2xiYXJZID1cclxuICAgICAgICByZWN0LmJvdHRvbSAtXHJcbiAgICAgICAgZWRpdG9yUmVjdC50b3AgK1xyXG4gICAgICAgIDEwO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZUJvbGQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5lZGl0b3JcclxuICAgICAgLmNoYWluKClcclxuICAgICAgLmZvY3VzKClcclxuICAgICAgLnRvZ2dsZUJvbGQoKVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSXRhbGljKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC50b2dnbGVJdGFsaWMoKVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVW5kZXJsaW5lKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC50b2dnbGVVbmRlcmxpbmUoKVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlT3JkZXJlZExpc3QoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5lZGl0b3JcclxuICAgICAgLmNoYWluKClcclxuICAgICAgLmZvY3VzKClcclxuICAgICAgLnRvZ2dsZU9yZGVyZWRMaXN0KClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZUJ1bGxldExpc3QoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5lZGl0b3JcclxuICAgICAgLmNoYWluKClcclxuICAgICAgLmZvY3VzKClcclxuICAgICAgLnRvZ2dsZUJ1bGxldExpc3QoKVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgc2V0QWxpZ24oXHJcbiAgICBhbGlnbm1lbnQ6XHJcbiAgICAgICdsZWZ0JyB8XHJcbiAgICAgICdjZW50ZXInIHxcclxuICAgICAgJ3JpZ2h0J1xyXG4gICk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC5zZXRUZXh0QWxpZ24oYWxpZ25tZW50KVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgY2hhbmdlQ29sb3IoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgeyBmcm9tLCB0byB9ID1cclxuICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICAgIGlmIChmcm9tID09PSB0bylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGVzID1cclxuICAgICAgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhcclxuICAgICAgICAndGV4dFN0eWxlJ1xyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC5zZXRUZXh0U2VsZWN0aW9uKHtcclxuICAgICAgICBmcm9tLFxyXG4gICAgICAgIHRvXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7XHJcblxyXG4gICAgICAgIC4uLmV4aXN0aW5nU3R5bGVzLFxyXG5cclxuICAgICAgICBjb2xvcjpcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2xvcixcclxuXHJcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBudWxsLFxyXG5cclxuICAgICAgICBXZWJraXRCYWNrZ3JvdW5kQ2xpcDogbnVsbCxcclxuXHJcbiAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogbnVsbFxyXG5cclxuICAgICAgfSlcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIGFwcGx5R3JhZGllbnQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgeyBmcm9tLCB0byB9ID1cclxuICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICAgIGlmIChmcm9tID09PSB0bylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGVzID1cclxuICAgICAgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhcclxuICAgICAgICAndGV4dFN0eWxlJ1xyXG4gICAgICApO1xyXG5cclxuICAgIGNvbnN0IGdyYWRpZW50ID0gYFxyXG4gICAgICBsaW5lYXItZ3JhZGllbnQoXHJcbiAgICAgICAgdG8gcmlnaHQsXHJcbiAgICAgICAgJHt0aGlzLnByaW1hcnlDb2xvcn0sXHJcbiAgICAgICAgJHt0aGlzLnNlY29uZGFyeUNvbG9yfVxyXG4gICAgICApXHJcbiAgICBgO1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC5zZXRUZXh0U2VsZWN0aW9uKHtcclxuICAgICAgICBmcm9tLFxyXG4gICAgICAgIHRvXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7XHJcblxyXG4gICAgICAgIC4uLmV4aXN0aW5nU3R5bGVzLFxyXG5cclxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6XHJcbiAgICAgICAgICBncmFkaWVudCxcclxuXHJcbiAgICAgICAgYmFja2dyb3VuZENsaXA6XHJcbiAgICAgICAgICAndGV4dCcsXHJcblxyXG4gICAgICAgIFdlYmtpdEJhY2tncm91bmRDbGlwOlxyXG4gICAgICAgICAgJ3RleHQnLFxyXG5cclxuICAgICAgICBjb2xvcjpcclxuICAgICAgICAgICd0cmFuc3BhcmVudCcsXHJcblxyXG4gICAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6XHJcbiAgICAgICAgICAndHJhbnNwYXJlbnQnXHJcblxyXG4gICAgICB9KVxyXG4gICAgICAucnVuKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcclxuICAgICdkb2N1bWVudDptb3VzZWRvd24nXHJcbiAgKVxyXG5cclxuICBvbk1vdXNlRG93bigpOiB2b2lkIHtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5lZGl0b3IpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID1cclxuICAgICAgICB0aGlzLmVkaXRvci5zdGF0ZS5zZWxlY3Rpb247XHJcblxyXG4gICAgICB0aGlzLnNob3dUb29sYmFyID1cclxuICAgICAgICBmcm9tICE9PSB0bztcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBjaGFuZ2VGb250U2l6ZShcclxuICAgIGZvbnRTaXplOiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRm9udFNpemUgPVxyXG4gICAgICBmb250U2l6ZTtcclxuXHJcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPVxyXG4gICAgICB0aGlzLmVkaXRvci5zdGF0ZS5zZWxlY3Rpb247XHJcblxyXG4gICAgaWYgKGZyb20gPT09IHRvKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5lZGl0b3JcclxuICAgICAgLmNoYWluKClcclxuICAgICAgLmZvY3VzKClcclxuICAgICAgLnNldFRleHRTZWxlY3Rpb24oe1xyXG4gICAgICAgIGZyb20sXHJcbiAgICAgICAgdG9cclxuICAgICAgfSlcclxuICAgICAgLnNldE1hcmsoXHJcbiAgICAgICAgJ3RleHRTdHlsZScsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZm9udFNpemVcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG59IiwiPCEtLSB0ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCAtLT5cclxuXHJcbjxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCIgKm5nSWY9XCJlZGl0YWJsZTsgZWxzZSB2aWV3TW9kZVwiPlxyXG5cclxuICA8IS0tIEZMT0FUSU5HIFRPT0xCQVIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cInNob3dUb29sYmFyXCIgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyWVwiIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2xiYXJYXCIgY2RrRHJhZz5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGRyYWctaGFuZGxlIHctYXV0b1wiIGNka0RyYWdIYW5kbGU+XHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWdyaXAtdmVydGljYWxcIj5cclxuICAgICAgICA8Y2lyY2xlIGN4PVwiOVwiIGN5PVwiMTJcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjlcIiBjeT1cIjVcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjlcIiBjeT1cIjE5XCIgcj1cIjFcIiAvPlxyXG4gICAgICAgIDxjaXJjbGUgY3g9XCIxNVwiIGN5PVwiMTJcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjE1XCIgY3k9XCI1XCIgcj1cIjFcIiAvPlxyXG4gICAgICAgIDxjaXJjbGUgY3g9XCIxNVwiIGN5PVwiMTlcIiByPVwiMVwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZvbnQtc2l6ZS1maWVsZFwiPlxyXG5cclxuICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cInNlbGVjdGVkRm9udFNpemVcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZUZvbnRTaXplKCRldmVudC52YWx1ZSlcIiBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nPlxyXG5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPlxyXG4gICAgICAgICAgRGVmYXVsdFxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgwLjc1cmVtLCAydncsIDFyZW0pXCI+XHJcbiAgICAgICAgICAxNFxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgwLjc1cmVtLCAydncsIDEuMjVyZW0pXCI+XHJcbiAgICAgICAgICAxNlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgxcmVtLCAzdncsIDEuNXJlbSlcIj5cclxuICAgICAgICAgIDIwXHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNsYW1wKDEuMjVyZW0sIDR2dywgMnJlbSlcIj5cclxuICAgICAgICAgIDI0XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiY2xhbXAoMnJlbSwgNXZ3LCAzcmVtKVwiPlxyXG4gICAgICAgICAgMzJcclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgzLjFyZW0sIDd2dywgNC41cmVtKVwiPlxyXG4gICAgICAgICAgNDhcclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuXHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPCEtLSBCT0xEIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgW2NsYXNzLnNlbGVjdGVkVG9vbF09XCJlZGl0b3I/LmlzQWN0aXZlKCdib2xkJylcIiAoY2xpY2spPVwidG9nZ2xlQm9sZCgpXCI+XHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWJvbGRcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTYgMTJoOWE0IDQgMCAwIDEgMCA4SDdhMSAxIDAgMCAxLTEtMVY1YTEgMSAwIDAgMSAxLTFoN2E0IDQgMCAwIDEgMCA4XCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tIElUQUxJQyAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIFtjbGFzcy5zZWxlY3RlZFRvb2xdPVwiZWRpdG9yPy5pc0FjdGl2ZSgnaXRhbGljJylcIiAoY2xpY2spPVwidG9nZ2xlSXRhbGljKClcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWl0YWxpY1wiPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTlcIiB4Mj1cIjEwXCIgeTE9XCI0XCIgeTI9XCI0XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE0XCIgeDI9XCI1XCIgeTE9XCIyMFwiIHkyPVwiMjBcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTVcIiB4Mj1cIjlcIiB5MT1cIjRcIiB5Mj1cIjIwXCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tIFVOREVSTElORSAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIFtjbGFzcy5zZWxlY3RlZFRvb2xdPVwiZWRpdG9yPy5pc0FjdGl2ZSgndW5kZXJsaW5lJylcIiAoY2xpY2spPVwidG9nZ2xlVW5kZXJsaW5lKClcIj5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk02IDR2NmE2IDYgMCAwIDAgMTIgMFY0XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjRcIiB4Mj1cIjIwXCIgeTE9XCIyMFwiIHkyPVwiMjBcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gTEVGVCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIChjbGljayk9XCJzZXRBbGlnbignbGVmdCcpXCI+XHJcblxyXG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxNVwiIHgyPVwiM1wiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE3XCIgeDI9XCIzXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gQ0VOVEVSIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgKGNsaWNrKT1cInNldEFsaWduKCdjZW50ZXInKVwiPlxyXG5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtYWxpZ24tY2VudGVyXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxN1wiIHgyPVwiN1wiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE5XCIgeDI9XCI1XCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gUklHSFQgLS0+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbCB3LWF1dG9cIiAoY2xpY2spPVwic2V0QWxpZ24oJ3JpZ2h0JylcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWFsaWduLXJpZ2h0XCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiOVwiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjIxXCIgeDI9XCI3XCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gT1JERVJFRCBMSVNUIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgKGNsaWNrKT1cInRvZ2dsZU9yZGVyZWRMaXN0KClcIj5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtbGlzdC1vcmRlcmVkXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxMFwiIHgyPVwiMjFcIiB5MT1cIjZcIiB5Mj1cIjZcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTBcIiB4Mj1cIjIxXCIgeTE9XCIxMlwiIHkyPVwiMTJcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTBcIiB4Mj1cIjIxXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNNCA2aDF2NFwiIC8+XHJcbiAgICAgICAgPHBhdGggZD1cIk00IDEwaDJcIiAvPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNNiAxOEg0YzAtMSAyLTIgMi0zcy0xLTEuNS0yLTFcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPCEtLSBCVUxMRVQgTElTVCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIChjbGljayk9XCJ0b2dnbGVCdWxsZXRMaXN0KClcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWxpc3RcIj5cclxuICAgICAgICA8bGluZSB4MT1cIjhcIiB4Mj1cIjIxXCIgeTE9XCI2XCIgeTI9XCI2XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjhcIiB4Mj1cIjIxXCIgeTE9XCIxMlwiIHkyPVwiMTJcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiOFwiIHgyPVwiMjFcIiB5MT1cIjE4XCIgeTI9XCIxOFwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIzXCIgeDI9XCIzLjAxXCIgeTE9XCI2XCIgeTI9XCI2XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjNcIiB4Mj1cIjMuMDFcIiB5MT1cIjEyXCIgeTI9XCIxMlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIzXCIgeDI9XCIzLjAxXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gU09MSUQgLyBHUkFESUVOVCAtLT5cclxuICAgIDwhLS0gU09MSUQgLyBHUkFESUVOVCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJzb2xpZCB3LWF1dG9cIiBbY2xhc3Muc29saWRDb2xvclNlbGVjdGVkXT1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnU09MSUQnXCJcclxuICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGNsaWNrKT1cInN3aXRjaFRvU29saWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIFNvbGlkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImdyYWRpZW50IHctYXV0b1wiIFtjbGFzcy5ncmFkaWVudENvbG9yU2VsZWN0ZWRdPVwic2VsZWN0ZWRDb2xvclR5cGUgPT09ICdHUkFESUVOVCdcIlxyXG4gICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwic3dpdGNoVG9HcmFkaWVudCgkZXZlbnQpXCI+XHJcbiAgICAgICAgR3JhZGllbnRcclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTT0xJRCBDT0xPUiAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGNvbG9yLXBpY2tlci1idG4gdy1hdXRvXCIgKm5nSWY9XCJzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ1wiPlxyXG5cclxuICAgICAgPG1hdC1pY29uPmZvcm1hdF9jb2xvcl90ZXh0PC9tYXQtaWNvbj5cclxuXHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImhpZGRlbi1jb2xvci1waWNrZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29sb3JcIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKClcIlxyXG4gICAgICAgIChpbnB1dCk9XCJjaGFuZ2VDb2xvcigpXCI+XHJcblxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBHUkFESUVOVCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJncmFkaWVudC1waWNrZXJcIiAqbmdJZj1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnR1JBRElFTlQnXCI+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbKG5nTW9kZWwpXT1cInByaW1hcnlDb2xvclwiIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoKVwiIChpbnB1dCk9XCJhcHBseUdyYWRpZW50KClcIiAvPlxyXG5cclxuICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwic2Vjb25kYXJ5Q29sb3JcIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKClcIiAoaW5wdXQpPVwiYXBwbHlHcmFkaWVudCgpXCIgLz5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVElQVEFQIEVESVRPUiAtLT5cclxuICA8ZGl2ICNlZGl0b3JDb250YWluZXIgY2xhc3M9XCJlZGl0YWJsZS10ZXh0XCI+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICN2aWV3TW9kZT5cclxuICA8ZGl2IGNsYXNzPVwicmVhZC1vbmx5LXRleHRcIiBbaW5uZXJIVE1MXT1cInZhbHVlXCI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7O0FBb0I1RCxNQUFNLE9BQU8sbUJBQW1CO0lBbEJoQztRQXlCRSxVQUFLLEdBQ0gscUNB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ZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFBMQVRGT1JNX0lELFxyXG4gIGluamVjdCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb21tb25Nb2R1bGUsXHJcbiAgaXNQbGF0Zm9ybUJyb3dzZXJcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcblxyXG5pbXBvcnQgeyBDZGtEcmFnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcblxyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5cclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcblxyXG5pbXBvcnQgeyBDb250ZW50ZWRpdGFibGVWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnRlZGl0YWJsZS5kaXJlY3RpdmUnO1xyXG5cclxuaW1wb3J0IHsgR3JhZGllbnRFeHRlbnNpb24gfSBmcm9tICcuLi8uLi9zdHlsZXMvZ3JhZGllbnQtZXh0ZW5zaW9uJztcclxuXHJcbmltcG9ydCB7IEZvbnRTaXplIH0gZnJvbSAnLi4vLi4vc3R5bGVzL3RleHQtc2l6ZS5leHRlbnNpb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby10ZXh0LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgQ2RrRHJhZyxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIENvbnRlbnRlZGl0YWJsZVZhbHVlQWNjZXNzb3JcclxuICBdLFxyXG5cclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RleHQtZWRpdG9yLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRFZGl0b3JDb21wb25lbnRcclxuICBpbXBsZW1lbnRzXHJcbiAgT25EZXN0cm95LFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KClcclxuICB2YWx1ZTogc3RyaW5nID1cclxuICAgICc8cD5IZWxsbyB0aGlzIGlzIHBhbGFzaCBtYWtoaWphPC9wPic7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHZhbHVlQ2hhbmdlID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VjdGlvbklkPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGxhYmVsPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHR5cGU/OiBzdHJpbmc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvckNvbnRhaW5lcicpXHJcbiAgZWRpdG9yRWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgcGxhdGZvcm1JZCA9XHJcbiAgICBpbmplY3QoUExBVEZPUk1fSUQpO1xyXG5cclxuICBwcml2YXRlIHNhbml0aXplciA9XHJcbiAgICBpbmplY3QoRG9tU2FuaXRpemVyKTtcclxuXHJcbiAgZWRpdG9yOiBhbnk7XHJcblxyXG4gIHNhZmVIdG1sITogU2FmZUh0bWw7XHJcblxyXG4gIHNlbGVjdGVkRm9udFNpemUgPSAnJztcclxuXHJcbiAgc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuXHJcbiAgdG9vbGJhclggPSAwO1xyXG5cclxuICB0b29sYmFyWSA9IDEwMDtcclxuXHJcbiAgc2VsZWN0ZWRDb2xvciA9ICcjMDAwMDAwJztcclxuXHJcbiAgcHJpbWFyeUNvbG9yID0gJyMwMDAwMDAnO1xyXG5cclxuICBzZWNvbmRhcnlDb2xvciA9ICcjZmYwMDAwJztcclxuXHJcbiAgaXNDb2xvclBpY2tlck9wZW4gPSBmYWxzZTtcclxuXHJcbiAgc2VsZWN0ZWRDb2xvclR5cGU6XHJcbiAgICAnU09MSUQnIHwgJ0dSQURJRU5UJyA9ICdTT0xJRCc7XHJcblxyXG4gIHNhdmVkU2VsZWN0aW9uOiBhbnkgPSBudWxsO1xyXG5cclxuICBpc0ZvbnRTaXplTWVudU9wZW4gPSBmYWxzZTtcclxuXHJcbiAgdG9vbGJhckRhdGE6IGFueSA9IHtcclxuICAgIHNlbGVjdGVkU2l6ZTogJydcclxuICB9O1xyXG5cclxuICBuZ09uQ2hhbmdlcyhcclxuICAgIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXNcclxuICApOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXSkge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgJ0lOUFVUIFZBTFVFOicsXHJcbiAgICAgICAgdGhpcy52YWx1ZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVTYWZlSHRtbCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgdGhpcy51cGRhdGVTYWZlSHRtbCgpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5lZGl0YWJsZSAmJlxyXG4gICAgICBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpXHJcbiAgICApIHtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUVkaXRvcigpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZWRpdG9yICYmXHJcbiAgICAgIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZClcclxuICAgICkge1xyXG5cclxuICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVTYWZlSHRtbCgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnNhZmVIdG1sID1cclxuICAgICAgdGhpcy5zYW5pdGl6ZXJcclxuICAgICAgICAuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXHJcbiAgICAgICAgICB0aGlzLnZhbHVlIHx8ICcnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICghdGhpcy5lZGl0b3JFbGVtZW50KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3QgeyBFZGl0b3IgfSA9XHJcbiAgICAgIGF3YWl0IGltcG9ydCgnQHRpcHRhcC9jb3JlJyk7XHJcblxyXG4gICAgY29uc3QgU3RhcnRlcktpdCA9XHJcbiAgICAgIChhd2FpdCBpbXBvcnQoJ0B0aXB0YXAvc3RhcnRlci1raXQnKSkuZGVmYXVsdDtcclxuXHJcbiAgICBjb25zdCBUZXh0U3R5bGUgPVxyXG4gICAgICAoYXdhaXQgaW1wb3J0KCdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0LXN0eWxlJykpXHJcbiAgICAgICAgLlRleHRTdHlsZTtcclxuXHJcbiAgICBjb25zdCBDb2xvciA9XHJcbiAgICAgIChhd2FpdCBpbXBvcnQoJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvbG9yJykpXHJcbiAgICAgICAgLmRlZmF1bHQ7XHJcblxyXG4gICAgY29uc3QgVW5kZXJsaW5lID1cclxuICAgICAgKGF3YWl0IGltcG9ydCgnQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lJykpXHJcbiAgICAgICAgLmRlZmF1bHQ7XHJcblxyXG4gICAgY29uc3QgVGV4dEFsaWduID1cclxuICAgICAgKGF3YWl0IGltcG9ydCgnQHRpcHRhcC9leHRlbnNpb24tdGV4dC1hbGlnbicpKVxyXG4gICAgICAgIC5kZWZhdWx0O1xyXG5cclxuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih7XHJcblxyXG4gICAgICBlbGVtZW50OlxyXG4gICAgICAgIHRoaXMuZWRpdG9yRWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG5cclxuICAgICAgZWRpdG9yUHJvcHM6IHtcclxuXHJcbiAgICAgICAgYXR0cmlidXRlczoge1xyXG4gICAgICAgICAgY2xhc3M6ICdQcm9zZU1pcnJvcidcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZXh0ZW5zaW9uczogW1xyXG5cclxuICAgICAgICBTdGFydGVyS2l0LFxyXG5cclxuICAgICAgICBUZXh0U3R5bGUsXHJcblxyXG4gICAgICAgIEZvbnRTaXplLFxyXG5cclxuICAgICAgICBDb2xvcixcclxuXHJcbiAgICAgICAgR3JhZGllbnRFeHRlbnNpb24sXHJcblxyXG4gICAgICAgIFVuZGVybGluZSxcclxuXHJcbiAgICAgICAgVGV4dEFsaWduLmNvbmZpZ3VyZSh7XHJcbiAgICAgICAgICB0eXBlczogW1xyXG4gICAgICAgICAgICAnaGVhZGluZycsXHJcbiAgICAgICAgICAgICdwYXJhZ3JhcGgnLFxyXG4gICAgICAgICAgICAnbGlzdEl0ZW0nXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgXSxcclxuXHJcbiAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUsXHJcblxyXG4gICAgICBvblNlbGVjdGlvblVwZGF0ZTogKCkgPT4ge1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfTogYW55KSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWwgPVxyXG4gICAgICAgICAgZWRpdG9yLmdldEhUTUwoKTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAnRURJVE9SIEhUTUw6JyxcclxuICAgICAgICAgIGh0bWxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnZhbHVlID0gaHRtbDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTYWZlSHRtbCgpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoaHRtbCk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRW1wdHlFZGl0b3JDbGFzcygpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlRW1wdHlFZGl0b3JDbGFzcygpO1xyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUVtcHR5RWRpdG9yQ2xhc3MoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVkaXRvckVsZW1lbnQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBlZGl0b3JXcmFwcGVyID1cclxuICAgICAgdGhpcy5lZGl0b3JFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAuY2xvc2VzdCgnLmVkaXRhYmxlLXRleHQnKTtcclxuXHJcbiAgICBpZiAoIWVkaXRvcldyYXBwZXIpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5lZGl0b3I/LmlzRW1wdHkpIHtcclxuXHJcbiAgICAgIGVkaXRvcldyYXBwZXIuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAnZWRpdG9yLWVtcHR5J1xyXG4gICAgICApO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBlZGl0b3JXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoXHJcbiAgICAgICAgJ2VkaXRvci1lbXB0eSdcclxuICAgICAgKTtcclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc2F2ZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID1cclxuICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICB9XHJcblxyXG4gIHJlc3RvcmVTZWxlY3Rpb24oKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNhdmVkU2VsZWN0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5lZGl0b3JcclxuICAgICAgLmNoYWluKClcclxuICAgICAgLmZvY3VzKClcclxuICAgICAgLnNldFRleHRTZWxlY3Rpb24oXHJcbiAgICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvblxyXG4gICAgICApXHJcbiAgICAgIC5ydW4oKTtcclxuXHJcbiAgfVxyXG5cclxuICBzd2l0Y2hUb1NvbGlkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zYXZlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbG9yVHlwZSA9ICdTT0xJRCc7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0cnVlO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHN3aXRjaFRvR3JhZGllbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNhdmVTZWxlY3Rpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JUeXBlID0gJ0dSQURJRU5UJztcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgb3BlbkNvbG9yUGlja2VyKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuaXNDb2xvclBpY2tlck9wZW4gPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuc2F2ZVNlbGVjdGlvbigpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2ZvY3VzJyxcclxuICAgICAgICB0aGlzLmhhbmRsZVdpbmRvd0ZvY3VzLFxyXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgaGFuZGxlV2luZG93Rm9jdXMgPSAoKTogdm9pZCA9PiB7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmlzQ29sb3JQaWNrZXJPcGVuID0gZmFsc2U7XHJcblxyXG4gICAgfSwgMzAwKTtcclxuXHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWxlY3Rpb24oKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgeyBmcm9tLCB0byB9ID1cclxuICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICAgIGlmIChmcm9tID09PSB0bykge1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzQ29sb3JQaWNrZXJPcGVuKSB7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID1cclxuICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgIXNlbGVjdGlvbiB8fFxyXG4gICAgICBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMFxyXG4gICAgKSB7XHJcblxyXG4gICAgICB0aGlzLnNob3dUb29sYmFyID0gZmFsc2U7XHJcblxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhbmdlID1cclxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgY29uc3QgcmVjdCA9XHJcbiAgICAgIHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGNvbnN0IGVkaXRvclJlY3QgPVxyXG4gICAgICB0aGlzLmVkaXRvckVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgIC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHRvb2xiYXIgPVxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAnLnRvb2xiYXInXHJcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIGlmICghdG9vbGJhcilcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB0b29sYmFyV2lkdGggPVxyXG4gICAgICAgIHRvb2xiYXIub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICBsZXQgbGVmdCA9XHJcbiAgICAgICAgcmVjdC5sZWZ0IC1cclxuICAgICAgICBlZGl0b3JSZWN0LmxlZnQgK1xyXG4gICAgICAgIChyZWN0LndpZHRoIC8gMikgLVxyXG4gICAgICAgICh0b29sYmFyV2lkdGggLyAyKTtcclxuXHJcbiAgICAgIGxlZnQgPSBNYXRoLm1heCgxMCwgbGVmdCk7XHJcblxyXG4gICAgICBjb25zdCBtYXhMZWZ0ID1cclxuICAgICAgICBlZGl0b3JSZWN0LndpZHRoIC1cclxuICAgICAgICB0b29sYmFyV2lkdGggLVxyXG4gICAgICAgIDEwO1xyXG5cclxuICAgICAgbGVmdCA9IE1hdGgubWluKGxlZnQsIG1heExlZnQpO1xyXG5cclxuICAgICAgbGVmdCA9IE1hdGgubWF4KDEwLCBsZWZ0KTtcclxuXHJcbiAgICAgIHRoaXMudG9vbGJhclggPSBsZWZ0O1xyXG5cclxuICAgICAgdGhpcy50b29sYmFyWSA9XHJcbiAgICAgICAgcmVjdC5ib3R0b20gLVxyXG4gICAgICAgIGVkaXRvclJlY3QudG9wICtcclxuICAgICAgICAxMDtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICB0b2dnbGVCb2xkKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC50b2dnbGVCb2xkKClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZUl0YWxpYygpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAudG9nZ2xlSXRhbGljKClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZVVuZGVybGluZSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAudG9nZ2xlVW5kZXJsaW5lKClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZU9yZGVyZWRMaXN0KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC50b2dnbGVPcmRlcmVkTGlzdCgpXHJcbiAgICAgIC5ydW4oKTtcclxuXHJcbiAgfVxyXG5cclxuICB0b2dnbGVCdWxsZXRMaXN0KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC50b2dnbGVCdWxsZXRMaXN0KClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIHNldEFsaWduKFxyXG4gICAgYWxpZ25tZW50OlxyXG4gICAgICAnbGVmdCcgfFxyXG4gICAgICAnY2VudGVyJyB8XHJcbiAgICAgICdyaWdodCdcclxuICApOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAuc2V0VGV4dEFsaWduKGFsaWdubWVudClcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIGNoYW5nZUNvbG9yKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9XHJcbiAgICAgIHRoaXMuZWRpdG9yLnN0YXRlLnNlbGVjdGlvbjtcclxuXHJcbiAgICBpZiAoZnJvbSA9PT0gdG8pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlcyA9XHJcbiAgICAgIHRoaXMuZWRpdG9yLmdldEF0dHJpYnV0ZXMoXHJcbiAgICAgICAgJ3RleHRTdHlsZSdcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAuc2V0VGV4dFNlbGVjdGlvbih7XHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICB0b1xyXG4gICAgICB9KVxyXG4gICAgICAuc2V0TWFyaygndGV4dFN0eWxlJywge1xyXG5cclxuICAgICAgICAuLi5leGlzdGluZ1N0eWxlcyxcclxuXHJcbiAgICAgICAgY29sb3I6XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sb3IsXHJcblxyXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogbnVsbCxcclxuXHJcbiAgICAgICAgV2Via2l0QmFja2dyb3VuZENsaXA6IG51bGwsXHJcblxyXG4gICAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6IG51bGxcclxuXHJcbiAgICAgIH0pXHJcbiAgICAgIC5ydW4oKTtcclxuXHJcbiAgfVxyXG5cclxuICBhcHBseUdyYWRpZW50KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9XHJcbiAgICAgIHRoaXMuZWRpdG9yLnN0YXRlLnNlbGVjdGlvbjtcclxuXHJcbiAgICBpZiAoZnJvbSA9PT0gdG8pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlcyA9XHJcbiAgICAgIHRoaXMuZWRpdG9yLmdldEF0dHJpYnV0ZXMoXHJcbiAgICAgICAgJ3RleHRTdHlsZSdcclxuICAgICAgKTtcclxuXHJcbiAgICBjb25zdCBncmFkaWVudCA9IGBcclxubGluZWFyIC0gZ3JhZGllbnQoXHJcbiAgdG8gcmlnaHQsXHJcbiAgJHt0aGlzLnByaW1hcnlDb2xvcn0sXHJcbiAgJHt0aGlzLnNlY29uZGFyeUNvbG9yfVxyXG4pXHJcbiAgYDtcclxuXHJcbiAgICB0aGlzLmVkaXRvclxyXG4gICAgICAuY2hhaW4oKVxyXG4gICAgICAuZm9jdXMoKVxyXG4gICAgICAuc2V0VGV4dFNlbGVjdGlvbih7XHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICB0b1xyXG4gICAgICB9KVxyXG4gICAgICAuc2V0TWFyaygndGV4dFN0eWxlJywge1xyXG5cclxuICAgICAgICAuLi5leGlzdGluZ1N0eWxlcyxcclxuXHJcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOlxyXG4gICAgICAgICAgZ3JhZGllbnQsXHJcblxyXG4gICAgICAgIGJhY2tncm91bmRDbGlwOlxyXG4gICAgICAgICAgJ3RleHQnLFxyXG5cclxuICAgICAgICBXZWJraXRCYWNrZ3JvdW5kQ2xpcDpcclxuICAgICAgICAgICd0ZXh0JyxcclxuXHJcbiAgICAgICAgY29sb3I6XHJcbiAgICAgICAgICAndHJhbnNwYXJlbnQnLFxyXG5cclxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOlxyXG4gICAgICAgICAgJ3RyYW5zcGFyZW50J1xyXG5cclxuICAgICAgfSlcclxuICAgICAgLnJ1bigpO1xyXG5cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXHJcbiAgICAnZG9jdW1lbnQ6bW91c2Vkb3duJ1xyXG4gIClcclxuXHJcbiAgb25Nb3VzZURvd24oKTogdm9pZCB7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZWRpdG9yKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICAgICAgdGhpcy5zaG93VG9vbGJhciA9XHJcbiAgICAgICAgZnJvbSAhPT0gdG87XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgY2hhbmdlRm9udFNpemUoXHJcbiAgICBmb250U2l6ZTogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZvbnRTaXplID1cclxuICAgICAgZm9udFNpemU7XHJcblxyXG4gICAgY29uc3QgeyBmcm9tLCB0byB9ID1cclxuICAgICAgdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xyXG5cclxuICAgIGlmIChmcm9tID09PSB0bylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZWRpdG9yXHJcbiAgICAgIC5jaGFpbigpXHJcbiAgICAgIC5mb2N1cygpXHJcbiAgICAgIC5zZXRUZXh0U2VsZWN0aW9uKHtcclxuICAgICAgICBmcm9tLFxyXG4gICAgICAgIHRvXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zZXRNYXJrKFxyXG4gICAgICAgICd0ZXh0U3R5bGUnLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZvbnRTaXplXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC5ydW4oKTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuIiwiPCEtLSB0ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCAtLT5cclxuXHJcbjxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCIgKm5nSWY9XCJlZGl0YWJsZTsgZWxzZSB2aWV3TW9kZVwiPlxyXG5cclxuICA8IS0tIEZMT0FUSU5HIFRPT0xCQVIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cInNob3dUb29sYmFyXCIgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyWVwiIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2xiYXJYXCIgY2RrRHJhZz5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGRyYWctaGFuZGxlIHctYXV0b1wiIGNka0RyYWdIYW5kbGU+XHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWdyaXAtdmVydGljYWxcIj5cclxuICAgICAgICA8Y2lyY2xlIGN4PVwiOVwiIGN5PVwiMTJcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjlcIiBjeT1cIjVcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjlcIiBjeT1cIjE5XCIgcj1cIjFcIiAvPlxyXG4gICAgICAgIDxjaXJjbGUgY3g9XCIxNVwiIGN5PVwiMTJcIiByPVwiMVwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSBjeD1cIjE1XCIgY3k9XCI1XCIgcj1cIjFcIiAvPlxyXG4gICAgICAgIDxjaXJjbGUgY3g9XCIxNVwiIGN5PVwiMTlcIiByPVwiMVwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZvbnQtc2l6ZS1maWVsZFwiPlxyXG5cclxuICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cInNlbGVjdGVkRm9udFNpemVcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZUZvbnRTaXplKCRldmVudC52YWx1ZSlcIiBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nPlxyXG5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPlxyXG4gICAgICAgICAgRGVmYXVsdFxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgwLjc1cmVtLCAydncsIDFyZW0pXCI+XHJcbiAgICAgICAgICAxNFxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgwLjc1cmVtLCAydncsIDEuMjVyZW0pXCI+XHJcbiAgICAgICAgICAxNlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgxcmVtLCAzdncsIDEuNXJlbSlcIj5cclxuICAgICAgICAgIDIwXHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNsYW1wKDEuMjVyZW0sIDR2dywgMnJlbSlcIj5cclxuICAgICAgICAgIDI0XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiY2xhbXAoMnJlbSwgNXZ3LCAzcmVtKVwiPlxyXG4gICAgICAgICAgMzJcclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjbGFtcCgzLjFyZW0sIDd2dywgNC41cmVtKVwiPlxyXG4gICAgICAgICAgNDhcclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuXHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPCEtLSBCT0xEIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgW2NsYXNzLnNlbGVjdGVkVG9vbF09XCJlZGl0b3I/LmlzQWN0aXZlKCdib2xkJylcIiAoY2xpY2spPVwidG9nZ2xlQm9sZCgpXCI+XHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWJvbGRcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTYgMTJoOWE0IDQgMCAwIDEgMCA4SDdhMSAxIDAgMCAxLTEtMVY1YTEgMSAwIDAgMSAxLTFoN2E0IDQgMCAwIDEgMCA4XCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tIElUQUxJQyAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIFtjbGFzcy5zZWxlY3RlZFRvb2xdPVwiZWRpdG9yPy5pc0FjdGl2ZSgnaXRhbGljJylcIiAoY2xpY2spPVwidG9nZ2xlSXRhbGljKClcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWl0YWxpY1wiPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTlcIiB4Mj1cIjEwXCIgeTE9XCI0XCIgeTI9XCI0XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE0XCIgeDI9XCI1XCIgeTE9XCIyMFwiIHkyPVwiMjBcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTVcIiB4Mj1cIjlcIiB5MT1cIjRcIiB5Mj1cIjIwXCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tIFVOREVSTElORSAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIFtjbGFzcy5zZWxlY3RlZFRvb2xdPVwiZWRpdG9yPy5pc0FjdGl2ZSgndW5kZXJsaW5lJylcIiAoY2xpY2spPVwidG9nZ2xlVW5kZXJsaW5lKClcIj5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk02IDR2NmE2IDYgMCAwIDAgMTIgMFY0XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjRcIiB4Mj1cIjIwXCIgeTE9XCIyMFwiIHkyPVwiMjBcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gTEVGVCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIChjbGljayk9XCJzZXRBbGlnbignbGVmdCcpXCI+XHJcblxyXG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxNVwiIHgyPVwiM1wiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE3XCIgeDI9XCIzXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gQ0VOVEVSIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgKGNsaWNrKT1cInNldEFsaWduKCdjZW50ZXInKVwiPlxyXG5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtYWxpZ24tY2VudGVyXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxN1wiIHgyPVwiN1wiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjE5XCIgeDI9XCI1XCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gQUxJR04gUklHSFQgLS0+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbCB3LWF1dG9cIiAoY2xpY2spPVwic2V0QWxpZ24oJ3JpZ2h0JylcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWFsaWduLXJpZ2h0XCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiM1wiIHkxPVwiNlwiIHkyPVwiNlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHgyPVwiOVwiIHkxPVwiMTJcIiB5Mj1cIjEyXCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjIxXCIgeDI9XCI3XCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gT1JERVJFRCBMSVNUIC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgdy1hdXRvXCIgKGNsaWNrKT1cInRvZ2dsZU9yZGVyZWRMaXN0KClcIj5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtbGlzdC1vcmRlcmVkXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxMFwiIHgyPVwiMjFcIiB5MT1cIjZcIiB5Mj1cIjZcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTBcIiB4Mj1cIjIxXCIgeTE9XCIxMlwiIHkyPVwiMTJcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTBcIiB4Mj1cIjIxXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNNCA2aDF2NFwiIC8+XHJcbiAgICAgICAgPHBhdGggZD1cIk00IDEwaDJcIiAvPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNNiAxOEg0YzAtMSAyLTIgMi0zcy0xLTEuNS0yLTFcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPCEtLSBCVUxMRVQgTElTVCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIHctYXV0b1wiIChjbGljayk9XCJ0b2dnbGVCdWxsZXRMaXN0KClcIj5cclxuXHJcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLWxpc3RcIj5cclxuICAgICAgICA8bGluZSB4MT1cIjhcIiB4Mj1cIjIxXCIgeTE9XCI2XCIgeTI9XCI2XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjhcIiB4Mj1cIjIxXCIgeTE9XCIxMlwiIHkyPVwiMTJcIiAvPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiOFwiIHgyPVwiMjFcIiB5MT1cIjE4XCIgeTI9XCIxOFwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIzXCIgeDI9XCIzLjAxXCIgeTE9XCI2XCIgeTI9XCI2XCIgLz5cclxuICAgICAgICA8bGluZSB4MT1cIjNcIiB4Mj1cIjMuMDFcIiB5MT1cIjEyXCIgeTI9XCIxMlwiIC8+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIzXCIgeDI9XCIzLjAxXCIgeTE9XCIxOFwiIHkyPVwiMThcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gU09MSUQgLyBHUkFESUVOVCAtLT5cclxuICAgIDwhLS0gU09MSUQgLyBHUkFESUVOVCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJzb2xpZCB3LWF1dG9cIiBbY2xhc3Muc29saWRDb2xvclNlbGVjdGVkXT1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnU09MSUQnXCJcclxuICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGNsaWNrKT1cInN3aXRjaFRvU29saWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIFNvbGlkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImdyYWRpZW50IHctYXV0b1wiIFtjbGFzcy5ncmFkaWVudENvbG9yU2VsZWN0ZWRdPVwic2VsZWN0ZWRDb2xvclR5cGUgPT09ICdHUkFESUVOVCdcIlxyXG4gICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwic3dpdGNoVG9HcmFkaWVudCgkZXZlbnQpXCI+XHJcbiAgICAgICAgR3JhZGllbnRcclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTT0xJRCBDT0xPUiAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGNvbG9yLXBpY2tlci1idG4gdy1hdXRvXCIgKm5nSWY9XCJzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ1wiPlxyXG5cclxuICAgICAgPG1hdC1pY29uPmZvcm1hdF9jb2xvcl90ZXh0PC9tYXQtaWNvbj5cclxuXHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImhpZGRlbi1jb2xvci1waWNrZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29sb3JcIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKClcIlxyXG4gICAgICAgIChpbnB1dCk9XCJjaGFuZ2VDb2xvcigpXCI+XHJcblxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBHUkFESUVOVCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJncmFkaWVudC1waWNrZXJcIiAqbmdJZj1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnR1JBRElFTlQnXCI+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbKG5nTW9kZWwpXT1cInByaW1hcnlDb2xvclwiIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoKVwiIChpbnB1dCk9XCJhcHBseUdyYWRpZW50KClcIiAvPlxyXG5cclxuICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwic2Vjb25kYXJ5Q29sb3JcIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKClcIiAoaW5wdXQpPVwiYXBwbHlHcmFkaWVudCgpXCIgLz5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVElQVEFQIEVESVRPUiAtLT5cclxuICA8ZGl2ICNlZGl0b3JDb250YWluZXIgY2xhc3M9XCJlZGl0YWJsZS10ZXh0XCI+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICN2aWV3TW9kZT5cclxuICA8ZGl2IGNsYXNzPVwicmVhZC1vbmx5LXRleHRcIiBbaW5uZXJIVE1MXT1cInNhZmVIdG1sXCI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|