@churchillliving/se-ui-toolkit 6.54.694 → 6.54.702
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/components/base/form/form.component.mjs +20 -19
- package/esm2022/lib/components/base/form-util/form-util.component.mjs +8 -7
- package/esm2022/lib/components/shared/controls/display-text-control/display-text-control.component.mjs +30 -0
- package/esm2022/lib/components/shared/controls/textArea-control/textArea-control.component.mjs +3 -2
- package/esm2022/lib/components/shared/notes/notes.component.mjs +3 -2
- package/esm2022/lib/models/form.model.mjs +2 -1
- package/esm2022/lib/models/response.model.mjs +1 -1
- package/esm2022/lib/se-ui-toolkit.module.mjs +12 -14
- package/esm2022/lib/services/environment.service.mjs +22 -0
- package/esm2022/lib/services/form.service.mjs +5 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +81 -31
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/components/shared/controls/display-text-control/display-text-control.component.d.ts +14 -0
- package/lib/models/form.model.d.ts +2 -1
- package/lib/models/response.model.d.ts +1 -0
- package/lib/se-ui-toolkit.module.d.ts +76 -74
- package/lib/services/environment.service.d.ts +9 -0
- package/lib/services/form.service.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -32,22 +32,23 @@ import * as i21 from "../../shared/controls/password-control/password-control.co
|
|
|
32
32
|
import * as i22 from "../../shared/controls/spacer-control/spacer-control.component";
|
|
33
33
|
import * as i23 from "../../shared/controls/textArea-control/textArea-control.component";
|
|
34
34
|
import * as i24 from "../../shared/controls/calendar-control/calendar-control.component";
|
|
35
|
-
import * as i25 from "../../shared/controls/
|
|
36
|
-
import * as i26 from "../../shared/controls/
|
|
37
|
-
import * as i27 from "../../shared/controls/
|
|
38
|
-
import * as i28 from "../../shared/controls/
|
|
39
|
-
import * as i29 from "../../shared/controls/
|
|
40
|
-
import * as i30 from "../../shared/controls/
|
|
41
|
-
import * as i31 from "../../shared/controls/
|
|
42
|
-
import * as i32 from "../../shared/controls/
|
|
43
|
-
import * as i33 from "../../shared/controls/
|
|
44
|
-
import * as i34 from "../../shared/controls/
|
|
45
|
-
import * as i35 from "../../shared/controls/
|
|
46
|
-
import * as i36 from "
|
|
47
|
-
import * as i37 from "../
|
|
48
|
-
import * as i38 from "../
|
|
49
|
-
import * as i39 from "../
|
|
50
|
-
import * as i40 from "
|
|
35
|
+
import * as i25 from "../../shared/controls/display-text-control/display-text-control.component";
|
|
36
|
+
import * as i26 from "../../shared/controls/dropdown-control/dropdown-control.component";
|
|
37
|
+
import * as i27 from "../../shared/controls/autocomplete-control/autocomplete.component";
|
|
38
|
+
import * as i28 from "../../shared/controls/multiselect-control/multiselect-control.component";
|
|
39
|
+
import * as i29 from "../../shared/controls/hyperlink-control/hyperlink-control.component";
|
|
40
|
+
import * as i30 from "../../shared/controls/lookup-control/lookup-control.component";
|
|
41
|
+
import * as i31 from "../../shared/controls/select-button-control/select-button-control.component";
|
|
42
|
+
import * as i32 from "../../shared/controls/note-detail-control/note-detail-control.component";
|
|
43
|
+
import * as i33 from "../../shared/controls/section-header-control/section-header-control.component";
|
|
44
|
+
import * as i34 from "../../shared/controls/add-button-control/add-button-control.component";
|
|
45
|
+
import * as i35 from "../../shared/controls/Input-switch-control/Input-switch-control.component";
|
|
46
|
+
import * as i36 from "../../shared/controls/label-control/label-control.component";
|
|
47
|
+
import * as i37 from "../file-upload/file-upload.component";
|
|
48
|
+
import * as i38 from "../cards/card.component";
|
|
49
|
+
import * as i39 from "../report/reportGenerateBtn/generate-report-btn/generate-report-btn.component";
|
|
50
|
+
import * as i40 from "../splitter/splitter.compnent";
|
|
51
|
+
import * as i41 from "../../shared/controls/editor-control/editor-control.component";
|
|
51
52
|
export class FormComponent {
|
|
52
53
|
set activeTestMode(val) {
|
|
53
54
|
if (val === true) {
|
|
@@ -1494,11 +1495,11 @@ export class FormComponent {
|
|
|
1494
1495
|
overlayPanel?.hide();
|
|
1495
1496
|
}
|
|
1496
1497
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, deps: [{ token: i1.AuthenticationService }, { token: i2.FormService }, { token: i3.AlertService }, { token: i4.DialogService }, { token: i0.ComponentFactoryResolver }, { token: i5.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i6.Router }, { token: i0.ElementRef }, { token: i7.DatePipe }, { token: i8.GridService }, { token: i9.PageLoggerService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i10.RequestService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1497
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "getTargetedFormDiv", first: true, predicate: ["appendForm"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab \n [header]=\"formSection.name\"\n [selected]=\"formSection.expanded !== false\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <ng-template pTemplate=\"header\">\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name }}</span>\n </ng-template>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n [resizeWidth]=\"headerField.resizeWidth\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" [resizeWidth]=\"formField.resizeWidth\"\n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"requestService.isSaveDisabled ? requestService.isSaveDisabled : isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordionheader{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "component", type: i14.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i15.Accordion, selector: "p-accordion", inputs: ["value", "multiple", "style", "styleClass", "expandIcon", "collapseIcon", "selectOnFocus", "transitionOptions", "activeIndex", "headerAriaLevel"], outputs: ["valueChange", "activeIndexChange", "onClose", "onOpen"] }, { kind: "component", type: i15.AccordionTab, selector: "p-accordionTab, p-accordion-tab, p-accordiontab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i16.ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i17.OverlayPanel, selector: "p-overlayPanel, p-overlaypanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i18.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i19.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i20.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i22.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i23.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i24.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i25.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab", "onKeyDown"] }, { kind: "component", type: i26.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i27.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i28.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i29.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i30.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i31.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i32.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i33.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i35.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i36.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload", "resizeWidth"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i37.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i38.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i39.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingComponent", "configData"], outputs: ["closePanelEmitter"] }, { kind: "component", type: i40.EditorControlComponent, selector: "se-editor-control", inputs: ["formField"], outputs: ["changeEvent", "clickEvent", "focusEvent"] }] }); }
|
|
1498
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "getTargetedFormDiv", first: true, predicate: ["appendForm"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab \n [header]=\"formSection.name\"\n [selected]=\"formSection.expanded !== false\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <ng-template pTemplate=\"header\">\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name }}</span>\n </ng-template>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- display text -->\n <span *ngSwitchCase=\"dynamicCase.DISPLAY_TEXT\">\n <display-text-control [formField]=\"headerField\"></display-text-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n [resizeWidth]=\"headerField.resizeWidth\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <span *ngSwitchCase=\"dynamicCase.DISPLAY_TEXT\">\n <display-text-control [formField]=\"formField\"></display-text-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" [resizeWidth]=\"formField.resizeWidth\"\n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"requestService.isSaveDisabled ? requestService.isSaveDisabled : isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordionheader{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "component", type: i14.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i15.Accordion, selector: "p-accordion", inputs: ["value", "multiple", "style", "styleClass", "expandIcon", "collapseIcon", "selectOnFocus", "transitionOptions", "activeIndex", "headerAriaLevel"], outputs: ["valueChange", "activeIndexChange", "onClose", "onOpen"] }, { kind: "component", type: i15.AccordionTab, selector: "p-accordionTab, p-accordion-tab, p-accordiontab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i16.ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i17.OverlayPanel, selector: "p-overlayPanel, p-overlaypanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i18.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i19.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i20.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i22.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i23.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i24.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i25.DisplayTextControlComponent, selector: "display-text-control", inputs: ["formField"] }, { kind: "component", type: i26.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab", "onKeyDown"] }, { kind: "component", type: i27.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i28.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i29.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i30.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i31.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i32.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i34.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i35.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i36.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i37.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload", "resizeWidth"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i38.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i39.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i40.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingComponent", "configData"], outputs: ["closePanelEmitter"] }, { kind: "component", type: i41.EditorControlComponent, selector: "se-editor-control", inputs: ["formField"], outputs: ["changeEvent", "clickEvent", "focusEvent"] }] }); }
|
|
1498
1499
|
}
|
|
1499
1500
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, decorators: [{
|
|
1500
1501
|
type: Component,
|
|
1501
|
-
args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab \n [header]=\"formSection.name\"\n [selected]=\"formSection.expanded !== false\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <ng-template pTemplate=\"header\">\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name }}</span>\n </ng-template>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n [resizeWidth]=\"headerField.resizeWidth\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" [resizeWidth]=\"formField.resizeWidth\"\n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"requestService.isSaveDisabled ? requestService.isSaveDisabled : isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordionheader{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
|
|
1502
|
+
args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab \n [header]=\"formSection.name\"\n [selected]=\"formSection.expanded !== false\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <ng-template pTemplate=\"header\">\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name }}</span>\n </ng-template>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- display text -->\n <span *ngSwitchCase=\"dynamicCase.DISPLAY_TEXT\">\n <display-text-control [formField]=\"headerField\"></display-text-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n [resizeWidth]=\"headerField.resizeWidth\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <span *ngSwitchCase=\"dynamicCase.DISPLAY_TEXT\">\n <display-text-control [formField]=\"formField\"></display-text-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" [resizeWidth]=\"formField.resizeWidth\"\n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"requestService.isSaveDisabled ? requestService.isSaveDisabled : isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordionheader{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
|
|
1502
1503
|
}], ctorParameters: () => [{ type: i1.AuthenticationService }, { type: i2.FormService }, { type: i3.AlertService }, { type: i4.DialogService }, { type: i0.ComponentFactoryResolver }, { type: i5.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i6.Router }, { type: i0.ElementRef }, { type: i7.DatePipe }, { type: i8.GridService }, { type: i9.PageLoggerService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i10.RequestService }], propDecorators: { panelOverlayViewContainer: [{
|
|
1503
1504
|
type: ViewChild,
|
|
1504
1505
|
args: ['viewContainerRef', { read: ViewContainerRef, static: true }]
|
|
@@ -1541,4 +1542,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1541
1542
|
type: HostListener,
|
|
1542
1543
|
args: ['window:beforeunload', ['$event']]
|
|
1543
1544
|
}] } });
|
|
1544
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3RDLE1BQU0sT0FBTyxhQUFhO0lBc0J4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pCLFFBQVEsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBK0JELFlBQ1UsV0FBa0MsRUFDbEMsV0FBd0IsRUFDeEIsWUFBMEIsRUFDM0IsYUFBNEIsRUFDM0Isd0JBQWtELEVBQ2xELGdCQUFtQyxFQUNuQyxHQUFzQixFQUN0QixNQUFjLEVBQ2QsRUFBYyxFQUNkLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLGlCQUFvQyxFQUNwQyxTQUFvQixFQUNwQixNQUFjLEVBQ2YsY0FBK0I7UUFkOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixtQkFBYyxHQUFkLGNBQWMsQ0FBaUI7UUEvRC9CLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRTlCLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBQ2hDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFLbEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBTXhCLGFBQVEsR0FBaUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1RCxlQUFVLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUQsd0JBQW1CLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUQsd0JBQW1CLEdBQStCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0UsZ0JBQVcsR0FBRyxZQUFZLENBQUM7UUFFM0IsbUJBQWMsR0FBRyxlQUFlLENBQUM7UUFDakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixtQkFBYyxHQUFrQixFQUFFLENBQUM7UUFFbkMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRXJDLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQUNuQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxtQkFBYyxHQUFXLFVBQVUsQ0FBQztRQUNwQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUc3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUc3Qix3REFBd0Q7UUFDeEQsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixjQUFTLEdBQVksS0FBSyxDQUFDO0lBbUJ4QixDQUFDO0lBRUosUUFBUTtJQUVSLENBQUM7SUFFRCwwQkFBMEI7SUFFMUIsbUJBQW1CLENBQUMsS0FBVTtRQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxpQ0FBaUM7UUFDakMsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QyxJQUNFLElBQUksQ0FBQyxJQUFJO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2pDLENBQUM7WUFDRCwrQ0FBK0M7WUFDL0MsSUFBSSxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxVQUFVLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBRyxXQUFXLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUMsQ0FBQzt3QkFDdkMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUMsRUFBRTs0QkFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUN2QyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUVELFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7d0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ3JCLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO3dCQUM5QixDQUFDO3dCQUNELGdDQUFnQzt3QkFDaEMsSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDOzRCQUNoRSxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQzt3QkFDeEMsQ0FBQzt3QkFDRCxJQUNFLEtBQUssRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLFFBQVE7NEJBQ3hDLEtBQUssRUFBRSxRQUFROzRCQUNmLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dDQUN0QyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMxQyxDQUFDOzRCQUNELEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3JELENBQUM7d0JBQ0QsSUFDRSxLQUFLLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZOzRCQUM1QyxLQUFLLEVBQUUsS0FBSzs0QkFDWixLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQ3hCLENBQUM7NEJBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQzVCLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUMzQyxDQUFDOzRCQUNGLElBQ0UsS0FBSztnQ0FDTCxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDO29DQUM5QixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2xDLENBQUM7Z0NBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLO3FDQUNoQixRQUFRLEVBQUU7cUNBQ1YsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7b0NBQ3JCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQ0FDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDMUQsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELGdEQUFnRDt3QkFDaEQsSUFDRSxLQUFLLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxXQUFXOzRCQUMzQyxLQUFLLENBQUMsS0FBSzs0QkFDWCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUMzQixDQUFDOzRCQUNELElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDM0MsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUM3RSxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDOUIsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELElBQUksS0FBSyxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOzRCQUNmLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dDQUNwQyxJQUNFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWTtvQ0FDekIsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFDckMsQ0FBQztvQ0FDRCxDQUFDLENBQUMsV0FBVyxHQUFHO3dDQUNkLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQzFDO3FDQUNGLENBQUM7Z0NBQ0osQ0FBQzs0QkFDSCxDQUFDLENBQUMsQ0FBQzs0QkFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt3QkFDekIsQ0FBQzt3QkFDRCw2Q0FBNkM7d0JBQzdDLElBQUksS0FBSyxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQzdDLEtBQUssQ0FBQyxLQUFLO2dDQUNULEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssTUFBTTtvQ0FDaEQsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUFHO29DQUMvQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7b0NBQ2hDLENBQUMsQ0FBQyxJQUFJO29DQUNOLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ2QsQ0FBQzt3QkFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUM3QyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQ0FDbEUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29DQUNuRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQ0FDaEUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO2dDQUM1QyxDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFDRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxXQUFXLEdBQUcsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksV0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUE7Z0JBQ3hDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbEMsTUFBTSxXQUFXLEdBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztvQkFDNU0sSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQzt3QkFDbkksSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUNsRCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzs0QkFDOUMsQ0FBQzt3QkFDSCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbEQsQ0FBQzt3QkFBQSxDQUFDO29CQUNKLENBQUM7b0JBQUEsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQSxDQUFDO1FBQ0osQ0FBQztRQUFBLENBQUM7SUFDSixDQUFDO0lBQ0QsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVztRQUN4QyxNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUFVO1FBQzVCLElBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFBLEVBQUUsQ0FBQSxVQUFVLENBQUMsSUFBSSxLQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO1lBQzVFLEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDRixDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLGtCQUFrQixDQUFDLFNBQXFCO1FBQ3RDLElBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFDLENBQUM7WUFDdEIsUUFBUTtpQkFDUCxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3pGLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDdEYsQ0FBQzt5QkFDSSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDeEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuRixTQUFTLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO29CQUNqQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLENBQ2hFLE9BQU8sQ0FDUixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUMvQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDNUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO3dCQUMzRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDaEIsSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDdEMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQztvQ0FDL0MsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3Q0FDZixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FDdEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUNoQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQ0FDeEIsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNOLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7b0NBQ2xDLENBQUM7Z0NBQ0gsQ0FBQztxQ0FBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO29DQUN0QixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUM1RCxDQUFDOzRCQUNILENBQUM7aUNBQU0sSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDN0MsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FDM0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQzs0QkFDSixDQUFDO3dCQUNKLENBQUM7b0JBQ0YsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBRUgscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQy9DLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNwRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUM3QyxNQUFNLE9BQU8sR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUN0RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FDcEUsQ0FBQztvQkFDRixNQUFNLEVBQ0osU0FBUyxFQUFFLFNBQVMsRUFDcEIsSUFBSSxFQUNKLFFBQVEsR0FDVCxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0IsTUFBTSxnQkFBZ0IsR0FDcEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNuRSw0QkFBNEI7b0JBQzVCLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxZQUFZLEVBQUUsQ0FBQzt3QkFDakIsSUFBRyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFDLENBQUM7NEJBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDMUYsQ0FBQzt3QkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFOzRCQUNsRCxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDckMsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTs0QkFDaEMsS0FBSyxFQUFFLFlBQVk7eUJBQ3BCLENBQUMsQ0FBQzt3QkFDSCxvREFBb0Q7d0JBQ3BELElBQUksUUFBUSxFQUFFLENBQUM7NEJBQ2IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQU0sRUFBRSxFQUFFO2dDQUN4RCxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBdUIsRUFBRSxTQUFTLENBQzVELENBQUMsUUFBUSxFQUFFLEVBQUU7b0NBQ1gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dDQUNwQixDQUFDLENBQ0YsQ0FBQzs0QkFDSixDQUFDLENBQUMsQ0FBQzt3QkFDTCxDQUFDO29CQUNILENBQUM7b0JBQ0QsMEJBQTBCO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdkMsQ0FBQztJQUVELGVBQWU7UUFDYiwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtRQUNmLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JELElBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLGVBQW1CLEVBQUUsV0FBeUI7UUFDNUQsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBQyxFQUFFO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBZ0IsRUFBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEcsSUFBRyxXQUFXLEVBQUMsQ0FBQztnQkFDZCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7WUFDMUMsQ0FBQztZQUFBLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBRztRQUNaLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBVyxFQUFFLFdBQWdCLEVBQUUsRUFBRTtZQUNyRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FDbkMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FDbEIsV0FBVyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUNwRSxDQUFDO1lBQ0YsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFNBQXFCLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzlDLElBQUcsR0FBRyxDQUFDLE1BQU0sRUFBQyxDQUFDO29CQUNiLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FDbEMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQzFFLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FDbEMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLElBQUksQ0FDL0MsQ0FBQztnQkFDSixDQUFDO2dCQUVELElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTs0QkFDaEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7d0JBQ25CLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQyxJQUFJLE9BQU8sQ0FBQyxLQUFLO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUMvQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNuQyxJQUNFLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLFNBQVM7b0JBQ3hDLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUMxQixDQUFDO29CQUNELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO3dCQUN0Qjs0QkFDRSxJQUFJLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLOzRCQUMvQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTO3lCQUNyQzt3QkFDRCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtxQkFDdEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQixDQUFDLFFBQWlCLEtBQUs7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFHLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QseUJBQXlCO1FBQ3ZCLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxJQUFJLFdBQVcsR0FBUSxRQUFRLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSwwQkFBK0IsQ0FBQztZQUNwQyxJQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEtBQUssR0FBRyxDQUFDLGNBQWMsRUFBQyxDQUFDO2dCQUM1RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO2lCQUNLLENBQUM7Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUNELE1BQU0sYUFBYSxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUM7WUFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsMEJBQTBCLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1lBQ2hGLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDMUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBSSxJQUFJLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNyRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDL0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFBSSxvQkFBb0IsR0FBZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FBQ3pKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTthQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLGFBQWEsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUNuRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDNUYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNEOztPQUVHO0lBRUgsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLHdCQUF3QixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUUsSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQzlCLENBQUM7Z0JBQ0YsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7d0JBQzNELGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDOUMsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBRyxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7d0JBQzFCLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM1QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztZQUM1QixJQUFJLGNBQWMsR0FBVyxDQUFDLENBQUM7WUFDL0IsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTt3QkFDdkMsSUFBSSxXQUFXLEdBQVEsU0FBUyxDQUFDLFdBQVcsQ0FBQzt3QkFDN0MsSUFBSSxrQkFBa0IsR0FBUSxFQUFFLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxXQUFXOzRCQUFFLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7d0JBQy9ELElBQUksQ0FBQyxXQUFXOzRCQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzt3QkFDdEQsSUFBSSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7d0JBRW5DLElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUN4RCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFlLEVBQUUsRUFBRTtnQ0FDN0MsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO2dDQUM3QixVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29DQUNyQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3Q0FDeEQsT0FBTyxHQUFHLElBQUksQ0FBQztvQ0FDakIsQ0FBQztvQ0FFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO3dDQUM3QyxJQUFJLE9BQU8sRUFBRSxDQUFDOzRDQUNaLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dDQUM1QixDQUFDOzZDQUFNLENBQUM7NENBQ04sV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7d0NBQzVCLENBQUM7b0NBQ0gsQ0FBQzt5Q0FBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO3dDQUNwRCxJQUFJLE9BQU8sRUFBRSxDQUFDOzRDQUNaLFNBQVMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDOzRDQUMzQixXQUFXLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzt3Q0FDN0IsQ0FBQzs2Q0FBTSxDQUFDOzRDQUNOLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7NENBQ3JDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOzRDQUM1QixTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3Q0FDNUIsQ0FBQztvQ0FDSCxDQUFDO2dDQUNILENBQUMsQ0FBQyxDQUFDOzRCQUNMLENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUM7NkJBQU0sSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDakQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO2dDQUN0QyxJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7Z0NBQzdCLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDcEQsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTt3Q0FDckMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NENBQ3hELE9BQU8sR0FBRyxJQUFJLENBQUM7d0NBQ2pCLENBQUM7b0NBQ0gsQ0FBQyxDQUFDLENBQUM7b0NBQ0gsSUFDRSxVQUFVLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxJQUFJO3dDQUN4QyxDQUFDLHNCQUFzQixFQUN2QixDQUFDO3dDQUNELElBQUksT0FBTyxFQUFFLENBQUM7NENBQ1osU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0NBQzVCLENBQUM7NkNBQU0sQ0FBQzs0Q0FDTixTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzt3Q0FDMUIsQ0FBQztvQ0FDSCxDQUFDO3lDQUFNLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7d0NBQ3BELElBQUksT0FBTyxFQUFFLENBQUM7NENBQ1osc0JBQXNCLEdBQUcsSUFBSSxDQUFDOzRDQUM5QixTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzs0Q0FDM0IsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7d0NBQzNCLENBQUM7NkNBQU0sQ0FBQzs0Q0FDTixJQUNFLFNBQVMsQ0FBQyxXQUFXO2dEQUNyQixTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hDLENBQUM7Z0RBQ0QsSUFBRyxXQUFXLENBQUMsUUFBUSxFQUFDLENBQUM7b0RBQ3ZCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dEQUMvQixDQUFDO2dEQUNELFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7Z0RBQ3JDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOzRDQUM1QixDQUFDO2lEQUFNLENBQUM7Z0RBQ04sV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0RBQzVCLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7Z0RBQ3JDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOzRDQUM1QixDQUFDO3dDQUNILENBQUM7b0NBQ0gsQ0FBQztnQ0FDSCxDQUFDOzRCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUM7d0JBRUQsV0FBVyxFQUFFLENBQUM7d0JBRWQsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ3ZCLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixDQUFDO3dCQUVELElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUNyQixZQUFZLEVBQUUsQ0FBQzt3QkFDakIsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxLQUFLLGNBQWMsQ0FBQztZQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLFdBQXlCO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sSUFBRyxXQUFXLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQUssQ0FBQztZQUNMLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsV0FBeUIsRUFBRSxRQUFpQjtRQUNoRSxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUMzQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxVQUFVLENBQUMsU0FBcUI7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNuRCxNQUFNLEVBQUUsV0FBVztZQUNuQixLQUFLLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ3JFLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDeEUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3JFLFFBQVEsRUFBQyxJQUFJO1lBQ2IsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTthQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOENBQThDO2FBQzVELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN2QixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxTQUFTLEdBQWUsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxXQUFXLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNO2FBQ3pDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUVmLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTlCLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BELFdBQVcsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU07YUFDeEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDOUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkcsQ0FBQztpQkFDSSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7b0JBQ3RFLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNO3dCQUN0QyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTTt3QkFDbEMsQ0FBQyxDQUFDLEVBQUU7b0JBQ04sS0FBSyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDakUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRTtvQkFDdEUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSztvQkFDdkUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTTtvQkFDaEMsUUFBUSxFQUFDLElBQUk7b0JBQ2IsV0FBVyxFQUFFLEtBQUs7aUJBQ25CLENBQUMsQ0FBQztnQkFFSCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7Z0JBQzNELElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUM3QixhQUFhLENBQ2QsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtxQkFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztxQkFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxRSxDQUFDLENBQUMsQ0FBQztnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDUixJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDMUIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxTQUFjO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNuRCxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQzVCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSztnQkFDakQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSztnQkFDM0IsQ0FBQyxDQUFDLEtBQUs7WUFDVCxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU07Z0JBQ3BELENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU07Z0JBQzVCLENBQUMsQ0FBQyxLQUFLO1lBQ1QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSTtvQkFDakQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJO29CQUM3QyxDQUFDLENBQUMsRUFBRTtnQkFDTixRQUFRLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJO2FBQy9CO1lBQ0QsUUFBUSxFQUFDLElBQUk7WUFDYixXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQzdCLGlCQUFpQixDQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4Q0FBOEM7YUFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzVCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3ZCLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTCxxQ0FBcUM7SUFDckMsb0RBQW9EO0lBQ3BELFdBQVc7SUFDWCxxQkFBcUI7SUFDckIsa0NBQWtDO0lBQ2xDLDBDQUEwQztJQUMxQyxVQUFVO0lBQ1Ysc0RBQXNEO0lBQ3RELDhDQUE4QztJQUM5Qyx3Q0FBd0M7SUFDeEMscUVBQXFFO0lBQ3JFLHFEQUFxRDtJQUNyRCwwREFBMEQ7SUFDMUQsMkRBQTJEO0lBQzNELDhDQUE4QztJQUM5QyxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFFBQVE7SUFDUixNQUFNO0lBRUosV0FBVyxDQUFDLFFBQWE7UUFDdkIsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztZQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBb0I7UUFDdkMsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO29CQUNqQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDM0IsbUJBQW1CLEdBQUcsbUJBQW1COzRCQUN2QyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQyxZQUFZOzRCQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDN0IsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUNyQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FDckUsQ0FBQztnQkFDRixJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQ3JCLG1CQUFtQixFQUNuQixJQUFJLEVBQ0osZ0JBQWdCLENBQ2pCLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztnQkFDRCxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUM7WUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQzVCLHlEQUF5RDtnQkFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDL0MsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO29CQUVsQyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3RELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7NEJBQ25DLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDOzRCQUNsQyxDQUFDO3dCQUNILENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN4QyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM5QyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3ZDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDeEQsQ0FBQzt3QkFDRixJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7d0JBQ2pDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUM5QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUVELElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUVILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLCtCQUErQjtZQUMvQixJQUFJLGVBQWUsR0FBWSxLQUFLLENBQUM7WUFDckMsSUFBSSxTQUFTLEdBQVEsRUFBRSxDQUFDO1lBQ3hCLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQztZQUMxQixJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxhQUFhLEdBQVEsRUFBRSxDQUFDO1lBQzVCLDBDQUEwQztZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNuQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO3dCQUN4QyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQ3BELEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNyQixDQUFDO3dCQUNELGtDQUFrQzt3QkFDbEMsSUFDRSxLQUFLLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxRQUFROzRCQUN2QyxLQUFLLENBQUMsUUFBUTs0QkFDZCxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ3pFLENBQUM7NEJBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUNyRixLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNyRCxDQUFDOzRCQUNELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dDQUNuQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQzs0QkFDNUUsQ0FBQztpQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDO2dDQUNqRCxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0NBQzNDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDaEUsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELElBQUksS0FBSyxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQzVDLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQzs0QkFDM0QsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7Z0NBQ2hCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0NBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLENBQUM7d0NBQy9DLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzt3Q0FDOUUsSUFBSSxVQUFVLEVBQUUsQ0FBQzs0Q0FDZixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FDdEIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQ2hFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dDQUN4QixDQUFDOzZDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzRDQUN2RSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO3dDQUNsQyxDQUFDO29DQUNILENBQUM7eUNBQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQzt3Q0FDdEIsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQ0FDNUQsQ0FBQztnQ0FDSCxDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQzt3QkFFRCx1Q0FBdUM7d0JBQ3ZDLElBQ0UsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsWUFBWTs0QkFDM0MsQ0FBQyxLQUFLLENBQUMsWUFBWTs0QkFDbkIsS0FBSyxDQUFDLEtBQUs7NEJBQ1gsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0QixDQUFDOzRCQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUMzQixDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FDMUMsQ0FBQzs0QkFDRixJQUNFLEtBQUs7Z0NBQ0wsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQztvQ0FDOUIsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNsQyxDQUFDO2dDQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7Z0NBQ2xCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQ3RELENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCx3Q0FBd0M7d0JBQ3hDLElBQ0UsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsV0FBVzs0QkFDMUMsS0FBSyxDQUFDLEtBQUs7NEJBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDOzRCQUMxQixLQUFLLENBQUMsWUFBWSxLQUFLLEtBQUssRUFDNUIsQ0FBQzs0QkFDRCxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7NEJBQzFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQzt3QkFDeEMsQ0FBQzt3QkFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUM1QyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxDQUFDO3dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQzVDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM3QyxDQUFDO3dCQUNELCtCQUErQjt3QkFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxTQUFTLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDakUsZUFBZSxHQUFHLElBQUksQ0FBQzs0QkFDdkIsV0FBVyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsb0JBQW9CLENBQUMsQ0FBQzs0QkFDeEcsT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUM7NEJBQzFGLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dDQUN2QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0NBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29DQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO29DQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dDQUM3QyxDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDO2lDQUNJLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDNUIsS0FBSyxJQUFJLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQ0FDL0IsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO2dDQUN0QixDQUFDO2dDQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7NEJBQzdDLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDRCxJQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDO2dCQUNuQixhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RCxJQUFHLGFBQWEsRUFBQyxDQUFDO29CQUNoQixhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7WUFDSixDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZCLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7d0JBQ3hDLElBQ0UsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsUUFBUTs0QkFDdkMsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUNoQyxDQUFDOzRCQUNELG9GQUFvRjs0QkFDcEYsOEJBQThCOzRCQUM5QixXQUFXOzRCQUNULEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDaEUsSUFBSTt3QkFDTixDQUFDO3dCQUNELElBQ0UsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsV0FBVzs0QkFDMUMsS0FBSyxDQUFDLEtBQUssRUFDWCxDQUFDOzRCQUNELEtBQUssQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFDRCxJQUNFLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLFFBQVE7NEJBQ3ZDLEtBQUssQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDOUMsQ0FBQzs0QkFDRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO3dCQUNsQyxDQUFDOzZCQUNJLElBQ0gsS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsWUFBWTs0QkFDM0MsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUNuQixDQUFDOzRCQUNELEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUztpQ0FDcEIsUUFBUSxFQUFFO2lDQUNWLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO2dDQUNyQixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0NBQ1osRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3pELENBQUM7NkJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDbkQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ2pELENBQUM7NkJBQU0sSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDN0MsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDOzRCQUMzRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQ0FDaEIsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQztvQ0FDL0MsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3Q0FDZixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FDdEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUNoQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQ0FDeEIsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNOLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7b0NBQ2xDLENBQUM7Z0NBQ0gsQ0FBQztxQ0FBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO29DQUN0QixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUM1RCxDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELGdCQUFnQixDQUFDLFNBQVM7UUFDeEIsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUNFLFVBQVU7WUFDVixPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQzlCLENBQUM7WUFDRCxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsWUFBWTtpQkFDZCxPQUFPLENBQUM7Z0JBQ1AsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLE9BQU8sRUFBRSx1REFBdUQ7YUFDakUsQ0FBQztpQkFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFxQjtRQUNwQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixTQUFTLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNGLCtDQUErQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLEdBQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsV0FBVyxDQUFDO1FBQzlCLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUN6QyxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDOUMsSUFBSSxpQkFBaUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLFNBQXFCLEVBQUUsSUFBUztRQUM1QyxJQUFJLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN0QixJQUFJLEtBQVUsQ0FBQztZQUNmLElBQUksR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsSUFBSSxTQUFTLEdBQVcsRUFBRSxDQUFDO1lBQzNCLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxPQUFPLFNBQVMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNELElBQ0UsU0FBUyxDQUFDLEtBQUs7b0JBQ2YsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUNwQixTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFDdEMsQ0FBQztvQkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ3JELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUMzQixLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ3JELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDaEUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEQsQ0FBQztZQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1lBQzNDLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUM3QixhQUFhLENBQ2QsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzdDLEdBQUcsSUFBSSxDQUFDLElBQUk7Z0JBQ1osVUFBVSxFQUFFLGNBQWM7Z0JBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0JBQ3RELFFBQVEsRUFBQyxJQUFJO2dCQUNiLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixJQUFJLEVBQUU7b0JBQ0osU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztvQkFDdEIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVTtvQkFDakMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7aUJBQ2xCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsU0FBYztRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQ25ELEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUN0QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFxQjtRQUNoQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNyRCxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxTQUFjLEVBQUUsS0FBVztRQUMzQyxJQUNFLFNBQVMsQ0FBQyxLQUFLO1lBQ2YsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQzVCLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFDMUMsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztnQkFDaEksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzSixDQUFDO2lCQUNJLENBQUM7Z0JBQ0osTUFBTSxHQUFHLEdBQVEsSUFBSSxDQUFDLGFBQWEsQ0FDakMsU0FBUyxFQUNULFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FDM0MsQ0FBQztnQkFFRixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtxQkFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztxQkFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxRSxDQUFDLENBQUMsQ0FBQztnQkFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDbkIsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDWCxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNSLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUMzQyxTQUFTLEVBQ1QsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUMzQyxHQUFHLENBQ0osQ0FBQztvQkFDSixDQUFDO29CQUNELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ2hDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRO3dCQUMxQixTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLENBQUMsRUFDRCxDQUFDLEVBQUUsS0FBSyxFQUFPLEVBQUUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEdBQVE7UUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsUUFBa0MsQ0FBQztRQUN2RSxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzVELGdCQUFnQixDQUFDLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBVTtRQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxRSxJQUFJLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1RixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUdILGlCQUFpQixDQUFDLFNBQXFCO1FBQ3JDLElBQUksU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOENBQThDO2lCQUM1RCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUM5QixDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFDLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3BCLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNwRCxDQUFDO2dCQUNELElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1IsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQzNDLFNBQVMsRUFDVCxTQUFTLENBQUMsYUFBYSxFQUN2QixHQUFHLENBQ0osQ0FBQztvQkFDRixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztvQkFDNUIsSUFBSSxTQUFTLENBQUMsUUFBUTt3QkFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sU0FBUyxDQUFDLEtBQUssS0FBSyxRQUFRO29CQUNqQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUN4RCxJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxFQUNELENBQUMsRUFBRSxLQUFLLEVBQU8sRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFxQjtRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsU0FBcUI7UUFDbkMsSUFBSSxTQUFTLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxnQ0FBZ0M7WUFDaEMsSUFDRSxTQUFTLENBQUMsUUFBUTtnQkFDbEIsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3pDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzdDLENBQUM7Z0JBQ0QsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxDQUFDO2lCQUFLLElBQ0osQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUM7Z0JBQzFDLFNBQVMsQ0FBQyxLQUFLO2dCQUNmLFNBQVMsQ0FBQyxlQUFlLEVBQ3pCLENBQUM7Z0JBQ0QsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FDeEIsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FDOUMsQ0FBQztZQUNKLENBQUM7aUJBQU0sSUFDTCxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDMUMsQ0FBQyxTQUFTLENBQUMsS0FBSztnQkFDaEIsU0FBUyxDQUFDLGVBQWUsRUFDekIsQ0FBQztnQkFDRCxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxTQUFjO1FBQ2hDLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN2QixTQUFTLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsT0FBcUI7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFxQjtRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbEQsTUFBTSxFQUFFLFNBQVMsQ0FBQyxLQUFlO1lBQ2pDLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztnQkFDdEIsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO2FBQ3JDO1lBQ0QsUUFBUSxFQUFDLElBQUk7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4Q0FBOEM7YUFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDbkIsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNaLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQyxFQUNELENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQXFCO1FBQ2hDLElBQUksU0FBUyxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQzs7WUFDbEMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksU0FBUyxHQUFlLEtBQUssQ0FBQyxTQUFTLENBQUE7UUFDM0MsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsU0FBcUI7UUFDbkMsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNwQixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsK0NBQStDO1FBQzlDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2RSxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBcUI7UUFDcEMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNuRCxDQUFDLEVBQ0QsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDaEMsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsOENBQThDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQzdCLCtDQUErQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQVU7UUFDdEIsK0NBQStDO1FBQy9DLElBQUksU0FBUyxHQUFlLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFjO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLFNBQXFCO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQVU7UUFDZixPQUFPLE9BQU8sS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLE1BQU07UUFDckIsSUFBSSxXQUFXLEdBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUN0QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtvQkFDN0MsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQzNCLG1CQUFtQixHQUFHLG1CQUFtQjs0QkFDdkMsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLEtBQUssR0FBRyxTQUFTLENBQUMsWUFBWTs0QkFDdEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7b0JBQzdCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2pDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUNyRSxDQUFDO2dCQUNGLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FDckIsbUJBQW1CLEVBQ25CLElBQUksRUFDSixnQkFBZ0IsQ0FDakIsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO2dCQUNELFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDbkMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztvQkFDeEcsT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQzFGLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUN2QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3pCLENBQUM7eUJBQ0ksSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM1QixLQUFLLElBQUksVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDOzRCQUMvQixVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ3RCLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBUztRQUM5QixJQUNFLElBQUksQ0FBQyxJQUFJO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDeEMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDOUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN0QyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dDQUNSLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29DQUNyQixPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0NBQzFCLENBQUM7cUNBQU0sQ0FBQztvQ0FDTixHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsYUFBYSxDQUFDO2dDQUN0QyxDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFTO1FBQzFCLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXO1FBQzNCLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELGFBQWEsQ0FBQyxHQUFRO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUNGLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxLQUFLO1FBQzFDLElBQUksU0FBUyxHQUFzQixLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQ3BELElBQUksWUFBWSxHQUFRLEtBQUssRUFBRSxZQUFZLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFFLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEdBQUcsRUFBQyxHQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQztZQUNsQyxJQUFHLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBQyxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDL0MsSUFBRyxRQUFRLEVBQUUsTUFBTSxHQUFFLENBQUMsRUFBRSxDQUFDO29CQUN2QixRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQSxFQUFFO3dCQUNwQixJQUFJLEtBQUssR0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3JCLElBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUM7NEJBQ3ZFLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUM7NEJBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRSxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFDakUsQ0FBQzs2QkFBSyxJQUFHLENBQUMsS0FBSyxFQUFDLENBQUM7NEJBQ2YsSUFBSSxlQUFlLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQ2xFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBQyxlQUFlLENBQUM7d0JBQzVCLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsTUFBTSxZQUFZLEdBQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN6QixJQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUMsQ0FBQztnQkFDakIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNsQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQzNDLENBQUM7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVqQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFDRCxlQUFlLENBQUMsWUFBWTtRQUMxQixZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztrSUFobURVLGFBQWE7c0hBQWIsYUFBYSw2cEJBQ2MsZ0JBQWdCLG9WQUVILGdCQUFnQixrREM5QnJFLHFraUNBZ2hCTTs7NEZEcmZPLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsU0FBUzsyZEFNWix5QkFBeUI7c0JBRC9CLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFDLElBQUksRUFBQztnQkFHcEUseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNXLGtCQUFrQjtzQkFBN0QsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVqQyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFNTyxjQUFjO3NCQUExQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQW1EUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ29tcG9uZW50RmFjdG9yeSwgVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBSZW5kZXJlcjIsIE5nWm9uZSwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IE5vdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL25vdGVzL25vdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFRm9ybUNvbnRyb2wsIEVIeXBlcmxpbmssIElGb3JtRmllbGQsIElEeW5hbWljRm9ybSwgSUZvcm1TZWN0aW9uLCBFVmFsaWRhdG9yLCBJRHluYW1pY0NhcmQsIElGb3JtQnV0dG9uLCBFRm9ybWF0VHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcbmltcG9ydCB7IEVQZXJtaXNzaW9uVHlwZSwgSVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdXNlci1pbmZvLm1vZGVsJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgdXRpbGl0aWVzIGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbW1vbi5tb2RlbCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh5cGVybGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oeXBlcmxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBkcmFnZ2FibGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSU92ZXJsYXlQYW5lbERhdGEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOnRydWV9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XG5cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lckZvcm1SZWYnKSB2aWV3Q29udGFpbmVyRm9ybVJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2FwcGVuZEZvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgZ2V0VGFyZ2V0ZWRGb3JtRGl2OiBFbGVtZW50UmVmO1xuICBcbiAgQElucHV0KCkgc3RpY2t5QWN0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZvcm06IElEeW5hbWljRm9ybTtcbiAgQElucHV0KCkgc2F2ZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBoaWRlU2F2ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoaWRlQ2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1CdXR0b25zOiBJRm9ybUJ1dHRvbltdID0gW107XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvdmVybGF5UGFuZWxTdHlsZToge307XG4gIHBhbmVsSW5mbzogYW55O1xuICBzZUZvcm1PYmo6IGFueTtcbiAgbW9kZWxTcGxpdFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHNhdmVGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRyb3BEb3duQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VjdGlvbkNsaWNrZWRFdmVudDogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZHluYW1pY0Nhc2UgPSBFRm9ybUNvbnRyb2w7XG4gIHNhdmVGb3JtUGFnZTogU3Vic2NyaXB0aW9uO1xuICBwZXJtaXNzaW9uVHlwZSA9IEVQZXJtaXNzaW9uVHlwZTtcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9ybUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRzTGlzdDogSURpY3Rpb25hcnlbXSA9IFtdO1xuICBmaWxlVXBsb2FkVXJsczogYW55O1xuICBzaG93ZmlsZVVwbG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRMaXN0OiBJRHluYW1pY0NhcmQ7XG4gIGNhbGVuZGFyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XG4gIGRlZmF1bHREYXRlOiBzdHJpbmcgPSAnJztcbiAgbG9va3VwRm9jdXNPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNldENhcmREYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNwbGl0U2NyZWVuIDogYm9vbGVhbj0gZmFsc2U7XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIC8vIGFwcGx5IGNoZWNrZWQvdW5DaGVja2VkIHByb3AgZm9yIENoZWNrQm94IG9mIHRoZSBGb3JtXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHVibGljIHJlcXVlc3RTZXJ2aWNlIDogUmVxdWVzdFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgXG4gIH1cblxuICAvLyBicm93c2VyIHRhYiBjbG9zZSBldmVudFxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcbiAgYmVmb3JldW5sb2FkSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0IHx8IHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLnNldFRvb2x0aXAoKTtcbiAgICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZm9ybVxuICAgIHRoaXMucm9sZXMgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXJSb2xlcygpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZm9ybSAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucyAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICAvLyBzdGFydCBjYXJkTGlzdCByZWZlcmVuY2UgYnJlYWsgZnVuY3Rpb25hbGl0eVxuICAgICAgbGV0IGZvcm1WYWx1ZXMgPSB7IC4uLnRoaXMuZm9ybSB9O1xuICAgICAgZm9ybVZhbHVlcy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBpZihmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzLmZvckVhY2goKGhlYWRlckZpZWxkKT0+e1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrRmllbGRSZXF1aXJlZChoZWFkZXJGaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlzUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIGRhdGVcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmIGZpZWxkPy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmaWVsZFsncHJldmlvdXNWYWx1ZSddID0gZmllbGQ/LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkPy50aW1lT25seSAmJlxuICAgICAgICAgICAgICAoZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZD8udmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZD8uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZD8uZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbXVsdGlTZWxlY3Qgc3RyaW5nIHZhbHVlIGluIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMqLFxccyovZywgXCIsXCIpPy50b1N0cmluZygpPy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gW2ZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSB7fTtcbiAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmRhdGE/LmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHguZHluYW1pY0Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uczogSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtVmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5kIGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkgPT09ICcxJ1xuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkhZUEVSTElOSykge1xuICAgICAgICAgICAgICBpZiAoZmllbGQuaHlwZXJsaW5rPy50YXJnZXRVc2VVc2VyUHJlZiAmJiBmaWVsZC5oeXBlcmxpbms/LnBhcmFtcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkLmh5cGVybGluay5wYXJhbXMpPy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEtleVZhbHVlID0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwga2V5KTtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmh5cGVybGluay5wYXJhbXNba2V5XSA9IGdldEtleVZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBseVVzZXJQZXJtaXNzaW9ucygpO1xuICAgICAgdGhpcy5yZW1vdmVXaGl0ZVNwYWNlcygpO1xuICAgICAgdGhpcy5zZXRIeXBlcmxpbmtDb21wb25lbnRSb3V0ZSgpO1xuICAgICAgdGhpcy5zZXRDYWxhbmRlcldpZHRoKCk7XG4gICAgICB0aGlzLm9yZGVyRm9ybVNlY3Rpb25zKCk7XG4gICAgICB0aGlzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBvcmRlckZvcm1TZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0N1cnJlbnRVc2VySW5mbycpKTtcbiAgICAgIGxldCB1c2VyU2VjdGlvbiA9IGN1cnJlbnRVc2VySW5mbz8ucGFnZVNlY3Rpb25zPy5sZW5ndGggPiAwID8gY3VycmVudFVzZXJJbmZvLnBhZ2VTZWN0aW9ucyA6IFtdO1xuICAgICAgY29uc3QgcGFnZVVybCA9IHRoaXMucGFnZU5hbWUoKTtcbiAgICAgIGlmICh1c2VyU2VjdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICB1c2VyU2VjdGlvbiA9IHVzZXJTZWN0aW9uLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyU2VjdGlvbjpcIiwgdXNlclNlY3Rpb24pXG4gICAgICAgIHVzZXJTZWN0aW9uLmZvckVhY2goKHBhZ2VTZWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWU6IGJvb2xlYW4gPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5zb21lKChzZWN0aW9uKSA9PiBwYWdlU2VjdGlvbj8uc2VjdGlvbj8udG9Mb3dlckNhc2UoKSA9PT0gc2VjdGlvbj8ubmFtZT8udG9Mb3dlckNhc2UoKSkgJiYgcGFnZVNlY3Rpb24/LnBhZ2U/LnRvTG93ZXJDYXNlKCkgPT09IHBhZ2VVcmw/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKG1hdGNoZWROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZpbmRJbmRleCgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgaWYgKHBhZ2VTZWN0aW9uLnJvbGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZXM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhwYWdlU2VjdGlvbi5yb2xlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICBzd2FwU2VjdGlvbnMob3JkZXI6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi50aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSB9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbb3JkZXJdID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF0gPSByZU9yZGVyU2VjdGlvbjtcbiAgfVxuICBwYWdlTmFtZSgpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSk7XG4gICAgaWYgKHVybD8uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgdXJsID0gdXJsLnNwbGl0KCc/JylbMF07XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgc2V0Rm9ybVNlY3Rpb24oc2VjdGlvbiwgaW5kZXgsIHBhZ2VTZWN0aW9uKSB7XG4gICAgY29uc3QgcmVPcmRlclNlY3Rpb24gPSB7IC4uLnNlY3Rpb24gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UocGFnZVNlY3Rpb24/Lm9yZGVyIC0gMSwgMCwgcmVPcmRlclNlY3Rpb24pO1xuICB9XG4gIGNoZWNrRmllbGRSZXF1aXJlZChmaWVsZDogYW55KSB7XG4gICBpZihmaWVsZC52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbiAgIH1cbiAgfVxuXG4gIC8vIHNldCBjYWxlbmRhciAyIE9yIDQgZGlnaXQgeWVhciBmb3JtYXRcbiAgY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmKCFmb3JtRmllbGQudGltZU9ubHkpe1xuICAgICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZvcm1GaWVsZC5maWVsZClbMF1cbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAodmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICBpZiAodmFsPy50YXJnZXQ/LnZhbHVlPy5sZW5ndGggPT0gOCB8fCBmb3JtRmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gRUZvcm1hdFR5cGUuU0hPUlREQVRFKSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodmFsPy50YXJnZXQ/LnZhbHVlLmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KSg/PVxcZCkvZywgJyQxLycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB2YWw/LnRhcmdldD8udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICAgICAgaWYgKHllYXI/Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcbiAgICAgICAgICAgICdlbi1VUydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXI/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gIFxuICB9XG5cbiAgLy8gc2V0IHBlcmNlbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG4gIHNldG51bWVyaWN2YWx1ZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC52YWx1ZSAqIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKFxuICAgICAgICAgICAgICAgICAgZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZm9ybSBoYXMgYW55IGZpZWxkIHdpdGggZHluYW1pYyBjb21wb25lbnQ7XG4gICAqIENyZWF0ZXMgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgKiBJbmplY3RzIGNvbXBvbmVudCB0aHJvdWdoIHZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KClcbiAgICogUGFzc2VzIGRhdGEgdG8gY29tcG9uZW50XG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICogRmluYWxseSBmb3JjZXMgQW5ndWxhciB0byBkZXRlY2ggY2hhbmdlc1xuICAgKi9cbiBcbiAgbG9hZER5bmFtaWNDb21wb25lbnRzKCkge1xuICAgIHRoaXMuY29tcG9uZW50c0xpc3QgPSBbXTtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55LCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgY29uc3Qgdmlld1JlZjogYW55ID0gdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgeC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gYCR7Zm9ybVNlY3Rpb24ubmFtZX0tJHtmaWVsZEluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGhhbmRsZXJzLFxuICAgICAgICAgIH0gPSBmaWVsZC5jb21wb25lbnRDb250cm9sO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PiA9XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDb21wb25lbnQpO1xuICAgICAgICAgIC8vIFBhc3NpbmcgZGF0YSB0byBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3UmVmPy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgaWYoZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkKXtcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3MoY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGZpZWxkLmNvbXBvbmVudENvbnRyb2wuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLmNvbXBvbmVudENvbnRyb2w/LmlkLFxuICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50UmVmLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRzXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtldmVudCwgaGFuZGxlcl06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2VbZXZlbnRdIGFzIEV2ZW50RW1pdHRlcjxhbnk+KT8uc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpbnZva2UgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvL2ludm9rZSB3aGVuIGZpbGUgdXBsb2FkIE9SIGRlbGV0ZSBhIGZpbGVcbiAgZmlsZU9uY2hhbmdlRXZlbnQoKSB7XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGxvYWQgZHluYW1pYyBjb21wb25lbnRzIGlmIGV4aXN0IGluIGZvcm1cbiAgICB0aGlzLnNldG51bWVyaWN2YWx1ZXMoKTtcbiAgICB0aGlzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuVG9TcGxpdFNjcmVlbkNoYW5nZSgpO1xuICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRDYXJkUmVzcG9uc2VJZCgpO1xuICB9XG5cbiAgc2V0Q2FyZFJlc3BvbnNlSWQoKSB7XG4gICAgdXRpbGl0aWVzLm9uRHluYW1pY0NhcmRTdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZihyZXMuZGF0YT8uaXNTYXZlKXtcbiAgICAgICAgdGhpcy5zZXRDYXJkSWRzKHJlcy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0RGVsZXRlQ2FyZElkKHJlcy5kYXRhPy5jYXJkRGF0YSwgcmVzLmRhdGE/LmR5bmFtaWNGb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERlbGV0ZUNhcmRJZCh1cGRhdGVkQ2FyZERhdGE6YW55LCBkeW5hbWljRm9ybTogSUR5bmFtaWNGb3JtKXtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbjpJRm9ybVNlY3Rpb24pPT57XG4gICAgICBjb25zdCBjYXJkQ29udHJvbCA9IHNlY3Rpb24uZmllbGRzLmZpbmQoKGZpZWxkOklGb3JtRmllbGQpPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpO1xuICAgICAgaWYoY2FyZENvbnRyb2wpe1xuICAgICAgICBjYXJkQ29udHJvbC5jYXJkLmRhdGEgPSB1cGRhdGVkQ2FyZERhdGE7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGR5bmFtaWNGb3JtID0gdGhpcy5mb3JtO1xuICB9XG5cbiAgc2V0Q2FyZElkcyhyZXMpIHtcbiAgICByZXMucmVjb3JkcyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0RGF0YUZpZWxkcyhyZXMucmVjb3Jkcyk7XG4gICAgcmVzLnJlY29yZHM/LmZvckVhY2goKHJlY29yZDogYW55LCByZWNvcmRJbmRleDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaENhcmQgPSByZXMuY2FyZHNJbmZvPy5maW5kKFxuICAgICAgICAoaW5mbywgY2FyZEluZGV4KSA9PlxuICAgICAgICAgIHJlY29yZEluZGV4ID09PSBjYXJkSW5kZXggJiYgcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoQ2FyZCAmJiBPYmplY3Qua2V5cyhtYXRjaENhcmQpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hdGNoQ2FyZFtyZXMuZmllbGROYW1lXSA9IHJlY29yZFtyZXMuZmllbGROYW1lPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQ7XG4gICAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZihyZXMuY2FyZElkKXtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEICYmIGZpZWxkLmlkID09PSByZXMuY2FyZElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgICAgIGlmIChyZXMuY2FyZHNJbmZvPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXMuY2FyZHNJbmZvPy5mb3JFYWNoKChjYXJkSWQpID0+IHtcbiAgICAgICAgICAgICAgY2FyZElkLmlkID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JtRmllbGQuY2FyZC5kYXRhID0gcmVzLmNhcmRzSW5mbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2FyZERhdGEgPSAhdGhpcy5zZXRDYXJkRGF0YTtcbiAgfVxuXG4gIHJlbW92ZVdoaXRlU3BhY2VzKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbi5jbGFzcykgc2VjdGlvbi5jbGFzcyA9IHNlY3Rpb24uY2xhc3MucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEh5cGVybGlua0NvbXBvbmVudFJvdXRlKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuSFlQRVJMSU5LICYmXG4gICAgICAgICAgZmllbGQuaHlwZXJsaW5rPy5jb21wb25lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnaHlwZXJsaW5rJyArIGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgICBjb21wb25lbnQ6IGZpZWxkLmh5cGVybGluay5jb21wb25lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5yb3V0ZXIuY29uZmlnLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGJyb3dzZXJUYWJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGV2ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKXtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZih0aGlzLnNwbGl0U2NyZWVuKXtcbiAgICAgIHRoaXMubW9kZWxTcGxpdFNjcmVlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5mb3JtU2VydmljZS5pc0NvbXBvbmVudEV4aXN0ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKSB7XG4gICAgdXRpbGl0aWVzLm9uU2NyZWVuU3BsaXRDaGFuZ2UoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIGxldCBsb29rdXBNb2RhbDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncC1kaWFsb2cnKVswXTtcbiAgICAgIGxldCBjdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudDogYW55O1xuICAgICAgaWYodGhpcy5mb3JtU2VydmljZS5pc0NvbXBvbmVudEV4aXN0ICYmIHRoaXMucGFuZWxJbmZvLnBhbmVsQ29tcG9uZW50ICE9PSByZXMucGFuZWxDb21wb25lbnQpe1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgdGhpcy5mb3JtU2VydmljZS5pc0NvbXBvbmVudEV4aXN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zcGxpdFNjcmVlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpc0RpYWxvZ01vZGVsID0gbG9va3VwTW9kYWwgJiYgdGhpcy5jdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudDtcbiAgICAgIHRoaXMucGFuZWxJbmZvID0ge307XG4gICAgICBpZiAoaXNEaWFsb2dNb2RlbCkge1xuICAgICAgICBjdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudFsnbmF0aXZlRWxlbWVudCddID0gdGhpcy5jdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFuZWxJbmZvLnBhbmVsQ29tcG9uZW50ID0gcmVzLnBhbmVsQ29tcG9uZW50O1xuICAgICAgdGhpcy5wYW5lbEluZm8uY29uZmlnRGF0YSA9IHJlcy5jb25maWdEYXRhO1xuICAgICAgdGhpcy5wYW5lbEluZm8uZXhpc3RpbmdDb3Btb25lbnQgPSBpc0RpYWxvZ01vZGVsID8gY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQgOiB0aGlzLnZpZXdDb250YWluZXJGb3JtUmVmO1xuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zcGxpdFNjcmVlbiA9ICB0cnVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1vZGVsU3BsaXRTY3JlZW4gPSBpc0RpYWxvZ01vZGVsID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb3JtLXNhdmUtYnV0dG9uJyk7XG4gICAgICBpZiAoc2F2ZUJ1dHRvbikge1xuICAgICAgICBzYXZlQnV0dG9uLmNsYXNzTGlzdD8uYWRkKCdwLXNhdmUtYnV0dG9uJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmFwcGVuZFZpZXdDb250YWluZXJUb0RpdigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VQYW5lbCgpIHtcbiAgICB0aGlzLnNwbGl0U2NyZWVuID0gZmFsc2U7XG4gICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLXNhdmUtYnV0dG9uJyk7XG4gICAgaWYgKHNhdmVCdXR0b24pIHtcbiAgICAgIHNhdmVCdXR0b24uY2xhc3NMaXN0Py5yZW1vdmUoJ3Atc2F2ZS1idXR0b24nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBlbmRWaWV3Q29udGFpbmVyVG9EaXYoKTtcbiAgfVxuXG4gIGFwcGVuZFZpZXdDb250YWluZXJUb0RpdigpIHtcbiAgICBsZXQgZm9ybUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5tb2RlbFNwbGl0U2NyZWVuID8gdGhpcy5jdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudD8ubmF0aXZlRWxlbWVudCA6IHRoaXMudmlld0NvbnRhaW5lckZvcm1SZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5nZXRUYXJnZXRlZEZvcm1EaXY/Lm5hdGl2ZUVsZW1lbnQgJiYgZm9ybUNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyMj8uYXBwZW5kQ2hpbGQodGhpcy5nZXRUYXJnZXRlZEZvcm1EaXY/Lm5hdGl2ZUVsZW1lbnQsIGZvcm1Db250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExpc3RlbnMgYW55IGNoYW5nZSBpbiBEeW5hbWljIEZvcm0gY29tcG9uZW50IFN0YXRlXG4gICAqL1xuXG4gIG9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHV0aWxpdGllcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuaWQgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWZPYmogPSB0aGlzLmNvbXBvbmVudHNMaXN0LmZpbmQoXG4gICAgICAgICAgKHgpID0+IHgubmFtZSA9PT0gcmVzcG9uc2UuaWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZk9iaikge1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmRhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmT2JqLnZhbHVlLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZihyZXNwb25zZT8ubG9hZENvbXBvbmVudCl7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2UubmdPbkluaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zXG4gIGFwcGx5VXNlclBlcm1pc3Npb25zKCkge1xuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucykge1xuICAgICAgbGV0IHRvdGFsRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGRpc2FibGVkRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGhpZGRlbkZpZWxkczogbnVtYmVyID0gMDtcblxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBlcm1pc3Npb25zOiBhbnkgPSBmb3JtRmllbGQucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgc2VjdGlvblBlcm1pc3Npb25zOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmICghcGVybWlzc2lvbnMpIHNlY3Rpb25QZXJtaXNzaW9ucyA9IGZvcm1TZWN0aW9uLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgcGVybWlzc2lvbnMgPSB0aGlzLmZvcm0ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoc2VjdGlvblBlcm1pc3Npb25zICYmIHNlY3Rpb25QZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25QZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9ucyAmJiBwZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24ucm9sZXMgJiYgcGVybWlzc2lvbi5yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnJvbGVzLmZvckVhY2goKHJvbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXG4gICAgICAgICAgICAgICAgICAgICFoYXNWYWxpZEVkaXRQZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnBlcm1pc3Npb25zICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b3RhbEZpZWxkcysrO1xuXG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVkRmllbGRzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pc0Zvcm1EaXNhYmxlZCA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gZGlzYWJsZWRGaWVsZHM7XG4gICAgICB0aGlzLmlzRm9ybUhpZGRlbiA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gaGlkZGVuRmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIElGcmFtZSBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgc2VjdGlvbkRpc2FibGVkKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24pIHtcbiAgICBpZiAoZm9ybVNlY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmKGZvcm1TZWN0aW9uLmRpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCBmYWxzZSk7XG4gICAgfWVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbjogSUZvcm1TZWN0aW9uLCBkaXNhYmxlZDogYm9vbGVhbil7XG4gICAgZm9ybVNlY3Rpb24uZmllbGRzLm1hcCgoZmllbGQ6IElGb3JtRmllbGQpID0+IHtcbiAgICAgIGZpZWxkLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICB9XG5cbiAgbG9hZElGcmFtZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogJ0h5cGVybGluaycsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmh5cGVybGluaz8ud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICBkYXRhOiB7IHZhbHVlOiBmb3JtRmllbGQuaHlwZXJsaW5rPy5saW5rLCBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsIH0sXG4gICAgICBjbG9zYWJsZTp0cnVlLFxuICAgICAgZm9jdXNPblNob3c6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCk7XG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBEaWFsb2cgaW4gaHlwZXJsaW5rIENvbnRyb2xcbiAgICovXG4gIGh5cGVybGlua0RpYWxvZyhldmVudDogYW55KSB7XG4gICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZDtcbiAgICBjb25zdCBtYXRjaGVkUm91dGUgPSB0aGlzLmZvcm1TZXJ2aWNlLmdldE1hdGNoZWRSb3V0ZUJhc2VkT25Db21wb25lbnQoZXZlbnQuZm9ybUZpZWxkPy5oeXBlcmxpbms/LmNvbXBvbmVudCk7XG4gICAgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5CTEFOSykge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbbWF0Y2hlZFJvdXRlPy5wYXRoXSwge1xuICAgICAgICBxdWVyeVBhcmFtczogZm9ybUZpZWxkLmh5cGVybGluaz8ucGFyYW1zLFxuICAgICAgfSk/LnRvU3RyaW5nKCk7XG5cbiAgICAgIHdpbmRvdz8ub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgICAgIFxuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLlNFTEYpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaHlwZXJsaW5rJyArIGZvcm1GaWVsZC5sYWJlbF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuRElBTE9HKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgICAgaWYgKChldmVudCAmJiBldmVudC5ldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50KSB8fCBmb3JtRmllbGQub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwge1xuICAgICAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJycsXG4gICAgICAgICAgc3R5bGU6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyB7fSA6IHsgJ21heC13aWR0aCc6ICdmaXQtY29udGVudCcgfSxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgICAgICBkYXRhOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtcyxcbiAgICAgICAgICBjbG9zYWJsZTp0cnVlLFxuICAgICAgICAgIGZvY3VzT25TaG93OiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZSxcbiAgICAgIGZvY3VzT25TaG93OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uQ2xpY2spIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgdGhlIHJlcXVpcmVkIGZpZWxkIGluIGZvcm1cbiAgICovXG4vLyAgIGFwcGx5UmVxdWlyZWRGaWVsZFZhbGlkYXRpb24oKSB7XG4vLyBjb25zb2xlLmxvZygnYXBwbHlpbmcgcmVxdWlyZWRmaWxlZCB2YWxpZGF0aW9ucycpXG4vLyAgICAgaWYgKFxuLy8gICAgICAgdGhpcy5mb3JtICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbi8vICAgICApIHtcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuLy8gICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsIGZpZWxkKVxuLy8gICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4vLyAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZCkgPT4ge1xuLy8gICAgICAgICAgICAgICBpZiAodmFsaWQudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsZmllbGQsJ2lzIHJlcXVpcmVkJylcbi8vICAgICAgICAgICAgICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuXG4gIHNldEZpbGVVcmxzKGZpbGVVcmxzOiBhbnkpIHtcbiAgICBpZiAoZmlsZVVybHMgJiYgZmlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWxlVXBsb2FkVXJscyA9IGZpbGVVcmxzO1xuICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGaWVsZHNWYWxpdGlvbnMoZmllbGRzOiBJRm9ybUZpZWxkW10pe1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmaWVsZHMpKSB7XG4gICAgICAgIGZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAvLyBzZXQgdXBsb2FkRmlsZSBVUkwgaW4gRm9ybUZpZWxkIGluIGNhc2Ugb2YgRklMRV9VUExPQURcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5GSUxFX1VQTE9BRCkge1xuICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5maWxlVXBsb2FkVXJscztcblxuICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHgudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCAmJiAhZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICBpZiAoZmllbGQuY2FyZCAmJiBmaWVsZC5jYXJkLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGEgPSBmaWVsZC5jYXJkLmRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnNlbGVjdGVkQ2FyZCAmJiB4LnNlbGVjdGVkQ2FyZC5sZW5ndGggPiAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YSAmJiBzZWxlY3RlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmaWVsZC5jYXJkLmRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRpdHk7XG4gIH1cbiAgb25TYXZlRm9ybSgpIHtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBpc0FsbEZpZWxkc1ZhbGlkID0gW107XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICBsZXQgbXVsaVNlbGVjdFZhbHVlID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNBbGxGaWVsZHNWYWxpZC5wdXNoKHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uZmllbGRzKSk7XG4gICAgICAgIHZhbGlkaXR5ID0gaXNBbGxGaWVsZHNWYWxpZC5ldmVyeSgoZmllbGQpID0+IGZpZWxkID09IHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhbGlkaXR5ID0gdGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHMpO1xuICAgICAgICBpc0FsbEZpZWxkc1ZhbGlkLnB1c2godGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5maWVsZHMpKTtcbiAgICAgICAgdmFsaWRpdHkgPSBpc0FsbEZpZWxkc1ZhbGlkLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGQgPT0gdHJ1ZSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBpZiAodmFsaWRpdHkpIHtcbiAgICAgIC8vIFNhdmUgZ3JpZCBvbiBmb3JtU2F2ZSBCdXR0b25cbiAgICAgIGxldCBjdXN0b21Db21wb25lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCB0ZW1wVmFsdWU6IGFueSA9IFtdO1xuICAgICAgbGV0IHNhdmVBbGxHcmlkOiBhbnkgPSBbXTtcbiAgICAgIGxldCBnZXRCdG5zOiBhbnkgPSBbXTtcbiAgICAgIGxldCBnZXRTYXZlYnV0dG9uOiBhbnkgPSBbXTtcbiAgICAgIC8vIHNldCB2YWx1ZSBhcyAxIG9yIDAgaW4gY2FzZSBvZiBjaGVja2JveFxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcyAmJiB2YWxpZGl0eSkge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUgPT09ICcnIHx8IGZpZWxkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb252ZXJ0IGRhdGUgaW50byB0aW1lIGFzIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiYgIWZpZWxkLnZhbHVlPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5zaG93VGltZSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnQU0nKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRWYWx1ZSA/IGZpZWxkLnZhbHVlIDogZmllbGQudmFsdWUgLyAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSAmJiAhY2FsY3VsYXRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2V0IHZhbHVlIG9mIGF1dG9Db21wbGV0ZSBhcyBzdHJpbmdzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHZhbHVlW2ZpZWxkLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRlbXBWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCcsJywgJzsnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBtdWx0aVNlbGVjdCBhcnJheSBpbnRvIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgZmllbGQuc2F2ZUFzU3RyaW5nICE9PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG11bGlTZWxlY3RWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkRST1BET1dOKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5zZXREcm9wZG93blZhbHVlKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNhdmUgZ3JpZCBvbiBmb3JtU2F2ZSBCdXR0b25cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UICYmICFjdXN0b21Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2F2ZUFsbEdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcjc2F2ZUFsbEdyaWRWYWx1ZXMnKTtcbiAgICAgICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgICAgIGlmIChzYXZlQWxsR3JpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzYXZlQWxsR3JpZFswXS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1QYWdlID0gaW50ZXJ2YWwoNzUwKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1QYWdlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2F2ZVJvd0J0biBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICAgICAgICBzYXZlUm93QnRuPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAgIGlmKCF0aGlzLnNwbGl0U2NyZWVuKXtcbiAgICAgICAgICAgZ2V0U2F2ZWJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLXNhdmUtYnV0dG9uJyk7XG4gICAgICAgICAgIGlmKGdldFNhdmVidXR0b24pe1xuICAgICAgICAgICAgIGdldFNhdmVidXR0b24/LmNsaWNrKCk7XG4gICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudChmYWxzZSk7XG4gICAgICBpZiAoIXNhdmVBbGxHcmlkLmxlbmd0aCAmJiAhZ2V0QnRucy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcykge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZC50aW1lT25seSAmJiBmaWVsZC5zaG93VGltZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZmllbGQudmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXFxkezJ9OlxcZHsyfSBbQVBdTSQvLnRlc3QoZmllbGQudmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICdoaDptbSBhJyk7XG4gICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBtdWxpU2VsZWN0VmFsdWVbZmllbGQuZmllbGRdO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkRST1BET1dOICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmIHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGVtcFZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZC5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzZXREcm9wZG93blZhbHVlKGZvcm1GaWVsZCkge1xuICAgIGxldCBmaWVsZFZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIGlmIChcbiAgICAgIGZpZWxkVmFsdWUgJiZcbiAgICAgIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0J1xuICAgICkge1xuICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZFZhbHVlO1xuICB9XG5cbiAgb25DYW5jZWxGb3JtKCkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlXG4gICAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICBrZXk6ICdjYW5jZWxCdXR0b24nLFxuICAgICAgICAgIG1lc3NhZ2U6ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlPycsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzWzBdLmRldGFpbCA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgIHV0aWxpdGllcy5yZW1vdmVBY3RpdmVJY29uQ2xhc3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbmNlbEZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIHV0aWxpdGllcy5yZW1vdmVBY3RpdmVJY29uQ2xhc3MoKTtcbiAgICB9XG4gIH1cblxuICBsb29rdXBDbGVhclZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudmFsdWUpIHtcbiAgICAgIGZvcm1GaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICB9XG4gICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgfVxuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgY2FsZW5kYXIgd2lkdGhcbiAgICovXG4gIHNldENhbGFuZGVyV2lkdGgoKSB7XG4gICAgY29uc3QgY2FsYW5kZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnAtY2FsZW5kYXInKTtcbiAgICBsZXQgZm9ybTogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybScpO1xuICAgIGxldCB3aWR0aCA9IGZvcm0/LmNsaWVudFdpZHRoO1xuICAgIGNhbGFuZGVyRWxlbWVudD8uZm9yRWFjaCgoY2FsYW5kZXI6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2FsYW5kZXJPZnNldExlZnQgPSBjYWxhbmRlci5vZmZzZXRMZWZ0O1xuICAgICAgaWYgKGNhbGFuZGVyT2ZzZXRMZWZ0IDw9IHdpZHRoIC8gMikge1xuICAgICAgICBjYWxhbmRlci5jbGFzc0xpc3QuYWRkKCdvcGVuLXJpZ2h0LXNpZGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGR5bmFtaWMgZGlhbG9nIGRhdGFcbiAgICovXG4gIHNldERpYWxvZ0RhdGEoZm9ybUZpZWxkOiBJRm9ybUZpZWxkLCBkYXRhOiBhbnkpOiBhbnkge1xuICAgIGlmIChkYXRhICYmIGZvcm1GaWVsZCkge1xuICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICBkYXRhID0gdXRpbGl0aWVzLm9iakNvbnZlcnRUb0xvd2VyKGRhdGEpO1xuICAgICAgbGV0IHNlbGVjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dCAmJlxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0LnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGVjdGlvbiA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0Py50b1N0cmluZygpPy50cmltKCk7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybUZpZWxkLnZhbHVlPy52YWx1ZT8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGRhdGEuY29tcG9uZW50Py5uYW1lO1xuICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8oXG4gICAgICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRPcGVuRGlhbG9nQ29tcG9uZW50ID0gZGF0YS5jb21wb25lbnQ7XG4gICAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZGF0YS5jb21wb25lbnQsIHtcbiAgICAgICAgLi4uZGF0YS5kYXRhLFxuICAgICAgICBzdHlsZUNsYXNzOiAnbG9va3VwLW1vZGVsJyxcbiAgICAgICAgaGVpZ2h0OiBkYXRhLmRhdGE/LmhlaWdodCA/IGRhdGEuZGF0YT8uaGVpZ2h0IDogJzkwdmgnLFxuICAgICAgICBjbG9zYWJsZTp0cnVlLFxuICAgICAgICBmb2N1c09uU2hvdzogZmFsc2UsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGFcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhYkZvY3VzRXZlbnQoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICcuJyArIGZvcm1GaWVsZC5maWVsZFxuICAgICk7XG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlja0V2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQub25DbGljayAmJiBmb3JtRmllbGQuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIG9uIGxvb2t1cENvbnRyb2wgbGFiZWxcbiAgICovXG4gIHNlbGVjdExvb2t1cExhYmVsKGZvcm1GaWVsZDogYW55LCBldmVudD86IGFueSkge1xuICAgIGlmIChcbiAgICAgIGZvcm1GaWVsZC5sYWJlbCAmJlxuICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbCAmJlxuICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgKSB7XG4gICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sPy5sb29rdXBDb250cm9sPy5jb21wb25lbnQpIHx8IGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sLmNvbXBvbmVudCwgZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sPy5sb29rdXBDb250cm9sPy5kYXRhLmRhdGEpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZjogYW55ID0gdGhpcy5zZXREaWFsb2dEYXRhKFxuICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmxvb2t1cENvbnRyb2xcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkLFxuICAgICAgICAgICAgICAgIGZvcm1GaWVsZD8ubGFiZWwubGFiZWxDb250cm9sLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5sYWJlbC5vblJldHVybilcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKGZvcm1GaWVsZC52YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoeyBlcnJvciB9OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFwaUVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkaWFsb2cgcmVmIHdoZW4gcG9wdXAgb3BlblxuICAgKi9cbiAgc2V0RHluYW1pY0RpYWxvZ1JlZihyZWY6IGFueSl7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLmRpYWxvZ0NvbXBvbmVudFJlZk1hcC5nZXQocmVmKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50ID0gZGlhbG9nUmVmPy5pbnN0YW5jZSBhcyBEeW5hbWljRGlhbG9nQ29tcG9uZW50O1xuICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSgpO1xuICAgIGR5bmFtaWNDb21wb25lbnQuZ2V0QXJpYUxhYmVsbGVkQnkgPSAoKSA9PiBhcmlhTGFiZWxsZWRCeTtcbiAgfVxuXG4gIGludGVyY2VwdERpYWxvZ0Nsb3NlKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICBpZiAoY29uZmlybShcIllvdSB3aWxsIGxvc2UgY2hhbmdlcyBub3Qgc2F2ZWQgb24gcGFnZS4gV291bGQgeW91IGxpa2UgdG8gY29udGludWU/XCIpID09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIG9uIGxvb2t1cENvbnRyb2wgZmllbGRcbiAgICovXG5cbiAgXG4gIHNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQubG9va3VwQ29udHJvbCkge1xuICAgICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5sb29rdXBGb2N1c091dCA9IHRydWU7XG4gICAgICBsZXQgdmFsdWUgPSBmb3JtRmllbGQudmFsdWU7XG4gICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuc2V0RGlhbG9nRGF0YShmb3JtRmllbGQsIGZvcm1GaWVsZC5sb29rdXBDb250cm9sKTtcbiAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZih0aGlzLmRpYWxvZ1JlZik7XG4gICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZShcbiAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9ZmFsc2U7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybUZpZWxkLmZpZWxkKT8uZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldERpYWxvZ1Jlc3BvbnNlKFxuICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5sb29rdXBDb250cm9sLFxuICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSBmb3JtRmllbGQub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlLCByZXMpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZFZhbHVlID1cbiAgICAgICAgICAgIHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgID8gZm9ybUZpZWxkLnZhbHVlLnRleHRcbiAgICAgICAgICAgICAgOiBmb3JtRmllbGQudmFsdWU7XG4gICAgICAgICAgdmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWU/LnRleHQgOiB2YWx1ZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFwaUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb25DbGljayBldmVudCBpbnZva2VkICYmIG9wZW4gRGlhbG9nIG9uIGxvb2t1cENvbnRyb2wgZmllbGQvbGFiZWxcbiAgICovXG4gIGhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLnNlbGVjdExvb2t1cExhYmVsKGZvcm1GaWVsZCk7XG4gICAgICB0aGlzLnNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCBDYWxlbmRhciBEYXRlIEZvcm1hdCAmJiBzZXQgRGF0ZSBNaW51dGUgaW50ZXJ2YWxcbiAgICovXG4gIHNldENhbGVuZGFyRGF0ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUikge1xuICAgICAgLy8gY29udmVydCB0aW1lIGludG8gZGF0ZSBmb3JtYXRcbiAgICAgIGlmIChcbiAgICAgICAgZm9ybUZpZWxkLnRpbWVPbmx5ICYmXG4gICAgICAgIChmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHxcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpXG4gICAgICApIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgIH1lbHNlIGlmIChcbiAgICAgICAgKGZvcm1GaWVsZC5zaG93VGltZSB8fCBmb3JtRmllbGQudGltZU9ubHkpICYmXG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSAmJlxuICAgICAgICBmb3JtRmllbGQubWludXRlc0ludGVydmFsXG4gICAgICApIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gbmV3IERhdGUoXG4gICAgICAgICAgdXRpbGl0aWVzLnNldE1pbnV0ZXNJbnRlcnZhbChmb3JtRmllbGQudmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgIWZvcm1GaWVsZC52YWx1ZSAmJlxuICAgICAgICBmb3JtRmllbGQubWludXRlc0ludGVydmFsXG4gICAgICApIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gbmV3IERhdGUodXRpbGl0aWVzLnNldE1pbnV0ZXNJbnRlcnZhbChuZXcgRGF0ZSgpKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGVuZGFyUHJldmlvdXNWYWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICB9XG4gIH1cbiAgY2FsZW5kYXJDaGFuZ2VWYWx1ZShmb3JtRmllbGQ6IGFueSkge1xuICAgIGlmIChmb3JtRmllbGQudmFsdWUgIT09IGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgICBmb3JtRmllbGQucHJldmlvdXNWYWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgc2VjdGlvbiBDbGlja2VkIGV2ZW50XG4gICAqL1xuICBjbGlja2VkU2VjdGlvbihzZWN0aW9uOiBJRm9ybVNlY3Rpb24pIHtcbiAgICB0aGlzLnNlY3Rpb25DbGlja2VkRXZlbnQuZW1pdChzZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBpbiBOb3RlX0ZpZWxkIGNvbnJ0cm9sXG4gICAqL1xuICBoYW5kbGVOb3RlRmllbGREaWFsb2coZm9ybWZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oTm90ZXNDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybWZpZWxkLmxhYmVsIGFzIHN0cmluZyxcbiAgICAgIHdpZHRoOiAnNTAlJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdmFsdWU6IGZvcm1maWVsZC52YWx1ZSxcbiAgICAgICAgZGlzYWJsZWRUZXh0OiBmb3JtZmllbGQuZGlzYWJsZWRUZXh0LFxuICAgICAgfSxcbiAgICAgIGNsb3NhYmxlOnRydWVcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtZmllbGQ/LmZpZWxkID8gZm9ybWZpZWxkPy5maWVsZCA6IGZvcm1maWVsZD8ubGFiZWwpO1xuICAgICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSAmJiBmb3JtZmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtZmllbGQub25SZXR1cm4oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoeyBlcnJvciB9KSA9PiB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFwaUVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZDogSUZvcm1GaWVsZCk6IHN0cmluZyB7XG4gICAgaWYgKGZvcm1GaWVsZC5oaWRkZW4pIHJldHVybiAnIGhpZGRlbic7XG4gICAgZWxzZSByZXR1cm4gJyc7XG4gIH1cblxuICBhdXRvU2VhcmNoKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkID0gZXZlbnQuZm9ybUZpZWxkXG4gICAgaWYgKGZvcm1GaWVsZCAmJiBldmVudCAmJiBldmVudC5ldmVudCkge1xuICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKGV2ZW50LmV2ZW50LnF1ZXJ5LCBmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2VkIG9uRm9jdXNPdXQgRXZlbnRcbiAgICovXG4gIG9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBsZXQgcmVjb3JkOiBhbnkgPSB7fTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4gICAgICBzZWN0aW9uPy5maWVsZHM/LmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgcmVjb3JkW2Zvcm1GaWVsZC5maWVsZF0gPSBmb3JtRmllbGQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHV0aWxpdGllcy5zZXRIeXBlcmxpbmtQYXJhbVZhbHVlKHJlY29yZCwgdGhpcy5mb3JtKTtcbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQub25Gb2N1c091dCAmJiB0aGlzLmxvb2t1cEZvY3VzT3V0ID09PSBmYWxzZSkge1xuICAgICAgZm9ybUZpZWxkLm9uRm9jdXNPdXQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBvbkJhY2tTcGFjZUV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmICh0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgPSBmb3JtRmllbGQudmFsdWUudGV4dC5zdWJzdHJpbmcoXG4gICAgICAgIDAsXG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0Lmxlbmd0aCAtIDFcbiAgICAgICk7XG4gICAgICBpZiAoZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy90aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2xlYXIgdGhlIGRyb3Bkb3duIHZhbHVlIHdoZW4gY2xpY2sgb24geFxuICAgKi9cbiAgb25DbGVhclZhbHVlKGV2ZW50OiBhbnkpIHtcbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkID0gZXZlbnQuZm9ybUZpZWxkO1xuICAgIHRoaXMub25DaGFuZ2VFdmVudChmb3JtRmllbGQpO1xuICAgIHRoaXMuZHJvcERvd25DaGFuZ2VFdmVudC5lbWl0KGZvcm1GaWVsZCk7XG4gICAgaWYgKCFldmVudC5ldmVudC52YWx1ZSkge1xuICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckRyb3Bkb3duVmFsdWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBvbkNoYW5nZSBFdmVudCB3aGVuIFZhbHVlIENoYW5nZWRcbiAgICovXG4gIG9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICB0eXBlT2YodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlIG9uIGR5bmFtaWMgYnV0dG9ucyBjbGlja1xuICAgKi9cbiAgb25OZXdCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBsZXQgc2F2ZUFsbEdyaWQ6IGFueSA9IFtdO1xuICAgIGxldCBnZXRCdG5zOiBhbnkgPSBbXTtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmb3JtU2VjdGlvbi5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICBidXR0b24uZnVuYygpO1xuICB9XG5cbiAgc2VsZWN0ZWRDYXJkQ2xpY2tFdmVudChkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSBmaWVsZC5jYXJkLmRhdGFbZGF0YS5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5zZWxlY3RlZENhcmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuc2VsZWN0ZWRDYXJkKSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFzc3dvcmRUeXBlKGZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudGV4dFR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAndGV4dCc7XG4gICAgfVxuICB9XG4gIG9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKXtcbiAgICBpZighbGluay5kaXNhYmxlZCAmJiAhZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgbGluay5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGlzVmFsaWRDb2x1bW4oY29sOiBhbnkpe1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29sKSAmJiBjb2wgPiAwICYmIGNvbCA8PSAxMlxuICB9XG4gYXN5bmMgYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudChldmVudCk6IFByb21pc2U8dm9pZD57XG4gIGxldCBob3ZlckRhdGEgOklPdmVybGF5UGFuZWxEYXRhID0gZXZlbnQ/LmhvdmVyRGF0YTtcbiAgbGV0IG92ZXJsYXlQYW5lbDogYW55ID0gZXZlbnQ/Lm92ZXJsYXlQYW5lbDtcbiAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCk9PntcbiAgICAgIGNvbnN0IGRhdGEgPSB7Li4uaG92ZXJEYXRhPy5kYXRhfTtcbiAgICAgIGlmKE9iamVjdD8ua2V5cyhkYXRhKT8ubGVuZ3RoID4gMCl7XG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0Py5rZXlzKGhvdmVyRGF0YT8uZGF0YSk7XG4gICAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGggPjAgKXtcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgICAgdmFyIHZhbHVlID1kYXRhW2tleV07XG4gICAgICAgICAgICBpZih2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ3snKSAmJiB2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ30nKSl7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwgdmFsdWVUb0ZpbmQpO1xuICAgICAgICAgICAgfWVsc2UgaWYoIXZhbHVlKXtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1tYXRjaGVkS2V5VmFsdWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/ICh0aGlzLm92ZXJsYXlQYW5lbFN0eWxlID0gaG92ZXJEYXRhLnN0eWxlKSA6ICcnO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6YW55ID0gdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoaG92ZXJEYXRhPy5jb21wb25lbnQpO1xuICAgICAgY29uc29sZS5sb2coY29tcG9uZW50UmVmKVxuICAgICAgaWYoaG92ZXJEYXRhLmRhdGEpe1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnID0gW107XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgICB9XG4gICAgICBvdmVybGF5UGFuZWwuc2hvdyhldmVudD8uZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxufVxuXG4iLCI8c2Utc3BsaXR0ZXIgXG4gICpuZ0lmPVwic3BsaXRTY3JlZW5cIlxuICBbZXhpc3RpbmdDb21wb25lbnRdPVwicGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50XCIgXG4gIFtwYW5lbENvbXBvbmVudF09XCJwYW5lbEluZm8ucGFuZWxDb21wb25lbnRcIiBcbiAgW2NvbmZpZ0RhdGFdPVwicGFuZWxJbmZvLmNvbmZpZ0RhdGFcIiBcbiAgKGNsb3NlUGFuZWxFbWl0dGVyKT1cImNsb3NlUGFuZWwoKVwiXG4+PC9zZS1zcGxpdHRlcj5cbjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2ICN2aWV3Q29udGFpbmVyRm9ybVJlZj5cbiAgPGZvcm0gKm5nSWY9XCIhaXNGb3JtSGlkZGVuICYmIGZvcm1cIj5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lciBwLXByb2dyZXNzLXNwaW5uZXItY2lyY2xlIGN1c3RvbS1zcGlubmVyXCI+PC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC13cmFwXCI+XG4gICAgICA8c3BhbiBbbmdDbGFzc109XCJ7ICdmaXhlZC1oZWlnaHQnOiBzdGlja3lBY3Rpb25zIH1cIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybVNlY3Rpb24gb2YgZm9ybS5mb3JtU2VjdGlvbnNcIiBbY2xhc3NdPVwiIWZvcm1TZWN0aW9uLmhpZGRlbiA/ICdjYXJkIHctMTAwJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNsaWNrZWRTZWN0aW9uKGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmb3JtU2VjdGlvbiA/ICcnIDogc2VjdGlvbkRpc2FibGVkKGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb3JtU2VjdGlvbi5oaWRkZW4gPyAnaGlkZGVuJyA6IGZvcm1TZWN0aW9uLmNsYXNzXCI+XG4gICAgICAgICAgICAgICAgPHAtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFxuICAgICAgICAgICAgICAgICAgW2hlYWRlcl09XCJmb3JtU2VjdGlvbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJmb3JtU2VjdGlvbi5leHBhbmRlZCAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uID8gJ2hpZGUtYWNjb3JkaWFuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBjbGFzcz1cIm1yLTEgcGwtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWJzZWN0aW9uLWhlYWRlclwiPnt7IGZvcm1TZWN0aW9uLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLWNvbCBmb3JtLWNvbXBvbmVudCBhY2NvcmRpb24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvblwiIGZvcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb25IZWFkZXJOYW1lIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgY2xhc3M9XCJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiB7eyBmb3JtU2VjdGlvbi5uYW1lIH19IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsaW5rIG9mIGZvcm1TZWN0aW9uLmxpbmtzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtci0zIGN1c3RvbS1saW5rXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJsaW5rLm5hbWUgJiYhZm9ybVNlY3Rpb24uZGlzYWJsZWQmJiFsaW5rLmRpc2FibGVkICA/ICdjdXN0b20tbGluaycgOiAnZGlzYWJsZWQtbGluaydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25MaW5rQ2xpY2sobGluaywgZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxpbmsubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZm9ybS1jb21wb25lbnQgZm9ybS1ib2R5LXdyYXBwZXIgaGVhZGVyLWZpZWxkcy13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCIoaGVhZGVyRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAgICAgKCBpc1ZhbGlkQ29sdW1uKGhlYWRlckZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgaGVhZGVyRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtLmNvbHVtbiArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaGVhZGVyRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcgY29sICdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyRmllbGQgb2YgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzOyBsZXQgaGVhZGVyRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImhlYWRlckZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTW91c2VMZWF2ZSk9XCJtb3VzZUxlYXZlRXZlbnQoJGV2ZW50KVwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaGVhZGVyRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQubGFiZWwuaWNvblwiPiB7e2hlYWRlckZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9pbnB1dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWVyaWMgSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdExvb2t1cCk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L251bWVyaWMtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrYm94LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NoZWNrYm94LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFzc3dvcmQgSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzd29yZC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFzc3dvcmQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhY2VyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiPjwvc3BhY2VyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRBUkVBXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEFyZWEtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC90ZXh0QXJlYS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tQWRkIEVkaXRvciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUX0VESVRPUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVkaXRvci1jb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlLWVkaXRvci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgQ29udHJvbC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQUxFTkRBUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZvcm1hdF09XCJjYWxlbmRhckZvcm1hdFwiIChvblNob3cpPVwic2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9jYWxlbmRhci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkRST1BET1dOXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInRhYkZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNsZWFyRHJvcGRvd25WYWx1ZSgkZXZlbnQpXCIgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRvQ29tcGxldGUgU2VhcmNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvQ29tcGxldGUtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvYXV0b0NvbXBsZXRlLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9tdWx0aXNlbGVjdC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkhZUEVSTElOS1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh5cGVybGluay1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25IeXBlcmxpbmtEaWFsb2dDbGljayk9XCJoeXBlcmxpbmtEaWFsb2coJGV2ZW50KVwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZnJhbUxvYWRFdmVudCk9XCJsb2FkSUZyYW1lKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9va3VwLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChrZXl1cFRhYik9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyTG9va3VwVmFsdWUpPVwibG9va3VwQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9sb29rdXAtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFTEVDVEJVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9zZWxlY3QtYnV0dG9uLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTk9URV9GSUVMRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGUtZGV0YWlsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU5vdGVGaWVsZERpYWxvZygkZXZlbnQpXCI+PC9ub3RlLWRldGFpbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNvbXBvbmVudC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24taGVhZGVyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiPjwvc2VjdGlvbi1oZWFkZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBPbkNsaWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQUREX0JVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvYWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlJFUE9SVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJoZWFkZXJGaWVsZFwiIFtsYWJlbF09XCJoZWFkZXJGaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImhlYWRlckZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJoZWFkZXJGaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImhlYWRlckZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgaGVhZGVyRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImhlYWRlckZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoZWFkZXJGaWVsZC5jbGFzc1wiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIEVtYWlsIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRU1BSUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVtYWlsLWdlbmVyYXRlLWJ0biBbcmVwSW5mb109XCJoZWFkZXJGaWVsZFwiIFtsYWJlbF09XCJoZWFkZXJGaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImhlYWRlckZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJoZWFkZXJGaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImhlYWRlckZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgaGVhZGVyRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImhlYWRlckZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoZWFkZXJGaWVsZC5jbGFzc1wiPjwvc2UtZW1haWwtZ2VuZXJhdGUtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIElucHV0IFN3aXRjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIENvbXBvbmVudCBDb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaGVhZGVyRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInt7Zm9ybVNlY3Rpb24ubmFtZX19LXt7aGVhZGVyRmllbGRJbmRleH19XCIgI2R5bmFtaWNDb21wb25lbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkZJTEVfVVBMT0FEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlckZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWZpbGUtdXBsb2FkIFthbGxvd011bHRpcGxlXT1cImhlYWRlckZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRGaWxlVHlwZXNdPVwiaGVhZGVyRmllbGQuU2V0ZmlsZVR5cGVzXCIgW2ZpZWxkc109XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVVcmwpPVwic2V0RmlsZVVybHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVdpZHRoXT1cImhlYWRlckZpZWxkLnJlc2l6ZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgIENhcmQgZmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlckZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJoZWFkZXJGaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihmb3JtRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oZm9ybUZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9ybUZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRmllbGQgb2YgZm9ybVNlY3Rpb24uZmllbGRzOyBsZXQgZm9ybUZpZWxkSW5kZXggPSBpbmRleFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBIeXBlcmxpbmsgb24gbG9va3VwICBDb250cm9sIEZpZWxkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtvdmVybGF5UGFuZWxdPVwib3ZlcmxheVBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkxvYWRMYWJlbENvbnRyb2xJRnJhbWVDbGljayk9XCJsb2FkTGFiZWxDb250cm9sSUZyYW1lKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbERpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIiBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5pY29uXCI+IHt7Zm9ybUZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cImZvcm1GaWVsZC5jb250cm9sXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNQQUNFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiPjwvc3BhY2VyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEFyZWEtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC90ZXh0QXJlYS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXh0IElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiZm9ybUZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkKVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiZm9ybUZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImZvcm1GaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImZvcm1GaWVsZFwiIFtyZXNpemVXaWR0aF09XCJmb3JtRmllbGQucmVzaXplV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCIgW2lzQXp1cmVVcGxvYWRdPVwiZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgPT0gZmFsc2UgPyBmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWNhcmQgW2NhcmRdPVwiZm9ybUZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coZm9ybUZpZWxkKVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2Zvcm1GaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgRW1haWwgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5FTUFJTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVtYWlsLWdlbmVyYXRlLWJ0biBbcmVwSW5mb109XCJmb3JtRmllbGRcIiBbbGFiZWxdPVwiZm9ybUZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImZvcm1GaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiZm9ybUZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImZvcm1GaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGZvcm1GaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJmb3JtRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJmb3JtRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImZvcm1GaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvcm1GaWVsZC5jbGFzc1wiPjwvc2UtZW1haWwtZ2VuZXJhdGUtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIElucHV0IFN3aXRjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNXSVRDSFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9JbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgRWRpdG9yIENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUX0VESVRPUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lZGl0b3ItY29udHJvbCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlLWVkaXRvci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuICAgICAgICAgICAgICAgIDwvcC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBzYXZlIGFuZCBjbG9zZSBidXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBhY3Rpb25zLWJ1dHRvbnMtbWFpbi13cmFwcGVyIGZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiIFtuZ0NsYXNzXT1cInsgc3RpY2t5OiBzdGlja3lBY3Rpb25zIH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXN0aWNreSBmb3JtLWNvbXBvbmVudCBhY3Rpb25zLWJ1dHRvbnMtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICA8IS0tIHNhdmUgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaGlkZVNhdmVCdXR0b25cIiBbZGlzYWJsZWRdPVwicmVxdWVzdFNlcnZpY2UuaXNTYXZlRGlzYWJsZWQgPyByZXF1ZXN0U2VydmljZS5pc1NhdmVEaXNhYmxlZCA6IGlzRm9ybURpc2FibGVkXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJzYXZlQnV0dG9uTGFiZWwgPyBzYXZlQnV0dG9uTGFiZWwgOiAnU2F2ZSdcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgZm9ybS1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TYXZlRm9ybSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBjbG9zZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFtsYWJlbF09XCJjYW5jZWxCdXR0b25MYWJlbCA/IGNhbmNlbEJ1dHRvbkxhYmVsIDogJ0NhbmNlbCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBmb3JtQnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBtbC0zXCIgKGNsaWNrKT1cIm9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyBidXR0b24uZGlzYWJsZWQgOiBmYWxzZVwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPHAtb3ZlcmxheVBhbmVsIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cIiFzcGxpdFNjcmVlblwiPlxuICA8ZGl2ICNhcHBlbmRGb3JtPjwvZGl2PlxuPC9kaXY+Il19
|
|
1545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN0QyxNQUFNLE9BQU8sYUFBYTtJQXNCeEIsSUFBYSxjQUFjLENBQUMsR0FBUTtRQUNsQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNqQixRQUFR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LEVBQUM7Z0JBR3BFLHlCQUF5QjtzQkFEeEIsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEMsb0JBQW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDVyxrQkFBa0I7c0JBQTdELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTU8sY0FBYztzQkFBMUIsS0FBSztnQkFLSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFtRFAsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudEZhY3RvcnksIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBOZ1pvbmUsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBOb3Rlc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ub3Rlcy9ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRUZvcm1Db250cm9sLCBFSHlwZXJsaW5rLCBJRm9ybUZpZWxkLCBJRHluYW1pY0Zvcm0sIElGb3JtU2VjdGlvbiwgRVZhbGlkYXRvciwgSUR5bmFtaWNDYXJkLCBJRm9ybUJ1dHRvbiwgRUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBFUGVybWlzc2lvblR5cGUsIElQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3VzZXItaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb21tb24ubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgZHJhZ2dhYmxlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElPdmVybGF5UGFuZWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyUmVmJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzp0cnVlfSlcbiAgcHVibGljIHBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJGb3JtUmVmJykgdmlld0NvbnRhaW5lckZvcm1SZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdhcHBlbmRGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIGdldFRhcmdldGVkRm9ybURpdjogRWxlbWVudFJlZjtcbiAgXG4gIEBJbnB1dCgpIHN0aWNreUFjdGlvbnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBmb3JtOiBJRHluYW1pY0Zvcm07XG4gIEBJbnB1dCgpIHNhdmVCdXR0b25MYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNhbmNlbEJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaGlkZVNhdmVCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaGlkZUNhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmb3JtQnV0dG9uczogSUZvcm1CdXR0b25bXSA9IFtdO1xuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb3ZlcmxheVBhbmVsU3R5bGU6IHt9O1xuICBwYW5lbEluZm86IGFueTtcbiAgc2VGb3JtT2JqOiBhbnk7XG4gIG1vZGVsU3BsaXRTY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGFjdGl2ZVRlc3RNb2RlKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgZGVidWdnZXI7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKSBzYXZlRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNhbmNlbEZvcm06IEV2ZW50RW1pdHRlcjxJRm9ybVNlY3Rpb25bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkcm9wRG93bkNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlY3Rpb25DbGlja2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxJRm9ybVNlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGR5bmFtaWNDYXNlID0gRUZvcm1Db250cm9sO1xuICBzYXZlRm9ybVBhZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcGVybWlzc2lvblR5cGUgPSBFUGVybWlzc2lvblR5cGU7XG4gIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpc0Zvcm1EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0Zvcm1IaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29tcG9uZW50c0xpc3Q6IElEaWN0aW9uYXJ5W10gPSBbXTtcbiAgZmlsZVVwbG9hZFVybHM6IGFueTtcbiAgc2hvd2ZpbGVVcGxvYWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBjYXJkTGlzdDogSUR5bmFtaWNDYXJkO1xuICBjYWxlbmRhclByZXZpb3VzVmFsdWU6IHN0cmluZyA9ICcnO1xuICBkZWZhdWx0RGF0ZTogc3RyaW5nID0gJyc7XG4gIGxvb2t1cEZvY3VzT3V0OiBib29sZWFuID0gZmFsc2U7XG4gIGNhbGVuZGFyRm9ybWF0OiBzdHJpbmcgPSAnbW0vZGQveXknO1xuICBzZXRDYXJkRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBzcGxpdFNjcmVlbiA6IGJvb2xlYW49IGZhbHNlO1xuICBkaWFsb2dSZWY6IGFueTtcblxuICAvLyBhcHBseSBjaGVja2VkL3VuQ2hlY2tlZCBwcm9wIGZvciBDaGVja0JveCBvZiB0aGUgRm9ybVxuICBjaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgdW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRPcGVuRGlhbG9nQ29tcG9uZW50OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGh5cGVybGlua1NlcnZpY2UgOiBIeXBlcmxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYWdlTG9nZ2VyU2VydmljZTogUGFnZUxvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHB1YmxpYyByZXF1ZXN0U2VydmljZSA6IFJlcXVlc3RTZXJ2aWNlLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gIFxuICB9XG5cbiAgLy8gYnJvd3NlciB0YWIgY2xvc2UgZXZlbnRcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgLy8gdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGZvcm1cbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gc3RhcnQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGxldCBmb3JtVmFsdWVzID0geyAuLi50aGlzLmZvcm0gfTtcbiAgICAgIGZvcm1WYWx1ZXMuZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgaWYoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcy5mb3JFYWNoKChoZWFkZXJGaWVsZCk9PntcbiAgICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoaGVhZGVyRmllbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGaWVsZFJlcXVpcmVkKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc1Bhc3N3b3JkKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnRleHRUeXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRpbWUgaW50byBkYXRlXG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJiBmaWVsZD8ub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgZmllbGRbJ3ByZXZpb3VzVmFsdWUnXSA9IGZpZWxkPy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZD8udGltZU9ubHkgJiZcbiAgICAgICAgICAgICAgKGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlICYmXG4gICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQ/LnZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAodmFsdWU6IGFueSkgPT4gdmFsdWVbZmllbGQ/LmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICAgID8uc3BsaXQoJzsnKVxuICAgICAgICAgICAgICAgICAgPy5tYXAoKHZhbDogYW55KSA9PiAoeyBbZmllbGQ/LmRpc3BsYXlGaWVsZF06IHZhbCB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIG11bHRpU2VsZWN0IHN0cmluZyB2YWx1ZSBpbiBhcnJheVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUucmVwbGFjZSgvXFxzKixcXHMqL2csIFwiLFwiKT8udG9TdHJpbmcoKT8uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IFtmaWVsZC52YWx1ZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtID0ge307XG4gICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5kYXRhPy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zICYmXG4gICAgICAgICAgICAgICAgICBmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICB4LmR5bmFtaWNGb3JtID0ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbnM6IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmllbGQ/LmNhcmQ/LmZvcm1TZWN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtID0gZm9ybVZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuZCBjYXJkTGlzdCByZWZlcmVuY2UgYnJlYWsgZnVuY3Rpb25hbGl0eVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPVxuICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09ICd5JyB8fFxuICAgICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpID09PSAnMSdcbiAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5IWVBFUkxJTkspIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLmh5cGVybGluaz8udGFyZ2V0VXNlVXNlclByZWYgJiYgZmllbGQuaHlwZXJsaW5rPy5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmaWVsZC5oeXBlcmxpbmsucGFyYW1zKT8uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5oeXBlcmxpbmsucGFyYW1zW2tleV0gPSBnZXRLZXlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgb3JkZXJGb3JtU2VjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICBsZXQgdXNlclNlY3Rpb24gPSBjdXJyZW50VXNlckluZm8/LnBhZ2VTZWN0aW9ucz8ubGVuZ3RoID4gMCA/IGN1cnJlbnRVc2VySW5mby5wYWdlU2VjdGlvbnMgOiBbXTtcbiAgICAgIGNvbnN0IHBhZ2VVcmwgPSB0aGlzLnBhZ2VOYW1lKCk7XG4gICAgICBpZiAodXNlclNlY3Rpb24/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXNlclNlY3Rpb24gPSB1c2VyU2VjdGlvbi5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlclNlY3Rpb246XCIsIHVzZXJTZWN0aW9uKVxuICAgICAgICB1c2VyU2VjdGlvbi5mb3JFYWNoKChwYWdlU2VjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lOiBib29sZWFuID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uc29tZSgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpICYmIHBhZ2VTZWN0aW9uPy5wYWdlPy50b0xvd2VyQ2FzZSgpID09PSBwYWdlVXJsPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChtYXRjaGVkTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5maW5kSW5kZXgoKHNlY3Rpb24pID0+IHBhZ2VTZWN0aW9uPy5zZWN0aW9uPy50b0xvd2VyQ2FzZSgpID09PSBzZWN0aW9uPy5uYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChwYWdlU2VjdGlvbi5yb2xlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzPy5sZW5ndGggPiAwICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocGFnZVNlY3Rpb24ucm9sZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW2luZGV4XS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbiAgc3dhcFNlY3Rpb25zKG9yZGVyOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZU9yZGVyU2VjdGlvbiA9IHsgLi4udGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tvcmRlcl0gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdID0gcmVPcmRlclNlY3Rpb247XG4gIH1cbiAgcGFnZU5hbWUoKSB7XG4gICAgbGV0IHVybCA9IHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpO1xuICAgIGlmICh1cmw/LmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnPycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHNldEZvcm1TZWN0aW9uKHNlY3Rpb24sIGluZGV4LCBwYWdlU2VjdGlvbikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi5zZWN0aW9uIH07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuc3BsaWNlKHBhZ2VTZWN0aW9uPy5vcmRlciAtIDEsIDAsIHJlT3JkZXJTZWN0aW9uKTtcbiAgfVxuICBjaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQ6IGFueSkge1xuICAgaWYoZmllbGQudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbj0+dmFsaWRhdGlvbi50eXBlPT09RVZhbGlkYXRvci5SRVFVSVJFRCkpe1xuICAgICAgZmllbGQucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4gICB9XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZighZm9ybUZpZWxkLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmb3JtRmllbGQuZmllbGQpWzBdXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XG4gICAgICAgIGlmICghdmFsPy50YXJnZXQ/LnZhbHVlPy5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgZm9ybUZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09IEVGb3JtYXRUeXBlLlNIT1JUREFURSkge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoXFxkezJ9KShcXGR7NH0pLywgJyQxLyQyLyQzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZS5sZW5ndGggPT0gNikge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gdmFsPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpLnNwbGl0KCcvJylbMl07XG4gICAgICAgIGlmICh5ZWFyPy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3l5JztcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh2YWw/LnRhcmdldD8udmFsdWUpPy50b0xvY2FsZURhdGVTdHJpbmcoXG4gICAgICAgICAgICAnZW4tVVMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9ICBcbiAgfVxuXG4gIC8vIHNldCBwZXJjZW50IGFuZCBkZWNpbWFsIHZhbHVlc1xuICBzZXRudW1lcmljdmFsdWVzKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcykge1xuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk5VTUVSSUMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJykge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChcbiAgICAgICAgICAgICAgICAgIGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogMlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGZvcm0gaGFzIGFueSBmaWVsZCB3aXRoIGR5bmFtaWMgY29tcG9uZW50O1xuICAgKiBDcmVhdGVzIGNvbXBvbmVudCBpbnN0YW5jZSB1c2luZyBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICogSW5qZWN0cyBjb21wb25lbnQgdGhyb3VnaCB2aWV3UmVmLmNyZWF0ZUNvbXBvbmVudCgpXG4gICAqIFBhc3NlcyBkYXRhIHRvIGNvbXBvbmVudFxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRzXG4gICAqIEZpbmFsbHkgZm9yY2VzIEFuZ3VsYXIgdG8gZGV0ZWNoIGNoYW5nZXNcbiAgICovXG4gXG4gIGxvYWREeW5hbWljQ29tcG9uZW50cygpIHtcbiAgICB0aGlzLmNvbXBvbmVudHNMaXN0ID0gW107XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSwgZmllbGRJbmRleCkgPT4ge1xuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNPTVBPTkVOVCkge1xuICAgICAgICAgIGNvbnN0IHZpZXdSZWY6IGFueSA9IHRoaXMuZHluYW1pY0NvbXBvbmVudENvbnRhaW5lci5maW5kKFxuICAgICAgICAgICAgKHgpID0+XG4gICAgICAgICAgICAgIHguZWxlbWVudC5uYXRpdmVFbGVtZW50LmlkID09IGAke2Zvcm1TZWN0aW9uLm5hbWV9LSR7ZmllbGRJbmRleH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IENvbXBvbmVudCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBoYW5kbGVycyxcbiAgICAgICAgICB9ID0gZmllbGQuY29tcG9uZW50Q29udHJvbDtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PGFueT4gPVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoQ29tcG9uZW50KTtcbiAgICAgICAgICAvLyBQYXNzaW5nIGRhdGEgdG8gY29tcG9uZW50XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdmlld1JlZj8uY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnkpO1xuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIGlmKGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCl7XG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLmFkZENsYXNzKGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBmaWVsZC5jb21wb25lbnRDb250cm9sLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMaXN0LnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBmaWVsZC5jb21wb25lbnRDb250cm9sPy5pZCxcbiAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudFJlZixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIHBhc3NlZCB0byB0aGUgY29tcG9uZW50c1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnQsIGhhbmRsZXJdOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAoY29tcG9uZW50UmVmLmluc3RhbmNlW2V2ZW50XSBhcyBFdmVudEVtaXR0ZXI8YW55Pik/LnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaW52b2tlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy9pbnZva2Ugd2hlbiBmaWxlIHVwbG9hZCBPUiBkZWxldGUgYSBmaWxlXG4gIGZpbGVPbmNoYW5nZUV2ZW50KCkge1xuICAgIHRoaXMuc2V0Q2FyZERhdGEgPSAhdGhpcy5zZXRDYXJkRGF0YTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBsb2FkIGR5bmFtaWMgY29tcG9uZW50cyBpZiBleGlzdCBpbiBmb3JtXG4gICAgdGhpcy5zZXRudW1lcmljdmFsdWVzKCk7XG4gICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICB0aGlzLmxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKTtcbiAgICB0aGlzLmxvYWREeW5hbWljQ29tcG9uZW50cygpO1xuICAgIHRoaXMuc2V0Q2FyZFJlc3BvbnNlSWQoKTtcbiAgfVxuXG4gIHNldENhcmRSZXNwb25zZUlkKCkge1xuICAgIHV0aWxpdGllcy5vbkR5bmFtaWNDYXJkU3RhdGVDaGFuZ2UoKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYocmVzLmRhdGE/LmlzU2F2ZSl7XG4gICAgICAgIHRoaXMuc2V0Q2FyZElkcyhyZXMuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldERlbGV0ZUNhcmRJZChyZXMuZGF0YT8uY2FyZERhdGEsIHJlcy5kYXRhPy5keW5hbWljRm9ybSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXREZWxldGVDYXJkSWQodXBkYXRlZENhcmREYXRhOmFueSwgZHluYW1pY0Zvcm06IElEeW5hbWljRm9ybSl7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb246SUZvcm1TZWN0aW9uKT0+e1xuICAgICAgY29uc3QgY2FyZENvbnRyb2wgPSBzZWN0aW9uLmZpZWxkcy5maW5kKChmaWVsZDpJRm9ybUZpZWxkKT0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEKTtcbiAgICAgIGlmKGNhcmRDb250cm9sKXtcbiAgICAgICAgY2FyZENvbnRyb2wuY2FyZC5kYXRhID0gdXBkYXRlZENhcmREYXRhO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBkeW5hbWljRm9ybSA9IHRoaXMuZm9ybTtcbiAgfVxuXG4gIHNldENhcmRJZHMocmVzKSB7XG4gICAgcmVzLnJlY29yZHMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldERhdGFGaWVsZHMocmVzLnJlY29yZHMpO1xuICAgIHJlcy5yZWNvcmRzPy5mb3JFYWNoKChyZWNvcmQ6IGFueSwgcmVjb3JkSW5kZXg6IGFueSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hDYXJkID0gcmVzLmNhcmRzSW5mbz8uZmluZChcbiAgICAgICAgKGluZm8sIGNhcmRJbmRleCkgPT5cbiAgICAgICAgICByZWNvcmRJbmRleCA9PT0gY2FyZEluZGV4ICYmIHJlY29yZFtyZXMuZmllbGROYW1lPy50b0xvd2VyQ2FzZSgpXVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaENhcmQgJiYgT2JqZWN0LmtleXMobWF0Y2hDYXJkKT8ubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXRjaENhcmRbcmVzLmZpZWxkTmFtZV0gPSByZWNvcmRbcmVzLmZpZWxkTmFtZT8udG9Mb3dlckNhc2UoKV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkO1xuICAgICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYocmVzLmNhcmRJZCl7XG4gICAgICAgICAgZm9ybUZpZWxkID0gZm9ybVNlY3Rpb24uZmllbGRzPy5maW5kKFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCAmJiBmaWVsZC5pZCA9PT0gcmVzLmNhcmRJZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybUZpZWxkID0gZm9ybVNlY3Rpb24uZmllbGRzPy5maW5kKFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChmb3JtRmllbGQpIHtcbiAgICAgICAgICBpZiAocmVzLmNhcmRzSW5mbz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzLmNhcmRzSW5mbz8uZm9yRWFjaCgoY2FyZElkKSA9PiB7XG4gICAgICAgICAgICAgIGNhcmRJZC5pZCA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9ybUZpZWxkLmNhcmQuZGF0YSA9IHJlcy5jYXJkc0luZm87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNldENhcmREYXRhID0gIXRoaXMuc2V0Q2FyZERhdGE7XG4gIH1cblxuICByZW1vdmVXaGl0ZVNwYWNlcygpIHtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24uY2xhc3MpIHNlY3Rpb24uY2xhc3MgPSBzZWN0aW9uLmNsYXNzLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRIeXBlcmxpbmtDb21wb25lbnRSb3V0ZSgpIHtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkhZUEVSTElOSyAmJlxuICAgICAgICAgIGZpZWxkLmh5cGVybGluaz8uY29tcG9uZW50XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucm91dGVyLnJlc2V0Q29uZmlnKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aDogJ2h5cGVybGluaycgKyBmaWVsZC5sYWJlbCxcbiAgICAgICAgICAgICAgY29tcG9uZW50OiBmaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnRoaXMucm91dGVyLmNvbmZpZyxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBicm93c2VyVGFiQ2xvc2VFdmVudChldmVudDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBldmVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYodGhpcy5zcGxpdFNjcmVlbil7XG4gICAgICB0aGlzLm1vZGVsU3BsaXRTY3JlZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuaXNDb21wb25lbnRFeGlzdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBsaXN0ZW5Ub1NwbGl0U2NyZWVuQ2hhbmdlKCkge1xuICAgIHV0aWxpdGllcy5vblNjcmVlblNwbGl0Q2hhbmdlKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBsZXQgbG9va3VwTW9kYWw6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3AtZGlhbG9nJylbMF07XG4gICAgICBsZXQgY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQ6IGFueTtcbiAgICAgIGlmKHRoaXMuZm9ybVNlcnZpY2UuaXNDb21wb25lbnRFeGlzdCAmJiB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCAhPT0gcmVzLnBhbmVsQ29tcG9uZW50KXtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UuaXNDb21wb25lbnRFeGlzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNwbGl0U2NyZWVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNEaWFsb2dNb2RlbCA9IGxvb2t1cE1vZGFsICYmIHRoaXMuY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQ7XG4gICAgICB0aGlzLnBhbmVsSW5mbyA9IHt9O1xuICAgICAgaWYgKGlzRGlhbG9nTW9kZWwpIHtcbiAgICAgICAgY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnRbJ25hdGl2ZUVsZW1lbnQnXSA9IHRoaXMuY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCA9IHJlcy5wYW5lbENvbXBvbmVudDtcbiAgICAgIHRoaXMucGFuZWxJbmZvLmNvbmZpZ0RhdGEgPSByZXMuY29uZmlnRGF0YTtcbiAgICAgIHRoaXMucGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50ID0gaXNEaWFsb2dNb2RlbCA/IGN1cnJlbnRPcGVuRGlhbG9nQ29tcG9uZW50IDogdGhpcy52aWV3Q29udGFpbmVyRm9ybVJlZjtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSAgdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tb2RlbFNwbGl0U2NyZWVuID0gaXNEaWFsb2dNb2RlbCA/IHRydWUgOiBmYWxzZTtcbiAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZm9ybS1zYXZlLWJ1dHRvbicpO1xuICAgICAgaWYgKHNhdmVCdXR0b24pIHtcbiAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3Q/LmFkZCgncC1zYXZlLWJ1dHRvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmRWaWV3Q29udGFpbmVyVG9EaXYoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgdGhpcy5zcGxpdFNjcmVlbiA9IGZhbHNlO1xuICAgIGNvbnN0IHNhdmVCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucC1zYXZlLWJ1dHRvbicpO1xuICAgIGlmIChzYXZlQnV0dG9uKSB7XG4gICAgICBzYXZlQnV0dG9uLmNsYXNzTGlzdD8ucmVtb3ZlKCdwLXNhdmUtYnV0dG9uJyk7XG4gICAgfVxuICAgIHRoaXMuYXBwZW5kVmlld0NvbnRhaW5lclRvRGl2KCk7XG4gIH1cblxuICBhcHBlbmRWaWV3Q29udGFpbmVyVG9EaXYoKSB7XG4gICAgbGV0IGZvcm1Db250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMubW9kZWxTcGxpdFNjcmVlbiA/IHRoaXMuY3VycmVudE9wZW5EaWFsb2dDb21wb25lbnQ/Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLnZpZXdDb250YWluZXJGb3JtUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFyZ2V0ZWRGb3JtRGl2Py5uYXRpdmVFbGVtZW50ICYmIGZvcm1Db250YWluZXJFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlcjI/LmFwcGVuZENoaWxkKHRoaXMuZ2V0VGFyZ2V0ZWRGb3JtRGl2Py5uYXRpdmVFbGVtZW50LCBmb3JtQ29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBMaXN0ZW5zIGFueSBjaGFuZ2UgaW4gRHluYW1pYyBGb3JtIGNvbXBvbmVudCBTdGF0ZVxuICAgKi9cblxuICBvbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1dGlsaXRpZXMub25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmlkICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmT2JqID0gdGhpcy5jb21wb25lbnRzTGlzdC5maW5kKFxuICAgICAgICAgICh4KSA9PiB4Lm5hbWUgPT09IHJlc3BvbnNlLmlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWZPYmopIHtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZS5kYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZk9iai52YWx1ZS5pbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYocmVzcG9uc2U/LmxvYWRDb21wb25lbnQpe1xuICAgICAgICAgICAgY29tcG9uZW50UmVmT2JqLnZhbHVlLmluc3RhbmNlLm5nT25Jbml0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFwcGx5IHVzZXIgcm9sZSBwZXJtaXNzaW9uc1xuICBhcHBseVVzZXJQZXJtaXNzaW9ucygpIHtcbiAgICBpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpIHtcbiAgICAgIGxldCB0b3RhbEZpZWxkczogbnVtYmVyID0gMDtcbiAgICAgIGxldCBkaXNhYmxlZEZpZWxkczogbnVtYmVyID0gMDtcbiAgICAgIGxldCBoaWRkZW5GaWVsZHM6IG51bWJlciA9IDA7XG5cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcykge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmb3JtRmllbGQpID0+IHtcbiAgICAgICAgICAgIGxldCBwZXJtaXNzaW9uczogYW55ID0gZm9ybUZpZWxkLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgbGV0IHNlY3Rpb25QZXJtaXNzaW9uczogYW55ID0gW107XG4gICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25zKSBzZWN0aW9uUGVybWlzc2lvbnMgPSBmb3JtU2VjdGlvbi5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGlmICghcGVybWlzc2lvbnMpIHBlcm1pc3Npb25zID0gdGhpcy5mb3JtLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgbGV0IGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHNlY3Rpb25QZXJtaXNzaW9ucyAmJiBzZWN0aW9uUGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBzZWN0aW9uUGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnJvbGVzLmZvckVhY2goKHJvbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnJvbGVzICYmIHBlcm1pc3Npb24ucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVyAmJlxuICAgICAgICAgICAgICAgICAgICAhaGFzVmFsaWRFZGl0UGVybWlzc2lvblxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5wZXJtaXNzaW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnBlcm1pc3Npb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1TZWN0aW9uLmRpc2FibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG90YWxGaWVsZHMrKztcblxuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICBkaXNhYmxlZEZpZWxkcysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikge1xuICAgICAgICAgICAgICBoaWRkZW5GaWVsZHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaXNGb3JtRGlzYWJsZWQgPSB0b3RhbEZpZWxkcyA+IDAgJiYgdG90YWxGaWVsZHMgPT09IGRpc2FibGVkRmllbGRzO1xuICAgICAgdGhpcy5pc0Zvcm1IaWRkZW4gPSB0b3RhbEZpZWxkcyA+IDAgJiYgdG90YWxGaWVsZHMgPT09IGhpZGRlbkZpZWxkcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBJRnJhbWUgaW4gaHlwZXJsaW5rIENvbnRyb2xcbiAgICovXG4gIHNlY3Rpb25EaXNhYmxlZChmb3JtU2VjdGlvbjogSUZvcm1TZWN0aW9uKSB7XG4gICAgaWYgKGZvcm1TZWN0aW9uLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb24sIHRydWUpO1xuICAgIH0gZWxzZSBpZihmb3JtU2VjdGlvbi5kaXNhYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbiwgZmFsc2UpO1xuICAgIH1lbHNlIHtcbiAgICAgIHJldHVybiBmb3JtU2VjdGlvbjtcbiAgICB9XG4gIH1cblxuICBkaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb246IElGb3JtU2VjdGlvbiwgZGlzYWJsZWQ6IGJvb2xlYW4pe1xuICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5tYXAoKGZpZWxkOiBJRm9ybUZpZWxkKSA9PiB7XG4gICAgICBmaWVsZC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH0pO1xuICAgIHJldHVybiBmb3JtU2VjdGlvbjtcbiAgfVxuXG4gIGxvYWRJRnJhbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgdGhpcy5oYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oSWZyYW1lQ29tcG9uZW50LCB7XG4gICAgICBoZWFkZXI6ICdIeXBlcmxpbmsnLFxuICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbms/LndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rPy5oZWlnaHQgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA6ICc4MCUnLFxuICAgICAgZGF0YTogeyB2YWx1ZTogZm9ybUZpZWxkLmh5cGVybGluaz8ubGluaywgaUZyYW1lSWQ6IGZvcm1GaWVsZC5sYWJlbCB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZSxcbiAgICAgIGZvY3VzT25TaG93OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQpO1xuICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGlhbG9nIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBoeXBlcmxpbmtEaWFsb2coZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gdGhpcy5mb3JtU2VydmljZS5nZXRNYXRjaGVkUm91dGVCYXNlZE9uQ29tcG9uZW50KGV2ZW50LmZvcm1GaWVsZD8uaHlwZXJsaW5rPy5jb21wb25lbnQpO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW21hdGNoZWRSb3V0ZT8ucGF0aF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyxcbiAgICAgIH0pPy50b1N0cmluZygpO1xuXG4gICAgICB3aW5kb3c/Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5TRUxGKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLkRJQUxPRykge1xuICAgICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgIGlmICgoZXZlbnQgJiYgZXZlbnQuZXZlbnQuY3RybEtleSAmJiBmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCkgfHwgZm9ybUZpZWxkLm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LCBmb3JtRmllbGQuaHlwZXJsaW5rPy5wYXJhbXMpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIHtcbiAgICAgICAgICBoZWFkZXI6IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA6ICcnLFxuICAgICAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICcnLFxuICAgICAgICAgIHN0eWxlOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8ge30gOiB7ICdtYXgtd2lkdGgnOiAnZml0LWNvbnRlbnQnIH0sXG4gICAgICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICAgICAgZGF0YTogZm9ybUZpZWxkLmh5cGVybGluay5wYXJhbXMsXG4gICAgICAgICAgY2xvc2FibGU6dHJ1ZSxcbiAgICAgICAgICBmb2N1c09uU2hvdzogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZih0aGlzLmRpYWxvZ1JlZik7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBmb3JtRmllbGQuaHlwZXJsaW5rPy5jb21wb25lbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8oXG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gSWZyYW1lIG9uIExhYmVsXG4gICAqL1xuICBsb2FkTGFiZWxDb250cm9sSUZyYW1lKGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oSWZyYW1lQ29tcG9uZW50LCB7XG4gICAgICBoZWFkZXI6IGZvcm1GaWVsZC5sYWJlbC5uYW1lLFxuICAgICAgd2lkdGg6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aFxuICAgICAgICA6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluaz8uaGVpZ2h0XG4gICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHRcbiAgICAgICAgOiAnODAlJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdmFsdWU6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5saW5rXG4gICAgICAgICAgPyBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluay5saW5rXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgaUZyYW1lSWQ6IGZvcm1GaWVsZC5sYWJlbC5uYW1lLFxuICAgICAgfSxcbiAgICAgIGNsb3NhYmxlOnRydWUsXG4gICAgICBmb2N1c09uU2hvdzogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgJ0lmcmFtZUNvbXBvbmVudCdcbiAgICApO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkNsaWNrKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaW5kIHRoZSByZXF1aXJlZCBmaWVsZCBpbiBmb3JtXG4gICAqL1xuLy8gICBhcHBseVJlcXVpcmVkRmllbGRWYWxpZGF0aW9uKCkge1xuLy8gY29uc29sZS5sb2coJ2FwcGx5aW5nIHJlcXVpcmVkZmlsZWQgdmFsaWRhdGlvbnMnKVxuLy8gICAgIGlmIChcbi8vICAgICAgIHRoaXMuZm9ybSAmJlxuLy8gICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucyAmJlxuLy8gICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5sZW5ndGggPiAwXG4vLyAgICAgKSB7XG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcbi8vICAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbi8vICAgICAgICAgICBjb25zb2xlLmxvZygnZmllbGQnLCBmaWVsZClcbi8vICAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvbnMgJiYgZmllbGQudmFsaWRhdGlvbnMubGVuZ3RoID4gMCkge1xuLy8gICAgICAgICAgICAgZmllbGQudmFsaWRhdGlvbnMuZm9yRWFjaCgodmFsaWQpID0+IHtcbi8vICAgICAgICAgICAgICAgaWYgKHZhbGlkLnR5cGUgPT09IEVWYWxpZGF0b3IuUkVRVUlSRUQpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmllbGQnLGZpZWxkLCdpcyByZXF1aXJlZCcpXG4vLyAgICAgICAgICAgICAgICAgZmllbGQucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4vLyAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9KTtcbi8vICAgICB9XG4vLyAgIH1cblxuICBzZXRGaWxlVXJscyhmaWxlVXJsczogYW55KSB7XG4gICAgaWYgKGZpbGVVcmxzICYmIGZpbGVVcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZmlsZVVwbG9hZFVybHMgPSBmaWxlVXJscztcbiAgICAgIHRoaXMuc2hvd2ZpbGVVcGxvYWRFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRmllbGRzVmFsaXRpb25zKGZpZWxkczogSUZvcm1GaWVsZFtdKXtcbiAgICBsZXQgZXJyb3JNZXNzYWdlRGV0YWlscyA9ICcnO1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgaWYgKCF0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoZmllbGRzKSkge1xuICAgICAgICBmaWVsZHM/LmZvckVhY2goKGZvcm1GaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzXG4gICAgICAgICAgICAgID8gZXJyb3JNZXNzYWdlRGV0YWlscyArICcgLCAnICsgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5lcnJvck1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzLnNvbWUoXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5yZXF1aXJlZEZpZWxkICYmIGZpZWxkLmVycm9yTWVzc2FnZSAmJiAhZmllbGQudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHZhbGlkaXR5ICYmIGZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzLFxuICAgICAgICAgICAgNTAwMCxcbiAgICAgICAgICAgICdSRVFVSVJFRCBGSUVMRCdcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZURldGFpbHMsIDUwMDAsICdJTlZBTElEIEZJRUxEJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRpdHkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgLy8gc2V0IHVwbG9hZEZpbGUgVVJMIGluIEZvcm1GaWVsZCBpbiBjYXNlIG9mIEZJTEVfVVBMT0FEXG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuRklMRV9VUExPQUQpIHtcbiAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZmlsZVVwbG9hZFVybHM7XG5cbiAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvbnMgJiYgZmllbGQudmFsaWRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGQudmFsaWRhdGlvbnMuZm9yRWFjaCgoeDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh4LnR5cGUgPT09IEVWYWxpZGF0b3IuUkVRVUlSRUQgJiYgIWZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWREYXRhID0gZmllbGQuY2FyZC5kYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKHg6IGFueSkgPT4geC5zZWxlY3RlZENhcmQgJiYgeC5zZWxlY3RlZENhcmQubGVuZ3RoID4gMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGEgJiYgc2VsZWN0ZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZmllbGQuY2FyZC5kYXRhID0gc2VsZWN0ZWREYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkaXR5O1xuICB9XG4gIG9uU2F2ZUZvcm0oKSB7XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBsZXQgaXNBbGxGaWVsZHNWYWxpZCA9IFtdO1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgbGV0IG11bGlTZWxlY3RWYWx1ZSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlzQWxsRmllbGRzVmFsaWQucHVzaCh0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmZpZWxkcykpO1xuICAgICAgICB2YWxpZGl0eSA9IGlzQWxsRmllbGRzVmFsaWQuZXZlcnkoKGZpZWxkKSA9PiBmaWVsZCA9PSB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB2YWxpZGl0eSA9IHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzKTtcbiAgICAgICAgaXNBbGxGaWVsZHNWYWxpZC5wdXNoKHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uZmllbGRzKSk7XG4gICAgICAgIHZhbGlkaXR5ID0gaXNBbGxGaWVsZHNWYWxpZC5ldmVyeSgoZmllbGQpID0+IGZpZWxkID09IHRydWUpO1xuICAgICAgfVxuXG4gICAgfSk7XG4gICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICBsZXQgY3VzdG9tQ29tcG9uZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgICBsZXQgdGVtcFZhbHVlOiBhbnkgPSBbXTtcbiAgICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgICBsZXQgZ2V0QnRuczogYW55ID0gW107XG4gICAgICBsZXQgZ2V0U2F2ZWJ1dHRvbjogYW55ID0gW107XG4gICAgICAvLyBzZXQgdmFsdWUgYXMgMSBvciAwIGluIGNhc2Ugb2YgY2hlY2tib3hcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMgJiYgdmFsaWRpdHkpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlID09PSAnJyB8fCBmaWVsZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29udmVydCBkYXRlIGludG8gdGltZSBhcyBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkLnRpbWVPbmx5ICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmICFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpbnZhbGlkJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmllbGQuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ0FNJykgJiZcbiAgICAgICAgICAgICAgICAhZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdQTScpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZC52YWx1ZSwgJ2hoOm1tIGEnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLicpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjdWxhdGVkVmFsdWUgPyBmaWVsZC52YWx1ZSA6IGZpZWxkLnZhbHVlIC8gMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgJiYgIWNhbGN1bGF0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBvZiBhdXRvQ29tcGxldGUgYXMgc3RyaW5nc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgICFmaWVsZC5zaG93QWxsVmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQudmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZC5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnOycpIHx8XG4gICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0ZW1wVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgnLCcsICc7Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgbXVsdGlTZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpICYmXG4gICAgICAgICAgICAgIGZpZWxkLnNhdmVBc1N0cmluZyAhPT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBtdWxpU2VsZWN0VmFsdWVbZmllbGQuZmllbGRdID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5EUk9QRE9XTikge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuc2V0RHJvcGRvd25WYWx1ZShmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNPTVBPTkVOVCAmJiAhY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgICAgICBpZiAoc2F2ZUFsbEdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZSA9IGludGVydmFsKDc1MCkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNhdmVSb3dCdG4gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgICBpZighdGhpcy5zcGxpdFNjcmVlbil7XG4gICAgICAgICAgIGdldFNhdmVidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucC1zYXZlLWJ1dHRvbicpO1xuICAgICAgICAgICBpZihnZXRTYXZlYnV0dG9uKXtcbiAgICAgICAgICAgICBnZXRTYXZlYnV0dG9uPy5jbGljaygpO1xuICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgaWYgKCFzYXZlQWxsR3JpZC5sZW5ndGggJiYgIWdldEJ0bnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiYgZmllbGQuc2hvd1RpbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KGZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5EUk9QRE9XTiAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJiB0eXBlb2YgZmllbGQudmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgICFmaWVsZC5zaG93QWxsVmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRlbXBWYWx1ZVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJywnLCAnOycpXG4gICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgPy5tYXAoKHZhbDogYW55KSA9PiAoeyBbZmllbGQuZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgPT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlICogMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlICogMTAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgc2V0RHJvcGRvd25WYWx1ZShmb3JtRmllbGQpIHtcbiAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICBpZiAoXG4gICAgICBmaWVsZFZhbHVlICYmXG4gICAgICB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICApIHtcbiAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIG9uQ2FuY2VsRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZVxuICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAga2V5OiAnY2FuY2VsQnV0dG9uJyxcbiAgICAgICAgICBtZXNzYWdlOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT8nLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1swXS5kZXRhaWwgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNhbGVuZGFyIHdpZHRoXG4gICAqL1xuICBzZXRDYWxhbmRlcldpZHRoKCkge1xuICAgIGNvbnN0IGNhbGFuZGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wLWNhbGVuZGFyJyk7XG4gICAgbGV0IGZvcm06IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICBsZXQgd2lkdGggPSBmb3JtPy5jbGllbnRXaWR0aDtcbiAgICBjYWxhbmRlckVsZW1lbnQ/LmZvckVhY2goKGNhbGFuZGVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNhbGFuZGVyT2ZzZXRMZWZ0ID0gY2FsYW5kZXIub2Zmc2V0TGVmdDtcbiAgICAgIGlmIChjYWxhbmRlck9mc2V0TGVmdCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgY2FsYW5kZXIuY2xhc3NMaXN0LmFkZCgnb3Blbi1yaWdodC1zaWRlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkeW5hbWljIGRpYWxvZyBkYXRhXG4gICAqL1xuICBzZXREaWFsb2dEYXRhKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoZGF0YSAmJiBmb3JtRmllbGQpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgZGF0YSA9IHV0aWxpdGllcy5vYmpDb252ZXJ0VG9Mb3dlcihkYXRhKTtcbiAgICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWUudGV4dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZT8udmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS50b1N0cmluZygpLnRyaW0oKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBkYXRhLmNvbXBvbmVudD8ubmFtZTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50T3BlbkRpYWxvZ0NvbXBvbmVudCA9IGRhdGEuY29tcG9uZW50O1xuICAgICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGRhdGEuY29tcG9uZW50LCB7XG4gICAgICAgIC4uLmRhdGEuZGF0YSxcbiAgICAgICAgc3R5bGVDbGFzczogJ2xvb2t1cC1tb2RlbCcsXG4gICAgICAgIGhlaWdodDogZGF0YS5kYXRhPy5oZWlnaHQgPyBkYXRhLmRhdGE/LmhlaWdodCA6ICc5MHZoJyxcbiAgICAgICAgY2xvc2FibGU6dHJ1ZSxcbiAgICAgICAgZm9jdXNPblNob3c6IGZhbHNlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgICAgZmllbGQ6IGZvcm1GaWVsZC5maWVsZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgdmFsdWVGaWVsZDogZGF0YS5kYXRhPy52YWx1ZUZpZWxkLFxuICAgICAgICAgIC4uLmRhdGEuZGF0YS5kYXRhXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldERpYWxvZ1Jlc3BvbnNlKFxuICAgICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQ/LmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sLFxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQubGFiZWwub25SZXR1cm4pXG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbC5vblJldHVybihmb3JtRmllbGQudmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgZGlhbG9nIHJlZiB3aGVuIHBvcHVwIG9wZW5cbiAgICovXG4gIHNldER5bmFtaWNEaWFsb2dSZWYocmVmOiBhbnkpe1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb21wb25lbnRSZWZNYXAuZ2V0KHJlZik7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudCA9IGRpYWxvZ1JlZj8uaW5zdGFuY2UgYXMgRHluYW1pY0RpYWxvZ0NvbXBvbmVudDtcbiAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGR5bmFtaWNDb21wb25lbnQuZ2V0QXJpYUxhYmVsbGVkQnkoKTtcbiAgICBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5ID0gKCkgPT4gYXJpYUxhYmVsbGVkQnk7XG4gIH1cblxuICBpbnRlcmNlcHREaWFsb2dDbG9zZShldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgaWYgKGNvbmZpcm0oXCJZb3Ugd2lsbCBsb3NlIGNoYW5nZXMgbm90IHNhdmVkIG9uIHBhZ2UuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlP1wiKSA9PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkXG4gICAqL1xuXG4gIFxuICBzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSB0cnVlO1xuICAgICAgbGV0IHZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLnNldERpYWxvZ0RhdGEoZm9ybUZpZWxkLCBmb3JtRmllbGQubG9va3VwQ29udHJvbCk7XG4gICAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPWZhbHNlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1GaWVsZC5maWVsZCk/LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLFxuICAgICAgICAgICAgICBmb3JtRmllbGQubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5sb29rdXBGb2N1c091dCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikgZm9ybUZpZWxkLm9uUmV0dXJuKGZvcm1GaWVsZC52YWx1ZSwgcmVzKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgICAgICBjb25zdCBmb3JtRmllbGRWYWx1ZSA9XG4gICAgICAgICAgICB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICA/IGZvcm1GaWVsZC52YWx1ZS50ZXh0XG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlPy50ZXh0IDogdmFsdWU7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoeyBlcnJvciB9OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgZXZlbnQgaW52b2tlZCAmJiBvcGVuIERpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkL2xhYmVsXG4gICAqL1xuICBoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQubG9va3VwQ29udHJvbCkge1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQpO1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgQ2FsZW5kYXIgRGF0ZSBGb3JtYXQgJiYgc2V0IERhdGUgTWludXRlIGludGVydmFsXG4gICAqL1xuICBzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIpIHtcbiAgICAgIC8vIGNvbnZlcnQgdGltZSBpbnRvIGRhdGUgZm9ybWF0XG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1GaWVsZC50aW1lT25seSAmJlxuICAgICAgICAoZm9ybUZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZvcm1GaWVsZC52YWx1ZSk7XG4gICAgICB9ZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICBmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgZm9ybUZpZWxkLm1pbnV0ZXNJbnRlcnZhbFxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgIHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwoZm9ybUZpZWxkLnZhbHVlKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGZvcm1GaWVsZC5zaG93VGltZSB8fCBmb3JtRmllbGQudGltZU9ubHkpICYmXG4gICAgICAgICFmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgZm9ybUZpZWxkLm1pbnV0ZXNJbnRlcnZhbFxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwobmV3IERhdGUoKSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclByZXZpb3VzVmFsdWUgPSBmb3JtRmllbGQudmFsdWU7XG4gICAgfVxuICB9XG4gIGNhbGVuZGFyQ2hhbmdlVmFsdWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICE9PSBmb3JtRmllbGQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgICAgZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUgPSBmb3JtRmllbGQudmFsdWU7XG4gICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2VkIHNlY3Rpb24gQ2xpY2tlZCBldmVudFxuICAgKi9cbiAgY2xpY2tlZFNlY3Rpb24oc2VjdGlvbjogSUZvcm1TZWN0aW9uKSB7XG4gICAgdGhpcy5zZWN0aW9uQ2xpY2tlZEV2ZW50LmVtaXQoc2VjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgaW4gTm90ZV9GaWVsZCBjb25ydHJvbFxuICAgKi9cbiAgaGFuZGxlTm90ZUZpZWxkRGlhbG9nKGZvcm1maWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE5vdGVzQ29tcG9uZW50LCB7XG4gICAgICBoZWFkZXI6IGZvcm1maWVsZC5sYWJlbCBhcyBzdHJpbmcsXG4gICAgICB3aWR0aDogJzUwJScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHZhbHVlOiBmb3JtZmllbGQudmFsdWUsXG4gICAgICAgIGRpc2FibGVkVGV4dDogZm9ybWZpZWxkLmRpc2FibGVkVGV4dCxcbiAgICAgIH0sXG4gICAgICBjbG9zYWJsZTp0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybWZpZWxkPy5maWVsZCA/IGZvcm1maWVsZD8uZmllbGQgOiBmb3JtZmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZm9ybWZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybWZpZWxkLm9uUmV0dXJuKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3IgfSkgPT4ge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHNldENsYXNzTmFtZShmb3JtRmllbGQ6IElGb3JtRmllbGQpOiBzdHJpbmcge1xuICAgIGlmIChmb3JtRmllbGQuaGlkZGVuKSByZXR1cm4gJyBoaWRkZW4nO1xuICAgIGVsc2UgcmV0dXJuICcnO1xuICB9XG5cbiAgYXV0b1NlYXJjaChldmVudDogYW55KSB7XG4gICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZFxuICAgIGlmIChmb3JtRmllbGQgJiYgZXZlbnQgJiYgZXZlbnQuZXZlbnQpIHtcbiAgICAgIGZvcm1GaWVsZC5vblJldHVybihldmVudC5ldmVudC5xdWVyeSwgZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBvbkZvY3VzT3V0IEV2ZW50XG4gICAqL1xuICBvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgbGV0IHJlY29yZDogYW55ID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgc2VjdGlvbj8uZmllbGRzPy5mb3JFYWNoKChmb3JtRmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZCkge1xuICAgICAgICAgIHJlY29yZFtmb3JtRmllbGQuZmllbGRdID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB1dGlsaXRpZXMuc2V0SHlwZXJsaW5rUGFyYW1WYWx1ZShyZWNvcmQsIHRoaXMuZm9ybSk7XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uRm9jdXNPdXQgJiYgdGhpcy5sb29rdXBGb2N1c091dCA9PT0gZmFsc2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkZvY3VzT3V0KGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgb25CYWNrU3BhY2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAodHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0ID0gZm9ybUZpZWxkLnZhbHVlLnRleHQuc3Vic3RyaW5nKFxuICAgICAgICAwLFxuICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggLSAxXG4gICAgICApO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZS50ZXh0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiBmb3JtRmllbGQudmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNsZWFyIHRoZSBkcm9wZG93biB2YWx1ZSB3aGVuIGNsaWNrIG9uIHhcbiAgICovXG4gIG9uQ2xlYXJWYWx1ZShldmVudDogYW55KSB7XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZDtcbiAgICB0aGlzLm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKTtcbiAgICB0aGlzLmRyb3BEb3duQ2hhbmdlRXZlbnQuZW1pdChmb3JtRmllbGQpO1xuICAgIGlmICghZXZlbnQuZXZlbnQudmFsdWUpIHtcbiAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2Ugb25DaGFuZ2UgRXZlbnQgd2hlbiBWYWx1ZSBDaGFuZ2VkXG4gICAqL1xuICBvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgdHlwZU9mKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZSBvbiBkeW5hbWljIGJ1dHRvbnMgY2xpY2tcbiAgICovXG4gIG9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKSB7XG4gICAgbGV0IHNhdmVBbGxHcmlkOiBhbnkgPSBbXTtcbiAgICBsZXQgZ2V0QnRuczogYW55ID0gW107XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlRGV0YWlscyA9ICcnO1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoZm9ybVNlY3Rpb24uZmllbGRzKSkge1xuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHM/LmZvckVhY2goKGZvcm1GaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzXG4gICAgICAgICAgICAgID8gZXJyb3JNZXNzYWdlRGV0YWlscyArICcgLCAnICsgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5lcnJvck1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZpZWxkID0gZm9ybVNlY3Rpb24uZmllbGRzLnNvbWUoXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5yZXF1aXJlZEZpZWxkICYmIGZpZWxkLmVycm9yTWVzc2FnZSAmJiAhZmllbGQudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHZhbGlkaXR5ICYmIGZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzLFxuICAgICAgICAgICAgNTAwMCxcbiAgICAgICAgICAgICdSRVFVSVJFRCBGSUVMRCdcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZURldGFpbHMsIDUwMDAsICdJTlZBTElEIEZJRUxEJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRpdHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZGl0eSkge1xuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICBzYXZlQWxsR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJyNzYXZlQWxsR3JpZFZhbHVlcycpO1xuICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgIGlmIChzYXZlQWxsR3JpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNhdmVBbGxHcmlkWzBdLmNsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc2F2ZVJvd0J0biBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICAgIHNhdmVSb3dCdG4/LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgYnV0dG9uLmZ1bmMoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoZGF0YTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbjogYW55KSA9PiB7XG4gICAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5jYXJkICYmIGZpZWxkLmNhcmQuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gZmllbGQuY2FyZC5kYXRhW2RhdGEuaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5zZWxlY3RlZENhcmQpIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouc2VsZWN0ZWRDYXJkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvYmpbJ3NlbGVjdGVkQ2FyZCddID0gJ2NhcmQtYWN0aXZlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChkYXRhLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgZGF0YVsnc2VsZWN0ZWRDYXJkJ10gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YVsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVBhc3N3b3JkVHlwZShmb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnRleHRUeXBlID09ICd0ZXh0Jykge1xuICAgICAgZm9ybUZpZWxkLnRleHRUeXBlID0gJ3Bhc3N3b3JkJztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUZpZWxkLnRleHRUeXBlID0gJ3RleHQnO1xuICAgIH1cbiAgfVxuICBvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbil7XG4gICAgaWYoIWxpbmsuZGlzYWJsZWQgJiYgIWZvcm1TZWN0aW9uLmRpc2FibGVkKXtcbiAgICAgIGxpbmsub25DbGljaygpO1xuICAgIH1cbiAgfVxuICBpc1ZhbGlkQ29sdW1uKGNvbDogYW55KXtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvbCkgJiYgY29sID4gMCAmJiBjb2wgPD0gMTJcbiAgfVxuIGFzeW5jIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoZXZlbnQpOiBQcm9taXNlPHZvaWQ+e1xuICBsZXQgaG92ZXJEYXRhIDpJT3ZlcmxheVBhbmVsRGF0YSA9IGV2ZW50Py5ob3ZlckRhdGE7XG4gIGxldCBvdmVybGF5UGFuZWw6IGFueSA9IGV2ZW50Py5vdmVybGF5UGFuZWw7XG4gIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpPT57XG4gICAgICBjb25zdCBkYXRhID0gey4uLmhvdmVyRGF0YT8uZGF0YX07XG4gICAgICBpZihPYmplY3Q/LmtleXMoZGF0YSk/Lmxlbmd0aCA+IDApe1xuICAgICAgICBjb25zdCBkYXRhS2V5cyA9IE9iamVjdD8ua2V5cyhob3ZlckRhdGE/LmRhdGEpO1xuICAgICAgICBpZihkYXRhS2V5cz8ubGVuZ3RoID4wICl7XG4gICAgICAgICAgZGF0YUtleXMuZm9yRWFjaChrZXk9PntcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYodmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCd7JykgJiYgdmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCd9Jykpe1xuICAgICAgICAgICAgICB2YXIgdmFsdWVUb0ZpbmQgPSB2YWx1ZS5yZXBsYWNlKCd7JywnJykucmVwbGFjZSgnfScsJycpO1xuICAgICAgICAgICAgICBkYXRhW2tleV09IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIHZhbHVlVG9GaW5kKTtcbiAgICAgICAgICAgIH1lbHNlIGlmKCF2YWx1ZSl7XG4gICAgICAgICAgICAgIHZhciBtYXRjaGVkS2V5VmFsdWUgPSB1dGlsaXRpZXMuZ2V0Rm9ybUZpZWxkVmFsdWUodGhpcy5mb3JtLCBrZXkpO1xuICAgICAgICAgICAgICBkYXRhW2tleV09bWF0Y2hlZEtleVZhbHVlOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhvdmVyRGF0YT8uc3R5bGUgPyAodGhpcy5vdmVybGF5UGFuZWxTdHlsZSA9IGhvdmVyRGF0YS5zdHlsZSkgOiAnJztcbiAgICAgIHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmOmFueSA9IHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KGhvdmVyRGF0YT8uY29tcG9uZW50KTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbXBvbmVudFJlZilcbiAgICAgIGlmKGhvdmVyRGF0YS5kYXRhKXtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZyA9IFtdO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnLmRhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgICAgb3ZlcmxheVBhbmVsLnNob3coZXZlbnQ/LmV2ZW50KTtcbiAgICAgIFxuICAgICB9KVxuICB9XG4gIG1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpe1xuICAgIG92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICB9XG5cbn1cblxuIiwiPHNlLXNwbGl0dGVyIFxuICAqbmdJZj1cInNwbGl0U2NyZWVuXCJcbiAgW2V4aXN0aW5nQ29tcG9uZW50XT1cInBhbmVsSW5mby5leGlzdGluZ0NvcG1vbmVudFwiIFxuICBbcGFuZWxDb21wb25lbnRdPVwicGFuZWxJbmZvLnBhbmVsQ29tcG9uZW50XCIgXG4gIFtjb25maWdEYXRhXT1cInBhbmVsSW5mby5jb25maWdEYXRhXCIgXG4gIChjbG9zZVBhbmVsRW1pdHRlcik9XCJjbG9zZVBhbmVsKClcIlxuPjwvc2Utc3BsaXR0ZXI+XG48cC1jb25maXJtRGlhbG9nIFtzdHlsZV09XCJ7IHdpZHRoOiAnNTB2dycgfVwiIGtleT1cImNhbmNlbEJ1dHRvblwiPjwvcC1jb25maXJtRGlhbG9nPlxuPGRpdiAjdmlld0NvbnRhaW5lckZvcm1SZWY+XG4gIDxmb3JtICpuZ0lmPVwiIWlzRm9ybUhpZGRlbiAmJiBmb3JtXCI+XG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXIgcC1wcm9ncmVzcy1zcGlubmVyLWNpcmNsZSBjdXN0b20tc3Bpbm5lclwiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAnZml4ZWQtaGVpZ2h0Jzogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZvcm1TZWN0aW9uIG9mIGZvcm0uZm9ybVNlY3Rpb25zXCIgW2NsYXNzXT1cIiFmb3JtU2VjdGlvbi5oaWRkZW4gPyAnY2FyZCB3LTEwMCcgOiAnJ1wiPlxuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjbGlja2VkU2VjdGlvbihmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZm9ybVNlY3Rpb24gPyAnJyA6IHNlY3Rpb25EaXNhYmxlZChmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2hpZGRlbicgOiBmb3JtU2VjdGlvbi5jbGFzc1wiPlxuICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBcbiAgICAgICAgICAgICAgICAgIFtoZWFkZXJdPVwiZm9ybVNlY3Rpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZm9ybVNlY3Rpb24uZXhwYW5kZWQgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvbiA/ICdoaWRlLWFjY29yZGlhbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaWNvblwiIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgY2xhc3M9XCJtci0xIHBsLTJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Vic2VjdGlvbi1oZWFkZXJcIj57eyBmb3JtU2VjdGlvbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1jb2wgZm9ybS1jb21wb25lbnQgYWNjb3JkaW9uLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb25cIiBmb3I9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uSGVhZGVyTmFtZSBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaWNvblwiIGNsYXNzPVwiXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4ge3sgZm9ybVNlY3Rpb24ubmFtZSB9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGluayBvZiBmb3JtU2VjdGlvbi5saW5rc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibXItMyBjdXN0b20tbGlua1wiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwibGluay5uYW1lICYmIWZvcm1TZWN0aW9uLmRpc2FibGVkJiYhbGluay5kaXNhYmxlZCAgPyAnY3VzdG9tLWxpbmsnIDogJ2Rpc2FibGVkLWxpbmsnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsaW5rLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyIGhlYWRlci1maWVsZHMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGhlYWRlckZpZWxkLmNvbnRyb2w9PT0nYWRkX2J1dHRvbic/ICcgZm9ybS1idXR0b24tZmllbGQtd3JhcHBlciAnOicnKStcbiAgICAgICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihoZWFkZXJGaWVsZC5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGhlYWRlckZpZWxkLmNvbHVtbiArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNWYWxpZENvbHVtbihmb3JtLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGhlYWRlckZpZWxkLmNvbHVtbiB8fCBmb3JtLmNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlckZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhlYWRlckZpZWxkIG9mIGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkczsgbGV0IGhlYWRlckZpZWxkSW5kZXggPSBpbmRleFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1N3aXRjaF09XCJoZWFkZXJGaWVsZC5jb250cm9sXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBIeXBlcmxpbmsgb24gbG9va3VwICBDb250cm9sIEZpZWxkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIFtvdmVybGF5UGFuZWxdPVwib3ZlcmxheVBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsRGlzcGxheV09XCJsYWJlbERpc3BsYXlcIiAob25Nb3VzZUVudGVyKT1cImFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KCRldmVudClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkxvYWRMYWJlbENvbnRyb2xJRnJhbWVDbGljayk9XCJsb2FkTGFiZWxDb250cm9sSUZyYW1lKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RMb29rdXBMYWJlbENsaWNrKT1cInNlbGVjdExvb2t1cExhYmVsKCRldmVudD8uZm9ybUZpZWxkLCAkZXZlbnQ/LmV2ZW50KVwiPjwvbGFiZWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbERpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImhlYWRlckZpZWxkLmxhYmVsLmljb25cIiBbY2xhc3NdPVwiaGVhZGVyRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmxhYmVsLmljb25cIj4ge3toZWFkZXJGaWVsZC5sYWJlbC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VQYXNzd29yZCk9XCJjaGFuZ2VQYXNzd29yZFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvaW5wdXQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1lcmljIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9udW1lcmljLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Bhc3N3b3JkLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3BhY2VyIENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNQQUNFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIj48L3NwYWNlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRBcmVhLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvdGV4dEFyZWEtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUFkZCBFZGl0b3IgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVF9FRElUT1JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lZGl0b3ItY29udHJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZS1lZGl0b3ItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbGVuZGFyIENvbnRyb2wtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWxlbmRhci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2FsZW5kYXJDaGFuZ2VWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvY2FsZW5kYXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5EUk9QRE9XTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3Bkb3duLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjbGVhckRyb3Bkb3duVmFsdWUoJGV2ZW50KVwiIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9kcm9wZG93bi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIiAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGktc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoeXBlcmxpbmstY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWZyYW1Mb2FkRXZlbnQpPVwibG9hZElGcmFtZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2h5cGVybGluay1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheSB0ZXh0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5ESVNQTEFZX1RFWFRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LXRleHQtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9kaXNwbGF5LXRleHQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKCRldmVudClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKCRldmVudClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgRW1haWwgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5FTUFJTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZW1haWwtZ2VuZXJhdGUtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1lbWFpbC1nZW5lcmF0ZS1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3toZWFkZXJGaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiaGVhZGVyRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJoZWFkZXJGaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzaXplV2lkdGhdPVwiaGVhZGVyRmllbGQucmVzaXplV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1jYXJkIFtjYXJkXT1cImhlYWRlckZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9zZS1jYXJkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGZvcm1GaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihmb3JtRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm1GaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShmb3JtRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZvcm1GaWVsZCBvZiBmb3JtU2VjdGlvbi5maWVsZHM7IGxldCBmb3JtRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmxhYmVsLmljb25cIj4ge3tmb3JtRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiZm9ybUZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvaW5wdXQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImZvcm1GaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdExvb2t1cCk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9udW1lcmljLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Bhc3N3b3JkLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbGVuZGFyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvY2FsZW5kYXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5ESVNQTEFZX1RFWFRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS10ZXh0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIj48L2Rpc3BsYXktdGV4dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkRST1BET1dOXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3Bkb3duLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAoa2V5dXBUYWIpPVwidGFiRm9jdXNFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQpXCIgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9kcm9wZG93bi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRvQ29tcGxldGUgU2VhcmNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9Db21wbGV0ZS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9hdXRvQ29tcGxldGUtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGktc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTVVMVElTRUxFQ1RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh5cGVybGluay1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkh5cGVybGlua0RpYWxvZ0NsaWNrKT1cImh5cGVybGlua0RpYWxvZygkZXZlbnQpXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZnJhbUxvYWRFdmVudCk9XCJsb2FkSUZyYW1lKGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2h5cGVybGluay1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkxPT0tVUF9JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKGZvcm1GaWVsZClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkZJTEVfVVBMT0FEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWZpbGUtdXBsb2FkIFthbGxvd011bHRpcGxlXT1cImZvcm1GaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJmb3JtRmllbGQuU2V0ZmlsZVR5cGVzXCIgW2ZpZWxkc109XCJmb3JtRmllbGRcIiBbcmVzaXplV2lkdGhdPVwiZm9ybUZpZWxkLnJlc2l6ZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVVcmwpPVwic2V0RmlsZVVybHMoJGV2ZW50KVwiIFtpc0F6dXJlVXBsb2FkXT1cImZvcm1GaWVsZC5pc0F6dXJlVXBsb2FkID09IGZhbHNlID8gZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZEZpbGVPblJldHVybik9XCJmaWxlT25jaGFuZ2VFdmVudCgpXCI+PC9zZS1maWxlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFTEVDVEJVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QtYnV0dG9uLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9zZWxlY3QtYnV0dG9uLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1jYXJkIFtjYXJkXT1cImZvcm1GaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmRDbGlja0V2ZW50KCRldmVudClcIj48L3NlLWNhcmQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSBEZXRhaWwgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGUtZGV0YWlsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKGZvcm1GaWVsZClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZm9ybUZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3tmb3JtRmllbGRJbmRleH19XCIgI2R5bmFtaWNDb21wb25lbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DT01QT05FTlRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNvbXBvbmVudC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiPjwvc2VjdGlvbi1oZWFkZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQUREX0JVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiPjwvYWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJmb3JtRmllbGRcIiBbbGFiZWxdPVwiZm9ybUZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImZvcm1GaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiZm9ybUZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImZvcm1GaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGZvcm1GaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJmb3JtRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJmb3JtRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImZvcm1GaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvcm1GaWVsZC5jbGFzc1wiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIEVtYWlsIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRU1BSUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lbWFpbC1nZW5lcmF0ZS1idG4gW3JlcEluZm9dPVwiZm9ybUZpZWxkXCIgW2xhYmVsXT1cImZvcm1GaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImZvcm1GaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJmb3JtRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBmb3JtRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJmb3JtRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQuY2xhc3NcIj48L3NlLWVtYWlsLWdlbmVyYXRlLWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBJbnB1dCBTd2l0Y2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEVkaXRvciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVF9FRElUT1JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZWRpdG9yLWNvbnRyb2wgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZS1lZGl0b3ItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgYWN0aW9ucy1idXR0b25zLW1haW4td3JhcHBlciBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiBbbmdDbGFzc109XCJ7IHN0aWNreTogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zdGlja3kgZm9ybS1jb21wb25lbnQgYWN0aW9ucy1idXR0b25zLXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVTYXZlQnV0dG9uXCIgW2Rpc2FibGVkXT1cInJlcXVlc3RTZXJ2aWNlLmlzU2F2ZURpc2FibGVkID8gcmVxdWVzdFNlcnZpY2UuaXNTYXZlRGlzYWJsZWQgOiBpc0Zvcm1EaXNhYmxlZFwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwic2F2ZUJ1dHRvbkxhYmVsID8gc2F2ZUJ1dHRvbkxhYmVsIDogJ1NhdmUnXCIgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGZvcm0tc2F2ZS1idXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2F2ZUZvcm0oKVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gY2xvc2UgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaGlkZUNhbmNlbEJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1EaXNhYmxlZFwiIChjbGljayk9XCJvbkNhbmNlbEZvcm0oKVwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiBbbGFiZWxdPVwiY2FuY2VsQnV0dG9uTGFiZWwgPyBjYW5jZWxCdXR0b25MYWJlbCA6ICdDYW5jZWwnXCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tZGFuZ2VyIG1sLTNcIj48L2J1dHRvbj5cbiAgICAgICAgICA8IS0tIGR5bmFtaWMgYnV0dG9ucyAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidXR0b24gb2YgZm9ybUJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhYnV0dG9uLmhpZGRlblwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCJidXR0b24ubGFiZWxcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJidXR0b24uaWNvbiA/IGJ1dHRvbi5pY29uIDogJydcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgbWwtM1wiIChjbGljayk9XCJvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8gYnV0dG9uLmRpc2FibGVkIDogZmFsc2VcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG4gIDxwLW92ZXJsYXlQYW5lbCBbc3R5bGVdPVwib3ZlcmxheVBhbmVsU3R5bGVcIiAjb3ZlcmxheVBhbmVsPlxuICAgIDxuZy1jb250YWluZXIgI3ZpZXdDb250YWluZXJSZWY+PC9uZy1jb250YWluZXI+XG4gIDwvcC1vdmVybGF5UGFuZWw+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhc3BsaXRTY3JlZW5cIj5cbiAgPGRpdiAjYXBwZW5kRm9ybT48L2Rpdj5cbjwvZGl2PiJdfQ==
|