@churchillliving/se-ui-toolkit 6.54.620 → 6.54.622
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 +3 -3
- package/esm2022/lib/components/base/sidebar/sidebar.component.mjs +3 -1
- package/esm2022/lib/components/shared/controls/lookup-control/lookup-control.component.mjs +3 -3
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +6 -4
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1490,11 +1490,11 @@ export class FormComponent {
|
|
|
1490
1490
|
overlayPanel?.hide();
|
|
1491
1491
|
}
|
|
1492
1492
|
/** @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 }); }
|
|
1493
|
-
/** @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 [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\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 (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\" \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: "component", type: i11.Header, selector: "p-header" }, { 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"], 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"] }] }); }
|
|
1493
|
+
/** @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 (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\" \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"], 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"] }] }); }
|
|
1494
1494
|
}
|
|
1495
1495
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, decorators: [{
|
|
1496
1496
|
type: Component,
|
|
1497
|
-
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 [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\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 (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\" \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"] }]
|
|
1497
|
+
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 (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\" \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"] }]
|
|
1498
1498
|
}], 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: [{
|
|
1499
1499
|
type: ViewChild,
|
|
1500
1500
|
args: ['viewContainerRef', { read: ViewContainerRef, static: true }]
|
|
@@ -1537,4 +1537,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1537
1537
|
type: HostListener,
|
|
1538
1538
|
args: ['window:beforeunload', ['$event']]
|
|
1539
1539
|
}] } });
|
|
1540
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3RDLE1BQU0sT0FBTyxhQUFhO0lBc0J4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pCLFFBQVEs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QW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDVyxrQkFBa0I7c0JBQTdELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTU8sY0FBYztzQkFBMUIsS0FBSztnQkFLSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFtRFAsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudEZhY3RvcnksIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBOZ1pvbmUsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBOb3Rlc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ub3Rlcy9ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRUZvcm1Db250cm9sLCBFSHlwZXJsaW5rLCBJRm9ybUZpZWxkLCBJRHluYW1pY0Zvcm0sIElGb3JtU2VjdGlvbiwgRVZhbGlkYXRvciwgSUR5bmFtaWNDYXJkLCBJRm9ybUJ1dHRvbiwgRUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBFUGVybWlzc2lvblR5cGUsIElQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3VzZXItaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb21tb24ubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgZHJhZ2dhYmxlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElPdmVybGF5UGFuZWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyUmVmJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzp0cnVlfSlcbiAgcHVibGljIHBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+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/LndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rPy5oZWlnaHQgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA6ICc4MCUnLFxuICAgICAgZGF0YTogeyB2YWx1ZTogZm9ybUZpZWxkLmh5cGVybGluaz8ubGluaywgaUZyYW1lSWQ6IGZvcm1GaWVsZC5sYWJlbCB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQpO1xuICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGlhbG9nIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBoeXBlcmxpbmtEaWFsb2coZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gdGhpcy5mb3JtU2VydmljZS5nZXRNYXRjaGVkUm91dGVCYXNlZE9uQ29tcG9uZW50KGV2ZW50LmZvcm1GaWVsZD8uaHlwZXJsaW5rPy5jb21wb25lbnQpO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW21hdGNoZWRSb3V0ZT8ucGF0aF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyxcbiAgICAgIH0pPy50b1N0cmluZygpO1xuXG4gICAgICB3aW5kb3c/Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5TRUxGKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLkRJQUxPRykge1xuICAgICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgIGlmICgoZXZlbnQgJiYgZXZlbnQuZXZlbnQuY3RybEtleSAmJiBmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCkgfHwgZm9ybUZpZWxkLm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LCBmb3JtRmllbGQuaHlwZXJsaW5rPy5wYXJhbXMpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIHtcbiAgICAgICAgICBoZWFkZXI6IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA6ICcnLFxuICAgICAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICcnLFxuICAgICAgICAgIHN0eWxlOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8ge30gOiB7ICdtYXgtd2lkdGgnOiAnZml0LWNvbnRlbnQnIH0sXG4gICAgICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICAgICAgZGF0YTogZm9ybUZpZWxkLmh5cGVybGluay5wYXJhbXMsXG4gICAgICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/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/IGRhdGEuZGF0YT8uaGVpZ2h0IDogJzkwdmgnLFxuICAgICAgICBjbG9zYWJsZTp0cnVlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgICAgZmllbGQ6IGZvcm1GaWVsZC5maWVsZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgdmFsdWVGaWVsZDogZGF0YS5kYXRhPy52YWx1ZUZpZWxkLFxuICAgICAgICAgIC4uLmRhdGEuZGF0YS5kYXRhXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/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+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZvcm1TZWN0aW9uIG9mIGZvcm0uZm9ybVNlY3Rpb25zXCIgW2NsYXNzXT1cIiFmb3JtU2VjdGlvbi5oaWRkZW4gPyAnY2FyZCB3LTEwMCcgOiAnJ1wiPlxuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjbGlja2VkU2VjdGlvbihmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZm9ybVNlY3Rpb24gPyAnJyA6IHNlY3Rpb25EaXNhYmxlZChmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2hpZGRlbicgOiBmb3JtU2VjdGlvbi5jbGFzc1wiPlxuICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwiZm9ybVNlY3Rpb24uZXhwYW5kZWQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb24gPyAnaGlkZS1hY2NvcmRpYW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBjbGFzcz1cIm1yLTEgcGwtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnNlY3Rpb24taGVhZGVyXCI+e3sgZm9ybVNlY3Rpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtY29sIGZvcm0tY29tcG9uZW50IGFjY29yZGlvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uXCIgZm9yPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbkhlYWRlck5hbWUgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmljb25cIiBjbGFzcz1cIlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+IHt7IGZvcm1TZWN0aW9uLm5hbWUgfX0gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpbmsgb2YgZm9ybVNlY3Rpb24ubGlua3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1yLTMgY3VzdG9tLWxpbmtcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImxpbmsubmFtZSAmJiFmb3JtU2VjdGlvbi5kaXNhYmxlZCYmIWxpbmsuZGlzYWJsZWQgID8gJ2N1c3RvbS1saW5rJyA6ICdkaXNhYmxlZC1saW5rJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGluay5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlciBoZWFkZXItZmllbGRzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihoZWFkZXJGaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oaGVhZGVyRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBoZWFkZXJGaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBoZWFkZXJGaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnY29sLTEyIG1kOmNvbC0zIGZsZXggZmxleC1jb2x1bW4nICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXJGaWVsZC5jb250cm9sID09PSAnYnJlYWtfbGluZScgPyAnYnJlYWstbGluZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXJGaWVsZCBvZiBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM7IGxldCBoZWFkZXJGaWVsZEluZGV4ID0gaW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiaGVhZGVyRmllbGQuY29udHJvbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsYWJlbENvbnRyb2wgSHlwZXJsaW5rIG9uIGxvb2t1cCAgQ29udHJvbCBGaWVsZC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbb3ZlcmxheVBhbmVsXT1cIm92ZXJsYXlQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudCgkZXZlbnQpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Mb2FkTGFiZWxDb250cm9sSUZyYW1lQ2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCIgW2NsYXNzXT1cImhlYWRlckZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+IHt7aGVhZGVyRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtZXJpYyBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OVU1FUklDXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5QQVNTV09SRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TUEFDRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBUZXh0QXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1BZGQgRWRpdG9yIENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRfRURJVE9SXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZWRpdG9yLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2UtZWRpdG9yLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciBDb250cm9sLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW2RlZmF1bHREYXRlXT1cImRlZmF1bHREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cImNhbGVuZGFySW5wdXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkcm9wZG93bi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwidGFiRm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKCRldmVudClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNsZWFyVmFsdWUoJGV2ZW50KVwiPjwvZHJvcGRvd24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9Db21wbGV0ZS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9hdXRvQ29tcGxldGUtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTVVMVElTRUxFQ1RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIeXBlcmxpbmstLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkh5cGVybGlua0RpYWxvZ0NsaWNrKT1cImh5cGVybGlua0RpYWxvZygkZXZlbnQpXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oeXBlcmxpbmstY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKCRldmVudClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKCRldmVudClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgRW1haWwgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5FTUFJTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZW1haWwtZ2VuZXJhdGUtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1lbWFpbC1nZW5lcmF0ZS1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3toZWFkZXJGaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiaGVhZGVyRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJoZWFkZXJGaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+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+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiZm9ybUZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImZvcm1GaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImZvcm1GaWVsZFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCIgW2lzQXp1cmVVcGxvYWRdPVwiZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgPT0gZmFsc2UgPyBmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+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
|
|
1540
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3RDLE1BQU0sT0FBTyxhQUFhO0lBc0J4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pCLFFBQVEs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QW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDVyxrQkFBa0I7c0JBQTdELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTU8sY0FBYztzQkFBMUIsS0FBSztnQkFLSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFtRFAsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudEZhY3RvcnksIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBOZ1pvbmUsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBOb3Rlc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ub3Rlcy9ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRUZvcm1Db250cm9sLCBFSHlwZXJsaW5rLCBJRm9ybUZpZWxkLCBJRHluYW1pY0Zvcm0sIElGb3JtU2VjdGlvbiwgRVZhbGlkYXRvciwgSUR5bmFtaWNDYXJkLCBJRm9ybUJ1dHRvbiwgRUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBFUGVybWlzc2lvblR5cGUsIElQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3VzZXItaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb21tb24ubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgZHJhZ2dhYmxlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElPdmVybGF5UGFuZWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyUmVmJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzp0cnVlfSlcbiAgcHVibGljIHBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+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/LndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rPy5oZWlnaHQgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA6ICc4MCUnLFxuICAgICAgZGF0YTogeyB2YWx1ZTogZm9ybUZpZWxkLmh5cGVybGluaz8ubGluaywgaUZyYW1lSWQ6IGZvcm1GaWVsZC5sYWJlbCB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQpO1xuICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGlhbG9nIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBoeXBlcmxpbmtEaWFsb2coZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gdGhpcy5mb3JtU2VydmljZS5nZXRNYXRjaGVkUm91dGVCYXNlZE9uQ29tcG9uZW50KGV2ZW50LmZvcm1GaWVsZD8uaHlwZXJsaW5rPy5jb21wb25lbnQpO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW21hdGNoZWRSb3V0ZT8ucGF0aF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyxcbiAgICAgIH0pPy50b1N0cmluZygpO1xuXG4gICAgICB3aW5kb3c/Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5TRUxGKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLkRJQUxPRykge1xuICAgICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgIGlmICgoZXZlbnQgJiYgZXZlbnQuZXZlbnQuY3RybEtleSAmJiBmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCkgfHwgZm9ybUZpZWxkLm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LCBmb3JtRmllbGQuaHlwZXJsaW5rPy5wYXJhbXMpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIHtcbiAgICAgICAgICBoZWFkZXI6IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuZGF0YT8uaGVhZGVyXG4gICAgICAgICAgICA6ICcnLFxuICAgICAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8gZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA6ICcnLFxuICAgICAgICAgIHN0eWxlOiBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoID8ge30gOiB7ICdtYXgtd2lkdGgnOiAnZml0LWNvbnRlbnQnIH0sXG4gICAgICAgICAgaGVpZ2h0OiBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICAgICAgZGF0YTogZm9ybUZpZWxkLmh5cGVybGluay5wYXJhbXMsXG4gICAgICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgICAgY2xvc2FibGU6dHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/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/IGRhdGEuZGF0YT8uaGVpZ2h0IDogJzkwdmgnLFxuICAgICAgICBjbG9zYWJsZTp0cnVlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgICAgZmllbGQ6IGZvcm1GaWVsZC5maWVsZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgdmFsdWVGaWVsZDogZGF0YS5kYXRhPy52YWx1ZUZpZWxkLFxuICAgICAgICAgIC4uLmRhdGEuZGF0YS5kYXRhXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/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+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2h5cGVybGluay1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkxPT0tVUF9JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoJGV2ZW50KVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUxFQ1RCVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QtYnV0dG9uLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvc2VsZWN0LWJ1dHRvbi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSBEZXRhaWwgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlLWRldGFpbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coJGV2ZW50KVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBjb21wb25lbnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIj48L3NlY3Rpb24taGVhZGVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFERF9CVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIj48L2FkZC1idXR0b24tY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gW3JlcEluZm9dPVwiaGVhZGVyRmllbGRcIiBbbGFiZWxdPVwiaGVhZGVyRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoZWFkZXJGaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiaGVhZGVyRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJoZWFkZXJGaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGhlYWRlckZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJoZWFkZXJGaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyRmllbGQuY2xhc3NcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBFbWFpbCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkVNQUlMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lbWFpbC1nZW5lcmF0ZS1idG4gW3JlcEluZm9dPVwiaGVhZGVyRmllbGRcIiBbbGFiZWxdPVwiaGVhZGVyRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoZWFkZXJGaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiaGVhZGVyRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJoZWFkZXJGaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGhlYWRlckZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJoZWFkZXJGaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyRmllbGQuY2xhc3NcIj48L3NlLWVtYWlsLWdlbmVyYXRlLWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBJbnB1dCBTd2l0Y2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNXSVRDSFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9JbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2hlYWRlckZpZWxkSW5kZXh9fVwiICNkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DT01QT05FTlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBVcGxvYWQgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5GSUxFX1VQTE9BRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaGVhZGVyRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXJGaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoaGVhZGVyRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBbYWxsb3dNdWx0aXBsZV09XCJoZWFkZXJGaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImhlYWRlckZpZWxkLlNldGZpbGVUeXBlc1wiIFtmaWVsZHNdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1jYXJkIFtjYXJkXT1cImhlYWRlckZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9zZS1jYXJkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGZvcm1GaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihmb3JtRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm1GaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShmb3JtRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZvcm1GaWVsZCBvZiBmb3JtU2VjdGlvbi5maWVsZHM7IGxldCBmb3JtRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmxhYmVsLmljb25cIj4ge3tmb3JtRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiZm9ybUZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvaW5wdXQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImZvcm1GaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdExvb2t1cCk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9udW1lcmljLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Bhc3N3b3JkLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbGVuZGFyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvY2FsZW5kYXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5EUk9QRE9XTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkcm9wZG93bi1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInRhYkZvY3VzRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjbGVhckRyb3Bkb3duVmFsdWUoZm9ybUZpZWxkKVwiIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNsZWFyVmFsdWUoJGV2ZW50KVwiPjwvZHJvcGRvd24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvQ29tcGxldGUtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvYXV0b0NvbXBsZXRlLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9tdWx0aXNlbGVjdC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIeXBlcmxpbmstLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkhZUEVSTElOS1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoeXBlcmxpbmstY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25IeXBlcmxpbmtEaWFsb2dDbGljayk9XCJoeXBlcmxpbmtEaWFsb2coJGV2ZW50KVwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWZyYW1Mb2FkRXZlbnQpPVwibG9hZElGcmFtZShmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oeXBlcmxpbmstY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9va3VwLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAoa2V5dXBUYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyTG9va3VwVmFsdWUpPVwibG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQpXCI+PC9sb29rdXAtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBVcGxvYWQgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5GSUxFX1VQTE9BRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBbYWxsb3dNdWx0aXBsZV09XCJmb3JtRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRGaWxlVHlwZXNdPVwiZm9ybUZpZWxkLlNldGZpbGVUeXBlc1wiIFtmaWVsZHNdPVwiZm9ybUZpZWxkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIiBbaXNBenVyZVVwbG9hZF09XCJmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA9PSBmYWxzZSA/IGZvcm1GaWVsZC5pc0F6dXJlVXBsb2FkIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUxFQ1RCVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvc2VsZWN0LWJ1dHRvbi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgIENhcmQgZmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJmb3JtRmllbGQuY2FyZFwiIFtzZXRDYXJkRGF0YV09XCJzZXRDYXJkRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9zZS1jYXJkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTk9URV9GSUVMRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlLWRldGFpbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtRmllbGQpXCI+PC9ub3RlLWRldGFpbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIENvbXBvbmVudCBDb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImZvcm1GaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInt7Zm9ybVNlY3Rpb24ubmFtZX19LXt7Zm9ybUZpZWxkSW5kZXh9fVwiICNkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBjb21wb25lbnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24taGVhZGVyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIj48L3NlY3Rpb24taGVhZGVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBPbkNsaWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFERF9CVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L2FkZC1idXR0b24tY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlJFUE9SVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gW3JlcEluZm9dPVwiZm9ybUZpZWxkXCIgW2xhYmVsXT1cImZvcm1GaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImZvcm1GaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJmb3JtRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBmb3JtRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJmb3JtRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQuY2xhc3NcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBFbWFpbCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkVNQUlMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZW1haWwtZ2VuZXJhdGUtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1lbWFpbC1nZW5lcmF0ZS1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBFZGl0b3IgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRfRURJVE9SXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVkaXRvci1jb250cm9sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2UtZWRpdG9yLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIHNhdmUgYW5kIGNsb3NlIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGFjdGlvbnMtYnV0dG9ucy1tYWluLXdyYXBwZXIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgW25nQ2xhc3NdPVwieyBzdGlja3k6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc3RpY2t5IGZvcm0tY29tcG9uZW50IGFjdGlvbnMtYnV0dG9ucy13cmFwcGVyLWRpdlwiPlxuICAgICAgICAgIDwhLS0gc2F2ZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlU2F2ZUJ1dHRvblwiIFtkaXNhYmxlZF09XCJyZXF1ZXN0U2VydmljZS5pc1NhdmVEaXNhYmxlZCA/IHJlcXVlc3RTZXJ2aWNlLmlzU2F2ZURpc2FibGVkIDogaXNGb3JtRGlzYWJsZWRcIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInNhdmVCdXR0b25MYWJlbCA/IHNhdmVCdXR0b25MYWJlbCA6ICdTYXZlJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBmb3JtLXNhdmUtYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNhdmVGb3JtKClcIj48L2J1dHRvbj5cbiAgICAgICAgICA8IS0tIGNsb3NlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVDYW5jZWxCdXR0b25cIiBbZGlzYWJsZWRdPVwiaXNGb3JtRGlzYWJsZWRcIiAoY2xpY2spPVwib25DYW5jZWxGb3JtKClcIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgW2xhYmVsXT1cImNhbmNlbEJ1dHRvbkxhYmVsID8gY2FuY2VsQnV0dG9uTGFiZWwgOiAnQ2FuY2VsJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBtbC0zXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBkeW5hbWljIGJ1dHRvbnMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGZvcm1CdXR0b25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWJ1dHRvbi5oaWRkZW5cIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiYnV0dG9uLmljb24gPyBidXR0b24uaWNvbiA6ICcnXCIgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIG1sLTNcIiAoY2xpY2spPVwib25OZXdCdXR0b25DbGljayhidXR0b24pXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZCA/IGJ1dHRvbi5kaXNhYmxlZCA6IGZhbHNlXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuICA8cC1vdmVybGF5UGFuZWwgW3N0eWxlXT1cIm92ZXJsYXlQYW5lbFN0eWxlXCIgI292ZXJsYXlQYW5lbD5cbiAgICA8bmctY29udGFpbmVyICN2aWV3Q29udGFpbmVyUmVmPjwvbmctY29udGFpbmVyPlxuICA8L3Atb3ZlcmxheVBhbmVsPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiIXNwbGl0U2NyZWVuXCI+XG4gIDxkaXYgI2FwcGVuZEZvcm0+PC9kaXY+XG48L2Rpdj4iXX0=
|