@firestitch/report 18.18.0 → 18.18.2

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.
Files changed (18) hide show
  1. package/app/reports/dialogs/global-settings/global-settings.component.d.ts +2 -6
  2. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -2
  3. package/app/reports/views/report/fs-ai-report.component.d.ts +1 -0
  4. package/esm2022/app/reports/dialogs/global-settings/components/ai-knowledge/ai-knowledge.component.mjs +8 -6
  5. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +3 -3
  6. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +32 -51
  7. package/esm2022/app/reports/dialogs/instruction-history/instruction-history.component.mjs +5 -5
  8. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +3 -11
  9. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +13 -4
  10. package/fesm2022/{firestitch-report-echarts-qh_mqik9.mjs → firestitch-report-echarts-DKuqS_De.mjs} +2 -2
  11. package/fesm2022/{firestitch-report-echarts-qh_mqik9.mjs.map → firestitch-report-echarts-DKuqS_De.mjs.map} +1 -1
  12. package/fesm2022/{firestitch-report-firestitch-report-D-WG_G5d.mjs → firestitch-report-firestitch-report-CkTkXk5B.mjs} +63 -103
  13. package/fesm2022/firestitch-report-firestitch-report-CkTkXk5B.mjs.map +1 -0
  14. package/fesm2022/firestitch-report.mjs +1 -1
  15. package/package.json +1 -1
  16. package/app/reports/dialogs/global-settings/components/general/general.component.d.ts +0 -8
  17. package/esm2022/app/reports/dialogs/global-settings/components/general/general.component.mjs +0 -34
  18. package/fesm2022/firestitch-report-firestitch-report-D-WG_G5d.mjs.map +0 -1
@@ -18,7 +18,6 @@ import { FsFormModule } from '@firestitch/form';
18
18
  import { FsLabelModule } from '@firestitch/label';
19
19
  import { FsMaskModule } from '@firestitch/mask';
20
20
  import { FsMessage, FsMessageModule } from '@firestitch/message';
21
- import { FsProcess } from '@firestitch/process';
22
21
  import { FsPrompt } from '@firestitch/prompt';
23
22
  import { FsSkeletonModule } from '@firestitch/skeleton';
24
23
  import { FsTabsModule } from '@firestitch/tabs';
@@ -184,7 +183,6 @@ export class ReportSettingsComponent {
184
183
  _reportData = inject(ReportData);
185
184
  _message = inject(FsMessage);
186
185
  _prompt = inject(FsPrompt);
187
- _process = inject(FsProcess);
188
186
  _destroyRef = inject(DestroyRef);
189
187
  _injector = inject(Injector);
190
188
  _document = inject(DOCUMENT);
@@ -256,12 +254,6 @@ export class ReportSettingsComponent {
256
254
  this._refusedInputId = null;
257
255
  }
258
256
  }
259
- // The report as a package (.report.zip) that another server imports as a
260
- // new report. The file is written server-side and downloads through the
261
- // FsProcess dock, so the dialog stays open.
262
- exportPackage() {
263
- this._process.download('Exporting report package', this._reportData.exportPackage(this._data.report.id));
264
- }
265
257
  // Confirm and delete here, while the dialog is still open, then close with
266
258
  // a `deleted` result. The page reacts to the result; it no longer owns the
267
259
  // prompt or the API call.
@@ -497,7 +489,7 @@ export class ReportSettingsComponent {
497
489
  }
498
490
  }
499
491
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
500
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n (click)=\"exportPackage()\">\n Export\n </button>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i2.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { kind: "directive", type: i2.FsFormMaxDirective, selector: "[fsFormMax]", inputs: ["fsFormMax", "fsFormMaxMessage"] }, { kind: "directive", type: i2.FsFormMaxLengthDirective, selector: "[fsFormMaxLength]", inputs: ["fsFormMaxLength", "fsFormMaxLengthMessage"] }, { kind: "directive", type: i2.FsFormPatternDirective, selector: "[fsFormPattern]", inputs: ["fsFormPattern", "fsFormPatternMessage"] }, { kind: "directive", type: i2.FsFormValidateDirective, selector: "[validate]", inputs: ["validate", "validateData", "validateOnSubmit"] }, { kind: "component", type: i2.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i2.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "ngmodule", type: FsMaskModule }, { kind: "directive", type: i4.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i5.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsMessageModule }, { kind: "component", type: i6.FsMessageInfoComponent, selector: "fs-message-info" }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i7.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i7.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i8.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i9.FsDatePickerComponent, selector: "[fsDatePicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "startOfDay", "view", "format", "minutes", "width"], outputs: ["change"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i10.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i10.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: TimezoneSelectComponent, selector: "fs-ai-report-timezone-select", inputs: ["placeholder", "required", "disabled", "timezone"], outputs: ["timezoneChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
492
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i2.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { kind: "directive", type: i2.FsFormMaxDirective, selector: "[fsFormMax]", inputs: ["fsFormMax", "fsFormMaxMessage"] }, { kind: "directive", type: i2.FsFormMaxLengthDirective, selector: "[fsFormMaxLength]", inputs: ["fsFormMaxLength", "fsFormMaxLengthMessage"] }, { kind: "directive", type: i2.FsFormPatternDirective, selector: "[fsFormPattern]", inputs: ["fsFormPattern", "fsFormPatternMessage"] }, { kind: "directive", type: i2.FsFormValidateDirective, selector: "[validate]", inputs: ["validate", "validateData", "validateOnSubmit"] }, { kind: "component", type: i2.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i2.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "ngmodule", type: FsMaskModule }, { kind: "directive", type: i4.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i5.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsMessageModule }, { kind: "component", type: i6.FsMessageInfoComponent, selector: "fs-message-info" }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i7.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i7.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i8.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i9.FsDatePickerComponent, selector: "[fsDatePicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "startOfDay", "view", "format", "minutes", "width"], outputs: ["change"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i10.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i10.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: TimezoneSelectComponent, selector: "fs-ai-report-timezone-select", inputs: ["placeholder", "required", "disabled", "timezone"], outputs: ["timezoneChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
501
493
  }
502
494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSettingsComponent, decorators: [{
503
495
  type: Component,
@@ -526,7 +518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
526
518
  MatOption,
527
519
  MatSlideToggle,
528
520
  TimezoneSelectComponent,
529
- ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n (click)=\"exportPackage()\">\n Export\n </button>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"] }]
521
+ ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"] }]
530
522
  }] });
531
523
  // The group as the server now stores it, once an update carrying `changes`
532
524
  // is taken.
@@ -548,4 +540,4 @@ function labelInputId(groupId) {
548
540
  function nameInputId(groupId) {
549
541
  return `filterName${groupId}`;
550
542
  }
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBVSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQzVHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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LENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5qZWN0b3IsIE9uSW5pdCwgYWZ0ZXJOZXh0UmVuZGVyLCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdExhYmVsLCBNYXRIaW50LCBNYXRTdWZmaXggfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0T3B0aW9uLCBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuXG5pbXBvcnQgeyBEaXNwbGF5QXBpRXJyb3IgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuaW1wb3J0IHsgRnNBdXRvY29tcGxldGVDaGlwc01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2F1dG9jb21wbGV0ZS1jaGlwcyc7XG5pbXBvcnQgeyBGc0RhdGVQaWNrZXJNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlcGlja2VyJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcbmltcG9ydCB7IEZzTWFza01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21hc2snO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBGc01lc3NhZ2VNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGFic01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3RhYnMnO1xuXG5pbXBvcnQgeyBUaW1lem9uZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGltZXpvbmUtc2VsZWN0L3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZmluYWxpemUsIHN3aXRjaE1hcCwgdGFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBhcGlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9hcGktZXJyb3ItbWVzc2FnZSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBEQVlfU0hPUlQsXG4gIFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWSxcbiAgY3VycmVuY3lOYW1lLFxuICBmb3JtYXRMb2NhbERhdGUsXG4gIGZvcm1hdE51bWJlcixcbiAgbG9jYWxlTmFtZSxcbiAgcmVzb2x2ZVJlcG9ydEN1cnJlbmN5LFxuICByZXNvbHZlUmVwb3J0TG9jYWxlLFxufSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRMb2NhbGVzLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBIRUFERVJfRk9PVEVSX01BWCwgUEFHRV9ESU1FTlNJT05fTUFYLCBQQUdFX0RJTUVOU0lPTl9NSU4gfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgZGF0ZUZyb21Cb3VuZCwgZGF0ZVRvQm91bmQsIGxvYWRHcm91cE9wdGlvbnMsIG1hdGNoT3B0aW9ucywgcmVsYXRpdmVMYWJlbCwgcmVzb2x2ZU9wdGlvblZhbHVlcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0JPVU5EX1NDQUxFLFxuICBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfUEFUVEVSTixcbiAgRklMVEVSX05BTUVfUEFUVEVSTl9NRVNTQUdFLFxuICBGSVhFRF9EQVRFU19QRVJJT0QsXG4gIGJvdW5kc0Vycm9yLFxuICBkYXRlUmFuZ2VEZWZhdWx0LFxuICBkZWZhdWx0Q2hhbmdlZCxcbiAgZGVmYXVsdFBlcmlvZCxcbiAgZGVmYXVsdFBlcmlvZE9wdGlvbnMsXG4gIGRlZmF1bHRSb3dHcm91cHMsXG4gIGRlZmF1bHRSb3dMYWJlbCxcbiAgbnVtYmVyUmFuZ2VEZWZhdWx0LFxuICBwYXJzZURlZmF1bHRCb3VuZCxcbiAgc2VsZWN0RGVmYXVsdCxcbiAgc2hvd0V4Y2x1ZGVUb2dnbGUsXG59IGZyb20gJy4uLy4uL2ZpbHRlci1zZXR0aW5ncy1ydWxlcyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXR0aW5nc09wdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyLXNldHRpbmdzLW9wdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyByZXBvcnRMb2NhbGVQYXRjaCB9IGZyb20gJy4vcmVwb3J0LWxvY2FsZS1wYXRjaCc7XG5cblxuLy8gV2hhdCB0aGUgZGlhbG9nIGhhbmRzIGJhY2sgd2hlbiBpdCBjbG9zZXMsIHNvIHRoZSBwYWdlIGtub3dzIHdoYXQgaGFwcGVuZWRcbi8vIHdpdGhvdXQgc25pZmZpbmcgbWFnaWMgc3RyaW5ncy4gQSBkaXNtaXNzZWQgZGlhbG9nIGNsb3NlcyB3aXRoIGB1bmRlZmluZWRgLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB7XG4gIGFjdGlvbjogJ3NhdmVkJyB8ICdkZWxldGVkJztcbn1cblxuXG4vLyBBIE5hbWUgb3IgTGFiZWwgdGhlIHNlcnZlciByZWZ1c2VkIGZvciBhIGZpbHRlciBncm91cCwgd2l0aCB0aGUgbWVzc2FnZSBpdFxuLy8gZ2F2ZS5cbmludGVyZmFjZSBGaWx0ZXJGaWVsZFJlZnVzYWwge1xuICB2YWx1ZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8vIE9uZSByZXBvcnQgYmFyIGZpbHRlciBpbiB0aGUgRmlsdGVycyB0YWI6IGl0cyBncm91cCwgaXRzIGxhYmVsIGFuZCBuYW1lLFxuLy8gYW5kIGFuIGVkaXRhYmxlIGRyYWZ0IGRlZmF1bHQuIFRoZSBkcmFmdCBmaWVsZHMgdXNlZCBkZXBlbmQgb24gdGhlIHR5cGVcbi8vIChkYXRlUmFuZ2Ug4oaSIGEgRGVmYXVsdCBwZXJpb2QsIHdoaWNoIGlzIGEgcmVsYXRpdmUgcmFuZ2Ugb3IgRml4ZWQgZGF0ZXNcbi8vIHdpdGggc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlcywga2VwdCBvciBsZWZ0IG91dDsga2V5d29yZCDihpIgdGV4dDtcbi8vIG51bWJlclJhbmdlIOKGkiBtaW4gYW5kIG1heCkuIGBmZXRjaGAgbG9hZHMgdGhlIHNlbGVjdCBvcHRpb25zIHRoZSBzYW1lIHdheVxuLy8gdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICAvLyBUaGUgc2VjdGlvbiBoZWFkaW5nOiB0aGUgbGFiZWwsIHdpdGggdGhlIHBhZ2UgZm9yIGEgcGFnZSBmaWx0ZXIuXG4gIGhlYWRpbmc6IHN0cmluZztcbiAgLy8gVGhlIGdyb3VwJ3MgbGFiZWwgYW5kIG5hbWUgYXMgdHlwZWQsIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEVhY2ggaXNcbiAgLy8gc2F2ZWQgb25seSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgc3RvcmVkIG9uZTsgdGhlIG5hbWUgaXMgbmV2ZXJcbiAgLy8gZGVyaXZlZCBmcm9tIHRoZSBsYWJlbCBoZXJlLlxuICBsYWJlbDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIFRoZSBzZXJ2ZXIgc2VudCBhIG5hbWUsIHNvIGl0IGFsc28gdGFrZXMgYSBsYWJlbCBhbmQgYSBuYW1lIG9uIHRoZSBncm91cFxuICAvLyB1cGRhdGUgKGFuIG9sZGVyIHNlcnZlciBzZW5kcyBub25lLCBhbmQgdGhlIHR3byBmaWVsZHMgYXJlIGhpZGRlbikuXG4gIHNob3dOYW1lOiBib29sZWFuO1xuICAvLyBUaGUgbGFzdCBsYWJlbCBhbmQgbmFtZSB0aGUgc2VydmVyIHJlZnVzZWQsIGVhY2ggc2hvd24gb24gaXRzIGZpZWxkXG4gIC8vIHdoaWxlIHRoZSBmaWVsZCBzdGlsbCBob2xkcyBpdC5cbiAgbGFiZWxSZWZ1c2FsOiBGaWx0ZXJGaWVsZFJlZnVzYWwgfCBudWxsO1xuICBuYW1lUmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbDtcbiAgLy8gQSByZWxhdGl2ZSByYW5nZSBuYW1lLCBvciBGSVhFRF9EQVRFU19QRVJJT0QgZm9yIHN0YXJ0IGFuZCBlbmQuXG4gIHBlcmlvZDogc3RyaW5nO1xuICBwZXJpb2RPcHRpb25zOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgLy8gVGhlIHZhbHVlcyBhcmUgbGVmdCBvdXQgcmF0aGVyIHRoYW4ga2VwdC5cbiAgZXhjbHVkZTogYm9vbGVhbjtcbiAgc2hvd0V4Y2x1ZGU6IGJvb2xlYW47XG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8vIFRoZSByYW5nZSBlbmRzIGFzIHR5cGVkOiBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0LiBSZWFkIHRocm91Z2hcbiAgLy8gcGFyc2VEZWZhdWx0Qm91bmQuXG4gIG1pbjogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbWF4OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG59XG5cbi8vIE9uZSBmaWx0ZXIncyBncm91cCB1cGRhdGUgaW4gYSBzYXZlOiBvbmx5IHRoZSBrZXlzIHRoZSBvcGVyYXRvciBjaGFuZ2VkLlxuaW50ZXJmYWNlIEZpbHRlckdyb3VwU2F2ZSB7XG4gIHJvdzogRmlsdGVyRGVmYXVsdFJvdztcbiAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzO1xufVxuXG4vLyBPbmUgZW50cnkgb2YgdGhlIExvY2FsZSBvciBDdXJyZW5jeSBzZWxlY3QuICcnIGlzIHRoZSBleHBsaWNpdCBEZWZhdWx0LlxuaW50ZXJmYWNlIExvY2FsZVNlbGVjdE9wdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8vIFRoZSBkYXkgdGhlIExvY2FsZSBoaW50IHdyaXRlcywgYSBmaXhlZCBjYWxlbmRhciBkYXkgc28gdGhlIGV4YW1wbGUgbmV2ZXJcbi8vIGNoYW5nZXMgdW5kZXIgdGhlIG9wZXJhdG9yLlxuY29uc3QgRVhBTVBMRV9EQVkgPSBuZXcgRGF0ZSgyMDI2LCAwLCA1KTtcbmNvbnN0IEVYQU1QTEVfQU1PVU5UID0gMTIzNC41O1xuXG4vLyAnQ2FuYWRpYW4gRnJlbmNoIChmci1DQSknLCAnQ2FuYWRpYW4gRG9sbGFyIChDQUQpJzogRW5nbGlzaCBuYW1lcyB3aGF0ZXZlclxuLy8gdGhlIHJlcG9ydCdzIGxvY2FsZSwgd2l0aCB0aGUgY29kZSB0aGF0IGlzIHN0b3JlZC5cbmZ1bmN0aW9uIGxvY2FsZUxhYmVsKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2FsZU5hbWUodGFnKX0gKCR7dGFnfSlgO1xufVxuXG5mdW5jdGlvbiBjdXJyZW5jeUxhYmVsKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjdXJyZW5jeU5hbWUoY29kZSl9ICgke2NvZGV9KWA7XG59XG5cblxuLy8gUmVwb3J0IHNldHRpbmdzLCBpbiB0aHJlZSB0YWJzOlxuLy8gICBTZXR0aW5ncyDigJQgbmFtZSArIHBhZ2Ugc2V0dXAgKHNpemUgaW4gaW5jaGVzLCBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzKS5cbi8vICAgU3R5bGVzICAg4oCUIHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBzdHlsZXMgKHNpemVzIGluIFBPSU5UUywgMToxIHdpdGhcbi8vICAgUERGL1Bvd2VyUG9pbnQpOyB0aGUgSGVhZGluZyBzaXplIHRvIHN0YXJ0LlxuLy8gICBGaWx0ZXJzICDigJQgdGhlIHJlcG9ydCBiYXIgZmlsdGVycyAoZXZlcnkgcGFnZSBvciBvbmUgcGFnZSkgYW5kIHRoZWlyXG4vLyAgIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHQgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5XG4vLyAgIHZpZXdlcikgYnV0IHN0YXlzIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0XG4vLyAgIGxvY2sgaXQuIFRoaXMgaXMgdGhlIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhXG4vLyAgIGRlZmF1bHQgbW9udGggKyBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbi8vICAgVGhlIHJ1bGVzIG9mIHRoZSByb3dzIGxpdmUgaW4gZmlsdGVyLXNldHRpbmdzLXJ1bGVzLnRzLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNNZXNzYWdlTW9kdWxlLFxuICAgIEZzVGFic01vZHVsZSxcbiAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIEZzRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlLFxuICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdERpYWxvZ1RpdGxlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0SGludCxcbiAgICBNYXRTdWZmaXgsXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBUaW1lem9uZVNlbGVjdENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEEgc2lnbmFsLCBzbyBhIHJlZnVzZWQgTGFiZWwgb3IgTmFtZSBjYW4gYnJpbmcgdGhlIEZpbHRlcnMgdGFiIGZvcndhcmQuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFRhYiA9IHNpZ25hbCgnc2V0dGluZ3MnKTtcbiAgLy8gVHJ1ZSBvbmNlIGFueSBzYXZlIHJlcXVlc3QgaGFzIGJlZW4gc3RvcmVkLCBldmVuIHdoZW4gdGhlIHNhdmUgYXMgYVxuICAvLyB3aG9sZSB0aGVuIGZhaWxlZDogdGhlIHBhZ2UgcmVsb2FkcyBhZnRlciBhIGRpc21pc3NlZCBkaWFsb2cgdG9vLlxuICBwdWJsaWMgcmVhZG9ubHkgd3JvdGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHB1YmxpYyBuYW1lID0gJyc7XG4gIC8vIFRoZSBwYWdlIGluIGluY2hlcy4gTm8gaW5pdGlhbGl6ZXI6IGV2ZXJ5IHJlcG9ydCBjYXJyaWVzIGEgc2l6ZSwgYW5kXG4gIC8vIG5nT25Jbml0IHNlZWRzIGJvdGggYmVmb3JlIHRoZSB0YWIgcmVuZGVycywgc28gYSBwbGFjZWhvbGRlciBoZXJlIGNvdWxkIG9ubHlcbiAgLy8gZXZlciBiZSBhIHdyb25nIG51bWJlciBicmllZmx5IHNob3dpbmcgYXMgdGhlIG9wZXJhdG9yJ3Mgb3duLlxuICAvL1xuICAvLyBUeXBlZCBgbnVtYmVyIHwgc3RyaW5nYCBiZWNhdXNlIGZzTWFza051bWJlciBpcyB0aGUgY29udHJvbDogaXQgaXMgc2VlZGVkXG4gIC8vIHdpdGggdGhlIHJlcG9ydCdzIG51bWJlciBidXQgaGFuZHMgYmFjayB0aGUgdW5tYXNrZWQgU1RSSU5HIHRoZSBvcGVyYXRvclxuICAvLyB0eXBlZC4gU2F2ZSBjYXN0cyBpdCBvbmNlLCBvbiB0aGUgd2F5IG91dCDigJQgc2VlIGBfcGFnZURpbWVuc2lvbigpYC5cbiAgcHVibGljIHBhZ2VXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcGFnZUhlaWdodDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZURpbWVuc2lvbk1pbiA9IFBBR0VfRElNRU5TSU9OX01JTjtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VEaW1lbnNpb25NYXggPSBQQUdFX0RJTUVOU0lPTl9NQVg7XG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kIGRlcHRocywgaW5jaGVzIOKAlCB0eXBlZCBsaWtlIHRoZSBwYWdlIHNpemVcbiAgLy8gYmVjYXVzZSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayBhIHN0cmluZy5cbiAgcHVibGljIGhlYWRlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIGZvb3RlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlckZvb3Rlck1heCA9IEhFQURFUl9GT09URVJfTUFYO1xuICAvLyBTZWVkZWQgd2l0aCB0aGUgem9uZSB0aGUgcmVwb3J0IGFjdHVhbGx5IHVzZXM6IGl0cyBvd24gc3RvcmVkIHpvbmUsIGVsc2VcbiAgLy8gdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQgdGhlIHNlcnZlciByZXNvbHZlZCAoZWZmZWN0aXZlVGltZXpvbmUpLiBTYXZlIHNlbmRzXG4gIC8vIGl0IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhhdCBlZmZlY3RpdmUgem9uZSwgc28gb3BlbmluZyBhbmQgc2F2aW5nIGFcbiAgLy8gcmVwb3J0IHRoYXQgZm9sbG93cyB0aGUgZGVmYXVsdCBuZXZlciBwaW5zIGl0IHRvIGEgem9uZS5cbiAgcHVibGljIHRpbWV6b25lID0gJyc7XG4gIHB1YmxpYyBoZWFkaW5nU2l6ZSA9IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gIC8vIFRoZSBsb2NhbGVzIGFuZCBjdXJyZW5jaWVzIHRoZSBzZXJ2ZXIgb2ZmZXJzLiBudWxsIHVudGlsIGxvYWRlZCwgYW5kXG4gIC8vIG5ldmVyIGxvYWRlZCBmcm9tIGEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZCBlZmZlY3RpdmVMb2NhbGU6IHRoZXJlIHRoZVxuICAvLyBzZWxlY3RzIHN0YXkgaGlkZGVuIGFuZCB0aGUgcmVwb3J0IHJlYWRzIGVuLVVTL1VTRC5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXMgPSBzaWduYWw8UmVwb3J0TG9jYWxlcyB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgcmVwb3J0J3Mgb3duIGxvY2FsZSBhbmQgY3VycmVuY3ksICcnIHdoZW4gaXQgZm9sbG93cyB0aGUgZGVmYXVsdC4gU2F2ZVxuICAvLyBzZW5kcyBlYWNoIG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW5jeSA9IHNpZ25hbCgnJyk7XG4gIC8vIFRoZSB3aG9sZSBmb3JtIHdhaXRzIGJlaGluZCBvbmUgc2tlbGV0b24gdW50aWwgdGhlIGZpbHRlciByb3dzIGFyZSBidWlsdFxuICAvLyBhbmQgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBzZXR0bGVkLCBzbyB0aGUgU2V0dGluZ3MgdGFiIG5ldmVyIHNob3dzXG4gIC8vIHdpdGhvdXQgaXRzIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0cy4gQSBmYWlsZWQgbG9jYWxlIHJlcXVlc3Qgc2V0dGxlc1xuICAvLyB0b286IHRoZSB0d28gc2VsZWN0cyBzdGF5IGhpZGRlbiAobG9jYWxlcygpIGlzIHN0aWxsIG51bGwpIGFuZCBldmVyeSBvdGhlclxuICAvLyBzZXR0aW5nIHN0YXlzIGVkaXRhYmxlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVhZHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJzUmVhZHkoKSAmJiAoIXRoaXMuX3NlcnZlckhhc0xvY2FsZSB8fCB0aGlzLl9sb2NhbGVzU2V0dGxlZCgpKSk7XG5cbiAgLy8gQW4gZXhwbGljaXQgRGVmYXVsdCAoJycpIG5hbWluZyB0aGUgbG9jYWxlIGl0IHN0YW5kcyBmb3IsIHRoZW4gZWFjaCBvZmZlcmVkXG4gIC8vIGxvY2FsZS4gQSBzdG9yZWQgbG9jYWxlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIG9mZmVycyBpcyBsaXN0ZWQgZmlyc3QsIHNvXG4gIC8vIHRoZSBzZWxlY3Qgc3RpbGwgc2hvd3Mgd2hhdCB0aGUgcmVwb3J0IGhvbGRzLlxuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlT3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZmVyZWQgPSBsb2NhbGVzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuX3N0b3JlZE9wdGlvbih0aGlzLl9kYXRhLnJlcG9ydC5sb2NhbGUsIG9mZmVyZWQsIGxvY2FsZUxhYmVsKSxcbiAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogYERlZmF1bHQg4oCUICR7bG9jYWxlTmFtZShsb2NhbGVzLmRlZmF1bHRMb2NhbGUpfWAgfSxcbiAgICAgIC4uLm9mZmVyZWQubWFwKCh0YWcpID0+ICh7IHZhbHVlOiB0YWcsIGxhYmVsOiBsb2NhbGVMYWJlbCh0YWcpIH0pKSxcbiAgICBdO1xuICB9KTtcblxuICAvLyBBbiBleHBsaWNpdCBEZWZhdWx0ICgnJykgbmFtaW5nIHRoZSBjdXJyZW5jeSB0aGUgc2VsZWN0ZWQgbG9jYWxlIHVzZXMgd2hlblxuICAvLyB0aGUgcmVwb3J0IG5hbWVzIG5vbmUsIHRoZW4gZXZlcnkgY3VycmVuY3kuIEEgc3RvcmVkIGNvZGUgdGhlIHNlcnZlciBub1xuICAvLyBsb25nZXIgb2ZmZXJzIGlzIGxpc3RlZCBmaXJzdC5cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbmN5T3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLl9zdG9yZWRPcHRpb24odGhpcy5fZGF0YS5yZXBvcnQuY3VycmVuY3ksIGxvY2FsZXMuY3VycmVuY2llcywgY3VycmVuY3lMYWJlbCksXG4gICAgICB7IHZhbHVlOiAnJywgbGFiZWw6IGBEZWZhdWx0IOKAlCAke2N1cnJlbmN5TGFiZWwodGhpcy5fZGVmYXVsdEN1cnJlbmN5KCkpfWAgfSxcbiAgICAgIC4uLmxvY2FsZXMuY3VycmVuY2llcy5tYXAoKGNvZGUpID0+ICh7IHZhbHVlOiBjb2RlLCBsYWJlbDogY3VycmVuY3lMYWJlbChjb2RlKSB9KSksXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gSG93IHRoZSByZXBvcnQgd2lsbCB3cml0ZSBhbiBhbW91bnQgYW5kIGEgZGF5IG9uY2Ugc2F2ZWQ6IHRoZSBzZWxlY3RlZFxuICAvLyBsb2NhbGUgYW5kIGN1cnJlbmN5LCBvciB0aGUgZGVmYXVsdHMgdGhleSBmYWxsIGJhY2sgdG8sIGUuZy5cbiAgLy8gJzEgMjM0LDUwICQgwrcgNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdEV4YW1wbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZVJlcG9ydExvY2FsZSh0aGlzLl9hcHBsaWVkTG9jYWxlKCkpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHRoaXMuX2FwcGxpZWRDdXJyZW5jeSgpKTtcblxuICAgIHJldHVybiBbXG4gICAgICBmb3JtYXROdW1iZXIoXG4gICAgICAgIEVYQU1QTEVfQU1PVU5ULFxuICAgICAgICB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3ksIHByZWNpc2lvbjogMiB9LFxuICAgICAgICB7IGxvY2FsZSwgY3VycmVuY3ksIHJhdGlvUGVyY2VudDogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGZvcm1hdExvY2FsRGF0ZShFWEFNUExFX0RBWSwgbG9jYWxlLCBEQVlfU0hPUlQpLFxuICAgIF0uam9pbignIMK3ICcpO1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0IGJhciBmaWx0ZXJzIGFuZCB0aGVpciBlZGl0YWJsZSBkZWZhdWx0IHZhbHVlcyAoRmlsdGVycyB0YWIpLlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyUm93cyA9IHNpZ25hbDxGaWx0ZXJEZWZhdWx0Um93W10+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkRGF0ZXNQZXJpb2QgPSBGSVhFRF9EQVRFU19QRVJJT0Q7XG4gIHB1YmxpYyByZWFkb25seSBib3VuZFNjYWxlID0gREVGQVVMVF9CT1VORF9TQ0FMRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuID0gRklMVEVSX05BTUVfUEFUVEVSTjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuTWVzc2FnZSA9IEZJTFRFUl9OQU1FX1BBVFRFUk5fTUVTU0FHRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVNYXhMZW5ndGggPSBGSUxURVJfTkFNRV9NQVhfTEVOR1RIO1xuICBwdWJsaWMgcmVhZG9ubHkgbGFiZWxNYXhMZW5ndGggPSBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSDtcbiAgcHVibGljIHJlYWRvbmx5IGxhYmVsSW5wdXRJZCA9IGxhYmVsSW5wdXRJZDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVJbnB1dElkID0gbmFtZUlucHV0SWQ7XG5cbiAgLy8gVGhlIERlZmF1bHQgbWluaW11bSBhbmQgRGVmYXVsdCBtYXhpbXVtIGNoZWNrcywgdGhyb3VnaCBmc0Zvcm0uIEVhY2ggZmllbGRcbiAgLy8gZ2V0cyB0aGUgb3RoZXIgZW5kIGFzIGl0cyB2YWxpZGF0ZURhdGEsIHNvIHR5cGluZyBpbiBvbmUgY2hlY2tzIHRoZSBwYWlyXG4gIC8vIGFnYWluOyBib3VuZHNFcnJvciB3b3JkcyB0aGUgcmVmdXNhbCBhcyB0aGUgc2VydmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtaW5Cb3VuZFZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1heDogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX3Rocm93Qm91bmRzRXJyb3IoY29udHJvbC52YWx1ZSwgbWF4KTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWF4Qm91bmRWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtaW46IHVua25vd24pOiB2b2lkID0+IHtcbiAgICB0aGlzLl90aHJvd0JvdW5kc0Vycm9yKG1pbiwgY29udHJvbC52YWx1ZSk7XG4gIH07XG5cbiAgLy8gVGhlIHNlcnZlcidzIHJlZnVzYWwgb2YgYSBMYWJlbCBvciBOYW1lLCB0aHJvdWdoIGZzRm9ybS4gVGhlIHNoYXBlIGFuZFxuICAvLyBsZW5ndGggYXJlIGNoZWNrZWQgb24gdGhlIGZpZWxkIChmc0Zvcm1QYXR0ZXJuLCBmc0Zvcm1NYXhMZW5ndGgpLCBidXQgb25seVxuICAvLyB0aGUgc2VydmVyIGtub3dzIHRoZSByZXBvcnQncyBvdGhlciBuYW1lcywgc28gdGhlIGZpZWxkIHNob3dzIHRoZVxuICAvLyBzZXJ2ZXIncyBvd24gd29yZHMgd2hpbGUgaXQgc3RpbGwgaG9sZHMgdGhlIHJlZnVzZWQgdmFsdWUuIEEgbmV3IHJlZnVzYWxcbiAgLy8gYXJyaXZlcyBhcyB0aGUgZmllbGQncyB2YWxpZGF0ZURhdGEsIHdoaWNoIGNoZWNrcyB0aGUgZmllbGQgYWdhaW4uXG4gIHB1YmxpYyByZWFkb25seSByZWZ1c2FsVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIGlmIChyZWZ1c2FsICYmIFN0cmluZyhjb250cm9sLnZhbHVlID8/ICcnKS50cmltKCkgPT09IHJlZnVzYWwudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZWZ1c2FsLm1lc3NhZ2UpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiB7IHJlcG9ydDogUmVwb3J0IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIC8vIFRoZSBpZCBvZiB0aGUgTGFiZWwgb3IgTmFtZSBpbnB1dCB0aGUgc2VydmVyIGxhc3QgcmVmdXNlZCwgZm9jdXNlZCBvbmNlXG4gIC8vIGl0IGlzIG9uIHNjcmVlbiAoc2VlIGZvY3VzUmVmdXNhbCkuXG4gIHByaXZhdGUgX3JlZnVzZWRJbnB1dElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLy8gT25seSBhIHNlcnZlciB0aGF0IHJlc29sdmVzIGEgcmVwb3J0J3MgbG9jYWxlIG9mZmVycyB0aGUgbG9jYWxlIGxpc3QuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlcnZlckhhc0xvY2FsZSA9IHRoaXMuX2RhdGEucmVwb3J0LmVmZmVjdGl2ZUxvY2FsZSAhPT0gdW5kZWZpbmVkO1xuICAvLyBUcnVlIG9uY2UgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBhbnN3ZXJlZCwgd2l0aCB0aGUgbGlzdCBvciBhbiBlcnJvci5cbiAgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxlc1NldHRsZWQgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBUcnVlIG9uY2UgdGhlIGZpbHRlciByb3dzIGFyZSBwdWJsaXNoZWQgKHNlZSBfYnVpbGRGaWx0ZXJSb3dzKS5cbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyc1JlYWR5ID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgbG9jYWxlIHRoZSByZXBvcnQgd291bGQgYmUgd3JpdHRlbiBpbjogdGhlIHNlbGVjdGVkIG9uZSB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgb2ZmZXJzIGl0LCBlbHNlIHRoZSBkZWZhdWx0IChhIHN0b3JlZCBsb2NhbGUgaXQgbm8gbG9uZ2VyIG9mZmVyc1xuICAvLyBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0LCBhcyBpdCBkb2VzIG9uIHRoZSBzZXJ2ZXIpLlxuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBsaWVkTG9jYWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZXMgPSB0aGlzLmxvY2FsZXMoKTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmxvY2FsZSgpO1xuXG4gICAgcmV0dXJuIGxvY2FsZXM/Lm9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiBvcHRpb24ubG9jYWxlID09PSBsb2NhbGUpXG4gICAgICA/IGxvY2FsZVxuICAgICAgOiBsb2NhbGVzPy5kZWZhdWx0TG9jYWxlID8/ICcnO1xuICB9KTtcblxuICAvLyBUaGUgY3VycmVuY3kgYSByZXBvcnQgaW4gdGhlIGFwcGxpZWQgbG9jYWxlIHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLlxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0Q3VycmVuY3kgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5fYXBwbGllZExvY2FsZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jYWxlcygpPy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmxvY2FsZSA9PT0gbG9jYWxlKT8uZGVmYXVsdEN1cnJlbmN5XG4gICAgICA/PyBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH0pO1xuXG4gIC8vIFRoZSBjdXJyZW5jeSB0aGUgcmVwb3J0IHdvdWxkIGxhYmVsIG1vbmV5IGluOiB0aGUgc2VsZWN0ZWQgb25lIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBvZmZlcnMgaXQsIGVsc2UgdGhlIGRlZmF1bHQuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FwcGxpZWRDdXJyZW5jeSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW5jeSA9IHRoaXMuY3VycmVuY3koKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2FsZXMoKT8uY3VycmVuY2llcy5pbmNsdWRlcyhjdXJyZW5jeSlcbiAgICAgID8gY3VycmVuY3lcbiAgICAgIDogdGhpcy5fZGVmYXVsdEN1cnJlbmN5KCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9kYXRhLnJlcG9ydDtcbiAgICB0aGlzLm5hbWUgPSByZXBvcnQubmFtZTtcbiAgICB0aGlzLnBhZ2VXaWR0aCA9IHJlcG9ydC5wYWdlV2lkdGg7XG4gICAgdGhpcy5wYWdlSGVpZ2h0ID0gcmVwb3J0LnBhZ2VIZWlnaHQ7XG4gICAgdGhpcy5oZWFkZXJIZWlnaHQgPSByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXI/LmhlYWRlckhlaWdodCA/PyAwO1xuICAgIHRoaXMuZm9vdGVySGVpZ2h0ID0gcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyPy5mb290ZXJIZWlnaHQgPz8gMDtcbiAgICB0aGlzLnRpbWV6b25lID0gcmVwb3J0LnRpbWV6b25lID8/IHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/PyAnJztcbiAgICB0aGlzLmhlYWRpbmdTaXplID0gcmVwb3J0LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xuICAgIHRoaXMubG9jYWxlLnNldChyZXBvcnQubG9jYWxlID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbmN5LnNldChyZXBvcnQuY3VycmVuY3kgPz8gJycpO1xuXG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydCk7XG5cbiAgICBpZiAodGhpcy5fc2VydmVySGFzTG9jYWxlKSB7XG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmxvY2FsZXMoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGxvY2FsZXMpID0+IHRoaXMubG9jYWxlcy5zZXQobG9jYWxlcykpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLFxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuX2xvY2FsZXNTZXR0bGVkLnNldCh0cnVlKSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGNoYW5nZSB0byBhIHJvdydzIExhYmVsLCBOYW1lLCBEZWZhdWx0IHBlcmlvZCwgZXhjbHVkZSB0b2dnbGUgb3IgcmFuZ2UgZW5kcy4gQSBuZXdcbiAgLy8gcm93IG9iamVjdCByYXRoZXIgdGhhbiBhIG11dGF0aW9uLCBzbyB0aGUgc2lnbmFsIHNlZXMgdGhlIGNoYW5nZTsgdGhlXG4gIC8vIEBmb3IgdHJhY2tzIGdyb3VwLmlkLCBzbyB0aGUgcm93J3MgY29udHJvbHMgc3Vydml2ZSB0aGUgc3dhcC5cbiAgcHVibGljIHBhdGNoUm93KHJvdzogRmlsdGVyRGVmYXVsdFJvdywgcGF0Y2g6IFBhcnRpYWw8RmlsdGVyRGVmYXVsdFJvdz4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclJvd3MudXBkYXRlKChyb3dzKSA9PiByb3dzXG4gICAgICAubWFwKChpdGVtKSA9PiAoaXRlbS5ncm91cC5pZCA9PT0gcm93Lmdyb3VwLmlkID8geyAuLi5pdGVtLCAuLi5wYXRjaCB9IDogaXRlbSkpKTtcbiAgfVxuXG4gIC8vIEZvY3VzZXMgdGhlIExhYmVsIG9yIE5hbWUgaW5wdXQgdGhlIHNlcnZlciByZWZ1c2VkLCBvbmNlIGl0IGlzIG9uXG4gIC8vIHNjcmVlbjogc3RyYWlnaHQgYWZ0ZXIgdGhlIHJlZnVzYWwgd2hlbiB0aGUgRmlsdGVycyB0YWIgaXMgc2hvd2luZywgZWxzZVxuICAvLyB3aGVuIHRoZSB0YWIgZ3JvdXAgaGFzIGJyb3VnaHQgaXQgZm9yd2FyZC5cbiAgcHVibGljIGZvY3VzUmVmdXNhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX3JlZnVzZWRJbnB1dElkID8gdGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fcmVmdXNlZElucHV0SWQpIDogbnVsbDtcblxuICAgIGlmIChpbnB1dCkge1xuICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIHRoaXMuX3JlZnVzZWRJbnB1dElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0IGFzIGEgcGFja2FnZSAoLnJlcG9ydC56aXApIHRoYXQgYW5vdGhlciBzZXJ2ZXIgaW1wb3J0cyBhcyBhXG4gIC8vIG5ldyByZXBvcnQuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gc2VydmVyLXNpZGUgYW5kIGRvd25sb2FkcyB0aHJvdWdoIHRoZVxuICAvLyBGc1Byb2Nlc3MgZG9jaywgc28gdGhlIGRpYWxvZyBzdGF5cyBvcGVuLlxuICBwdWJsaWMgZXhwb3J0UGFja2FnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgJ0V4cG9ydGluZyByZXBvcnQgcGFja2FnZScsXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFBhY2thZ2UodGhpcy5fZGF0YS5yZXBvcnQuaWQpLFxuICAgICk7XG4gIH1cblxuICAvLyBDb25maXJtIGFuZCBkZWxldGUgaGVyZSwgd2hpbGUgdGhlIGRpYWxvZyBpcyBzdGlsbCBvcGVuLCB0aGVuIGNsb3NlIHdpdGhcbiAgLy8gYSBgZGVsZXRlZGAgcmVzdWx0LiBUaGUgcGFnZSByZWFjdHMgdG8gdGhlIHJlc3VsdDsgaXQgbm8gbG9uZ2VyIG93bnMgdGhlXG4gIC8vIHByb21wdCBvciB0aGUgQVBJIGNhbGwuXG4gIHB1YmxpYyBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdEZWxldGUgUmVwb3J0JyxcbiAgICAgIHRlbXBsYXRlOiBgRGVsZXRlIFwiJHt0aGlzLl9kYXRhLnJlcG9ydC5uYW1lfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZSh0aGlzLl9kYXRhLnJlcG9ydC5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgZGVsZXRlZCcpO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdkZWxldGVkJyB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLl9kYXRhLnJlcG9ydC5pZDtcblxuICAgIC8vIE9uZSBTYXZlIGNvdmVycyBhbGwgdGhyZWUgdGFicy4gVGhlIHJlcG9ydCByZWxvYWRzIG9uIHRoZSBgc2F2ZWRgXG4gICAgLy8gcmVzdWx0LCByZS1zZWVkaW5nIHRoZSBiYXIgZnJvbSB0aGUgbmV3IGRlZmF1bHRzLlxuICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgcGFnZVdpZHRoOiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMucGFnZVdpZHRoKSxcbiAgICAgIHBhZ2VIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5wYWdlSGVpZ2h0KSxcbiAgICAgIC4uLnRoaXMuX3RpbWV6b25lU2V0dGluZygpLFxuICAgICAgLi4ucmVwb3J0TG9jYWxlUGF0Y2godGhpcy5fZGF0YS5yZXBvcnQsIHRoaXMubG9jYWxlKCksIHRoaXMuY3VycmVuY3koKSksXG4gICAgICBzdHlsZXM6IHsgaGVhZGluZzogeyBzaXplOiB0aGlzLmhlYWRpbmdTaXplIH0gfSxcbiAgICAgIGhlYWRlckZvb3Rlcjoge1xuICAgICAgICBoZWFkZXJIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5oZWFkZXJIZWlnaHQpIHx8IDAsXG4gICAgICAgIGZvb3RlckhlaWdodDogdGhpcy5fcGFnZURpbWVuc2lvbih0aGlzLmZvb3RlckhlaWdodCkgfHwgMCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIE9uZSBncm91cCB1cGRhdGUgcGVyIGNoYW5nZWQgZmlsdGVyLCBjYXJyeWluZyBvbmx5IHdoYXQgY2hhbmdlZDogaXRzXG4gICAgLy8gbGFiZWwsIG5hbWUgYW5kIGRlZmF1bHQgYWxsIGxpdmUgaW4gdGhlIGdyb3VwJ3MgY29uZmlnLCBzbyB0d28gcmVxdWVzdHNcbiAgICAvLyBmb3Igb25lIGdyb3VwIHdvdWxkIGVhY2ggd3JpdGUgdGhlIGNvbmZpZyBvdmVyIHRoZSBvdGhlci5cbiAgICBjb25zdCBzYXZlcyA9IHRoaXMuZmlsdGVyUm93cygpXG4gICAgICAubWFwKChyb3cpID0+ICh7IHJvdywgY2hhbmdlczogdGhpcy5fZ3JvdXBDaGFuZ2VzKHJvdykgfSkpXG4gICAgICAuZmlsdGVyKChzYXZlKSA9PiBPYmplY3Qua2V5cyhzYXZlLmNoYW5nZXMpLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gQSBsYWJlbCBvciBuYW1lIGNhbiBiZSByZWZ1c2VkLCBzbyB0aG9zZSB1cGRhdGVzIGdvIGZpcnN0LCBvbmUgYWZ0ZXJcbiAgICAvLyBhbm90aGVyLCBhbmQgYSByZWZ1c2FsIHN0b3BzIHRoZSBzYXZlIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIHdyaXR0ZW46XG4gICAgLy8gdGhlIHJlcG9ydCBzZXR0aW5ncyBhbmQgdGhlIG90aGVyIGRlZmF1bHRzIHdhaXQgdW50aWwgZXZlcnkgbmFtZSBpc1xuICAgIC8vIHRha2VuLiBJbiBzZXF1ZW5jZSwgdHdvIHJlbmFtZXMgaW4gb25lIHNhdmUgYXJlIGNoZWNrZWQgYWdhaW5zdCBlYWNoXG4gICAgLy8gb3RoZXIsIGFuZCBhIHJlbmFtZSBvbnRvIGEgbmFtZSBhbm90aGVyIGZpbHRlciBpcyBnaXZpbmcgdXAgZ29lcyBhZnRlclxuICAgIC8vIGl0LiBUaGUgc2VydmVyIGFwcGxpZXMgbmFtZSBiZWZvcmUgZGVmYXVsdCwgc28gYSByZWZ1c2VkIG5hbWUgbGVhdmVzXG4gICAgLy8gdGhhdCBmaWx0ZXIncyBkZWZhdWx0IHVud3JpdHRlbiB0b28uXG4gICAgY29uc3QgbmFtZWQgPSB0aGlzLl9yZW5hbWVPcmRlcihzYXZlcy5maWx0ZXIoKHNhdmUpID0+IHRoaXMuX25hbWVzT3JMYWJlbHMoc2F2ZS5jaGFuZ2VzKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gc2F2ZXMuZmlsdGVyKChzYXZlKSA9PiAhdGhpcy5fbmFtZXNPckxhYmVscyhzYXZlLmNoYW5nZXMpKTtcblxuICAgIHJldHVybiBmcm9tKG5hbWVkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNvbmNhdE1hcCgoc2F2ZSkgPT4gdGhpcy5fc2F2ZU5hbWVkKHJlcG9ydElkLCBzYXZlKSksXG4gICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZShyZXBvcnRJZCwgc2V0dGluZ3MpLFxuICAgICAgICAgIC4uLmRlZmF1bHRzLm1hcCgoc2F2ZSkgPT4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGaWx0ZXJHcm91cChyZXBvcnRJZCwgc2F2ZS5yb3cuZ3JvdXAuaWQsIHNhdmUuY2hhbmdlcykpLFxuICAgICAgICBdLm1hcCgocmVxdWVzdCQpID0+IHJlcXVlc3QkLnBpcGUodGFwKCgpID0+IHRoaXMud3JvdGUuc2V0KHRydWUpKSkpKSksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgc2V0dGluZ3Mgc2F2ZWQnKTtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlZCcgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfTtcblxuICAvLyBUaGUgcGFnZSBkaW1lbnNpb24gYXMgYSByZWFsIG51bWJlciBmb3IgdGhlIHdpcmUuIGZzTWFza051bWJlciBoYW5kcyBiYWNrXG4gIC8vIHRoZSB1bm1hc2tlZCBzdHJpbmcgaXQgYnVpbHQgd2l0aCBhIGZpeGVkICcuJyByYWRpeCAod2hpY2ggaXMgdGhlIHdob2xlXG4gIC8vIHBvaW50IG9mIHRoZSBtYXNrIC0gYSBuYXRpdmUgbnVtYmVyIGlucHV0IHBhaW50cyB0aGUgdmlld2VyJ3MgbG9jYWxlXG4gIC8vIHNlcGFyYXRvciBpbnN0ZWFkKSwgc28gdGhlIGNhc3QgaGVyZSBpcyBhIHN0cmFpZ2h0IHBhcnNlIGFuZCBuZXZlciBzZWVzIGFcbiAgLy8gY29tbWEuIFRoZSBiYWNrZW5kIHJlamVjdHMgYW55dGhpbmcgbm9uLW51bWVyaWMgcmF0aGVyIHRoYW4gY29lcmNpbmcsIHNvIGFcbiAgLy8gTmFOIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHN0b3JpbmcgYSB3cm9uZyBwYWdlIHNpemUuXG4gIHByaXZhdGUgX3BhZ2VEaW1lbnNpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgLy8gVGhlIHpvbmUgZm9yIHRoZSBzZXR0aW5ncyBQVVQsIHNlbnQgb25seSB3aGVuIGl0IG1vdmVzIHRoZSByZXBvcnQgb2ZmIHRoZVxuICAvLyB6b25lIGl0IGFscmVhZHkgdXNlcywgc28gYW4gdW50b3VjaGVkIGRpYWxvZyBuZXZlciBwaW5zIGEgcmVwb3J0IHRoYXRcbiAgLy8gZm9sbG93cyB0aGUgYXBwbGljYXRpb24gZGVmYXVsdC4gQSBzZXJ2ZXIgdG9vIG9sZCB0byBzZW5kXG4gIC8vIGVmZmVjdGl2ZVRpbWV6b25lIGdldHMgdGhlIHpvbmUgZXZlcnkgdGltZSwgYXMgaXQgYWx3YXlzIGRpZC5cbiAgcHJpdmF0ZSBfdGltZXpvbmVTZXR0aW5nKCk6IHsgdGltZXpvbmU/OiBzdHJpbmcgfSB7XG4gICAgY29uc3QgZWZmZWN0aXZlVGltZXpvbmUgPSB0aGlzLl9kYXRhLnJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZTtcblxuICAgIHJldHVybiBlZmZlY3RpdmVUaW1lem9uZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudGltZXpvbmUgIT09IGVmZmVjdGl2ZVRpbWV6b25lXG4gICAgICA/IHsgdGltZXpvbmU6IHRoaXMudGltZXpvbmUgfVxuICAgICAgOiB7fTtcbiAgfVxuXG4gIC8vIFRoZSBzdG9yZWQgdmFsdWUgYXMgaXRzIG93biBvcHRpb24gd2hlbiB0aGUgc2VydmVyIG5vIGxvbmdlciBvZmZlcnMgaXQsIHNvXG4gIC8vIHRoZSBzZWxlY3QgbmFtZXMgaXQgaW5zdGVhZCBvZiBzaG93aW5nIGJsYW5rLiBMZWZ0IGFzIGl0IGlzLCBpdCBpcyBuZXZlclxuICAvLyBzZW50IChzZWUgcmVwb3J0TG9jYWxlUGF0Y2gpLCBhbmQgdGhlIHJlcG9ydCByZWFkcyB0aGUgZGVmYXVsdCBtZWFud2hpbGUuXG4gIHByaXZhdGUgX3N0b3JlZE9wdGlvbihcbiAgICBzdG9yZWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgb2ZmZXJlZDogc3RyaW5nW10sXG4gICAgbGFiZWw6ICh2YWx1ZTogc3RyaW5nKSA9PiBzdHJpbmcsXG4gICk6IExvY2FsZVNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gc3RvcmVkICYmICFvZmZlcmVkLmluY2x1ZGVzKHN0b3JlZCkgPyBbeyB2YWx1ZTogc3RvcmVkLCBsYWJlbDogbGFiZWwoc3RvcmVkKSB9XSA6IFtdO1xuICB9XG5cbiAgLy8gV2hhdCBhIHNhdmUgY2hhbmdlcyBvbiBhIHJvdydzIGdyb3VwOiB0aGUgbGFiZWwsIG5hbWUgYW5kIGRlZmF1bHQsIGVhY2hcbiAgLy8gb25seSB3aGVuIHRoZSBvcGVyYXRvciBjaGFuZ2VkIGl0LiBMYWJlbCBhbmQgbmFtZSBhcmUgc2VudCBvbmx5IHRvIGFcbiAgLy8gc2VydmVyIHRoYXQgc2VudCBhIG5hbWUsIGFuZCBuZXZlciBvbmUgZnJvbSB0aGUgb3RoZXIuXG4gIHByaXZhdGUgX2dyb3VwQ2hhbmdlcyhyb3c6IEZpbHRlckRlZmF1bHRSb3cpOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMge1xuICAgIGNvbnN0IGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyA9IHt9O1xuXG4gICAgaWYgKHJvdy5zaG93TmFtZSkge1xuICAgICAgY29uc3QgbGFiZWwgPSByb3cubGFiZWwudHJpbSgpO1xuICAgICAgaWYgKGxhYmVsICE9PSAocm93Lmdyb3VwLmxhYmVsID8/ICcnKSkge1xuICAgICAgICBjaGFuZ2VzLmxhYmVsID0gbGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByb3cubmFtZS50cmltKCk7XG4gICAgICBpZiAobmFtZSAhPT0gcm93Lmdyb3VwLm5hbWUpIHtcbiAgICAgICAgY2hhbmdlcy5uYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb3dEZWZhdWx0ID0gdGhpcy5fcm93RGVmYXVsdChyb3cpO1xuICAgIGlmIChkZWZhdWx0Q2hhbmdlZChyb3cuZ3JvdXAuY29uZmlnPy5kZWZhdWx0LCByb3dEZWZhdWx0KSkge1xuICAgICAgY2hhbmdlcy5kZWZhdWx0ID0gcm93RGVmYXVsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgX25hbWVzT3JMYWJlbHMoY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoYW5nZXMubmFtZSAhPT0gdW5kZWZpbmVkIHx8IGNoYW5nZXMubGFiZWwgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFRoZSB1cGRhdGVzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBzZW50OiBhIHJlbmFtZSBvbnRvIGEgbmFtZSBhbm90aGVyXG4gIC8vIGZpbHRlciBob2xkcyBnb2VzIGFmdGVyIHRoZSBvdGhlcnMsIHNvIGEgZmlsdGVyIGdpdmluZyB0aGF0IG5hbWUgdXAgaW5cbiAgLy8gdGhlIHNhbWUgc2F2ZSBoYXMgZG9uZSBzbyBmaXJzdC5cbiAgcHJpdmF0ZSBfcmVuYW1lT3JkZXIoc2F2ZXM6IEZpbHRlckdyb3VwU2F2ZVtdKTogRmlsdGVyR3JvdXBTYXZlW10ge1xuICAgIGNvbnN0IGhlbGQgPSAoc2F2ZTogRmlsdGVyR3JvdXBTYXZlKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2F2ZS5jaGFuZ2VzLm5hbWU/LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJSb3dzKClcbiAgICAgICAgLnNvbWUoKHJvdykgPT4gcm93Lmdyb3VwLmlkICE9PSBzYXZlLnJvdy5ncm91cC5pZCAmJiByb3cuZ3JvdXAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gbmFtZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBbLi4uc2F2ZXNdLnNvcnQoKGEsIGIpID0+IE51bWJlcihoZWxkKGEpKSAtIE51bWJlcihoZWxkKGIpKSk7XG4gIH1cblxuICAvLyBTYXZlcyBhIGZpbHRlcidzIHVwZGF0ZSB0aGF0IGNhcnJpZXMgYSBsYWJlbCBvciBuYW1lLiBBIHJlZnVzYWwgaXMgdGhlXG4gIC8vIHNlcnZlcidzIHRvIHdvcmQgKCdOYW1lIFwicmVnaW9uXCIgaXMgYWxyZWFkeSB1c2VkIGJ5IHRoZSBmaWx0ZXJcbiAgLy8gXCJBcmVhXCIuJyksIHNvIGl0IHNob3dzIG9uIHRoZSBmaWVsZCByYXRoZXIgdGhhbiBpbiBhIGRpYWxvZywgYW5kIHRoZSBzYXZlXG4gIC8vIGZhaWxzLiBXaGF0IHdhcyBzYXZlZCBiZWNvbWVzIHRoZSByb3cncyBzdG9yZWQgZ3JvdXAsIHNvIGEgbGF0ZXIgc2F2ZVxuICAvLyBkb2VzIG5vdCBzZW5kIGl0IGFnYWluLlxuICBwcml2YXRlIF9zYXZlTmFtZWQocmVwb3J0SWQ6IG51bWJlciwgc2F2ZTogRmlsdGVyR3JvdXBTYXZlKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyByb3csIGNoYW5nZXMgfSA9IHNhdmU7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGaWx0ZXJHcm91cChcbiAgICAgIHJlcG9ydElkLFxuICAgICAgcm93Lmdyb3VwLmlkLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0sXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy53cm90ZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5wYXRjaFJvdyhyb3csIHsgZ3JvdXA6IHN0b3JlZEdyb3VwKHJvdy5ncm91cCwgY2hhbmdlcykgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRoaXMuX3Nob3dSZWZ1c2FsKHJvdywgY2hhbmdlcywgYXBpRXJyb3JNZXNzYWdlKGVycm9yLCAnVGhlIGZpbHRlciBjb3VsZCBub3QgYmUgc2F2ZWQuJykpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBTaG93cyBhIHJlZnVzYWwgb24gdGhlIGZpZWxkIGl0IGlzIGFib3V0ICh0aGUgbmFtZSwgd2hpY2ggdGhlIHNlcnZlclxuICAvLyBjaGVja3MgZmlyc3QsIGVsc2UgdGhlIGxhYmVsKSwgYnJpbmdzIHRoZSBGaWx0ZXJzIHRhYiBmb3J3YXJkIGFuZFxuICAvLyBmb2N1c2VzIHRoZSBmaWVsZCwgc28gYSBzYXZlIG1hZGUgZnJvbSBhbm90aGVyIHRhYiBzYXlzIHdoeSBpdCBmYWlsZWQuXG4gIHByaXZhdGUgX3Nob3dSZWZ1c2FsKHJvdzogRmlsdGVyRGVmYXVsdFJvdywgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucGF0Y2hSb3cocm93LCB7IG5hbWVSZWZ1c2FsOiB7IHZhbHVlOiBjaGFuZ2VzLm5hbWUsIG1lc3NhZ2UgfSB9KTtcbiAgICAgIHRoaXMuX3JlZnVzZWRJbnB1dElkID0gbmFtZUlucHV0SWQocm93Lmdyb3VwLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXRjaFJvdyhyb3csIHsgbGFiZWxSZWZ1c2FsOiB7IHZhbHVlOiBjaGFuZ2VzLmxhYmVsID8/ICcnLCBtZXNzYWdlIH0gfSk7XG4gICAgICB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA9IGxhYmVsSW5wdXRJZChyb3cuZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRUYWIuc2V0KCdmaWx0ZXJzJyk7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuZm9jdXNSZWZ1c2FsKCksIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGhyb3dCb3VuZHNFcnJvcihtaW46IHVua25vd24sIG1heDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yID0gYm91bmRzRXJyb3IocGFyc2VEZWZhdWx0Qm91bmQobWluKSwgcGFyc2VEZWZhdWx0Qm91bmQobWF4KSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQnVpbGQgb25lIGVkaXRhYmxlIHJvdyBwZXIgcmVwb3J0IGJhciBmaWx0ZXIgZ3JvdXAgKGV2ZXJ5IHBhZ2Ugb3Igb25lXG4gIC8vIHBhZ2UpLCBpbiBiYXIgb3JkZXIsIHNlZWRpbmcgZWFjaCBkcmFmdCBmcm9tIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LlxuICBwcml2YXRlIF9idWlsZEZpbHRlclJvd3MocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBjb25zdCBidWlsdCA9IGRlZmF1bHRSb3dHcm91cHMocmVwb3J0LmZpbHRlckdyb3VwcylcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICAgICAgLy8gT25lIHNoYXJlZCwgcmVwbGF5ZWQgb3B0aW9uIHN0cmVhbSBwZXIgZ3JvdXA6IHRoZSBjaGlwcyBmZXRjaCBhbmQgdGhlXG4gICAgICAgIC8vIHN0b3JlZCBkZWZhdWx0J3MgbGFiZWxzIHJlYWQgdGhlIHNhbWUgbGlzdCwgc28gaXQgaXMgZmV0Y2hlZCBvbmNlLlxuICAgICAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHRoaXMuX3JlcG9ydERhdGEsIHJlcG9ydC5pZCk7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2ZpbHRlclJvdyhyZXBvcnQsIGdyb3VwLCBvcHRpb25zJCk7XG5cbiAgICAgICAgcmV0dXJuIHsgcm93LCBvcHRpb25zJCwgdmFsdWVzOiBncm91cERlZmF1bHQ/LnZhbHVlcyA/PyBncm91cERlZmF1bHQ/LmV4Y2x1ZGVWYWx1ZXMgPz8gW10gfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgcm93cyA9IGJ1aWx0Lm1hcCgoZW50cnkpID0+IGVudHJ5LnJvdyk7XG4gICAgY29uc3Qgc2VlZGVkID0gYnVpbHQuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudmFsdWVzLmxlbmd0aCk7XG5cbiAgICAvLyBOb3RoaW5nIHRvIG5hbWUg4oCUIHB1Ymxpc2ggaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBvbiBhIHJlcXVlc3RcbiAgICAvLyBubyByb3cgbmVlZHMuXG4gICAgaWYgKCFzZWVkZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wdWJsaXNoRmlsdGVyUm93cyhyb3dzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgc3RvcmVkIHNlbGVjdCBkZWZhdWx0IGhvbGRzIGlkcywgc28gaXRzIGNoaXBzIGNhbiBvbmx5IGJlIG5hbWVkIG9uY2UgdGhlXG4gICAgLy8gb3B0aW9uIGxpc3QgaXMgaW4uIFJlc29sdmUgZXZlcnkgc2VlZGVkIHJvdyBmaXJzdCBhbmQgcHVibGlzaCB0aGUgcm93cyBpblxuICAgIC8vIG9uZSBnbywgc28gdGhlIHRhYiBuZXZlciByZW5kZXJzIGEgY2hpcCBzaG93aW5nIGEgcmF3IGlkLiBXaGVuIGFuIG9wdGlvblxuICAgIC8vIGxpc3QgZmFpbHMgdG8gbG9hZCwgdGhlIHJvd3MgcHVibGlzaCB1bnJlc29sdmVkOiBlYWNoIGNoaXAgbmFtZXMgaXRzIGlkLFxuICAgIC8vIGFuZCBhbiB1bnRvdWNoZWQgcm93IHN0aWxsIHNhdmVzIHRoZSBzdG9yZWQgZGVmYXVsdCB1bmNoYW5nZWQuXG4gICAgZm9ya0pvaW4oc2VlZGVkLm1hcCgoZW50cnkpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMoZW50cnkub3B0aW9ucyQsIGVudHJ5LnZhbHVlcykpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2Yoc2VlZGVkLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoeyBuYW1lOiBTdHJpbmcodmFsdWUpLCB2YWx1ZSB9KSkpKSksXG4gICAgICAgIHRhcCgocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgICByZXNvbHZlZC5mb3JFYWNoKCh2YWx1ZXMsIGluZGV4KSA9PiBzZWVkZWRbaW5kZXhdLnJvdy52YWx1ZXMgPSB2YWx1ZXMpO1xuICAgICAgICAgIHRoaXMuX3B1Ymxpc2hGaWx0ZXJSb3dzKHJvd3MpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gT25lIHJvdydzIGRyYWZ0LCBzZWVkZWQgZnJvbSBpdHMgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gQSBzdG9yZWQgc2VsZWN0XG4gIC8vIGRlZmF1bHQncyB2YWx1ZXMgYXJlIG5hbWVkIGxhdGVyLCBvbmNlIHRoZSBvcHRpb24gbGlzdCBjYXJyeWluZyB0aGVpclxuICAvLyBsYWJlbHMgaXMgaW4gKHNlZSBfYnVpbGRGaWx0ZXJSb3dzKS5cbiAgcHJpdmF0ZSBfZmlsdGVyUm93KFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICBvcHRpb25zJDogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdPixcbiAgKTogRmlsdGVyRGVmYXVsdFJvdyB7XG4gICAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwLFxuICAgICAgaGVhZGluZzogZGVmYXVsdFJvd0xhYmVsKGdyb3VwLCByZXBvcnQucGFnZXMpLFxuICAgICAgbGFiZWw6IGdyb3VwLmxhYmVsID8/ICcnLFxuICAgICAgbmFtZTogZ3JvdXAubmFtZSA/PyAnJyxcbiAgICAgIHNob3dOYW1lOiB0eXBlb2YgZ3JvdXAubmFtZSA9PT0gJ3N0cmluZycsXG4gICAgICBsYWJlbFJlZnVzYWw6IG51bGwsXG4gICAgICBuYW1lUmVmdXNhbDogbnVsbCxcbiAgICAgIHBlcmlvZDogZGVmYXVsdFBlcmlvZChncm91cERlZmF1bHQpLFxuICAgICAgcGVyaW9kT3B0aW9uczogZGVmYXVsdFBlcmlvZE9wdGlvbnMocmVsYXRpdmVMYWJlbCwgZ3JvdXBEZWZhdWx0Py5yZWxhdGl2ZSA/PyBudWxsKSxcbiAgICAgIHN0YXJ0OiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uc3RhcnQpLFxuICAgICAgZW5kOiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uZW5kKSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBleGNsdWRlOiAhIWdyb3VwRGVmYXVsdD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoLFxuICAgICAgLy8gQW4gb2xkZXIgc2VydmVyIGxpc3RzIG5vIGZlYXR1cmVzLCBhbmQgbGVhdmVzIG5vIHZhbHVlcyBvdXQuXG4gICAgICBzaG93RXhjbHVkZTogc2hvd0V4Y2x1ZGVUb2dnbGUoZ3JvdXAsIHJlcG9ydC52aWV3ZXJGZWF0dXJlcyksXG4gICAgICB2YWx1ZTogZ3JvdXBEZWZhdWx0Py52YWx1ZSA/PyAnJyxcbiAgICAgIG1pbjogZ3JvdXBEZWZhdWx0Py5taW4gPz8gbnVsbCxcbiAgICAgIG1heDogZ3JvdXBEZWZhdWx0Py5tYXggPz8gbnVsbCxcbiAgICAgIC8vIGZzLWF1dG9jb21wbGV0ZS1jaGlwcyBmZXRjaDogdGhlIGdyb3VwJ3MgZGlzdGluY3Qgb3B0aW9ucywgbmFtZS1maWx0ZXJlZC5cbiAgICAgIC8vIFNhbWUgbG9hZGVyIHRoZSByZXBvcnQgYmFyIHVzZXMsIHNvIHRoZSB0d28gbmV2ZXIgZHJpZnQuXG4gICAgICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1Ymxpc2hGaWx0ZXJSb3dzKHJvd3M6IEZpbHRlckRlZmF1bHRSb3dbXSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyUm93cy5zZXQocm93cyk7XG4gICAgdGhpcy5fZmlsdGVyc1JlYWR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8vIFRoZSBkcmFmdCBkZWZhdWx0IG5vcm1hbGl6ZWQgdG8gdGhlIHdpcmUgc2hhcGUgZm9yIHRoaXMgcm93J3MgdHlwZSwgb3IgbnVsbFxuICAvLyB3aGVuIGVtcHR5ICh3aGljaCBjbGVhcnMgdGhlIHN0b3JlZCBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBfcm93RGVmYXVsdChyb3c6IEZpbHRlckRlZmF1bHRSb3cpOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHtcbiAgICBzd2l0Y2ggKHJvdy5ncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4gZGF0ZVJhbmdlRGVmYXVsdChyb3cucGVyaW9kLCBkYXRlVG9Cb3VuZChyb3cuc3RhcnQpLCBkYXRlVG9Cb3VuZChyb3cuZW5kKSk7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIC8vIEEgaGlkZGVuIHRvZ2dsZSBsZWF2ZXMgbm90aGluZyBvdXQuXG4gICAgICAgIHJldHVybiBzZWxlY3REZWZhdWx0KHJvdy52YWx1ZXMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSksIHJvdy5zaG93RXhjbHVkZSAmJiByb3cuZXhjbHVkZSk7XG5cbiAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgcmV0dXJuIG51bWJlclJhbmdlRGVmYXVsdChyb3cubWluLCByb3cubWF4KTtcblxuICAgICAgY2FzZSAna2V5d29yZCc6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LnZhbHVlLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4gdmFsdWUgPyB7IHZhbHVlIH0gOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cblxuLy8gVGhlIGdyb3VwIGFzIHRoZSBzZXJ2ZXIgbm93IHN0b3JlcyBpdCwgb25jZSBhbiB1cGRhdGUgY2FycnlpbmcgYGNoYW5nZXNgXG4vLyBpcyB0YWtlbi5cbmZ1bmN0aW9uIHN0b3JlZEdyb3VwKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCwgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzKTogUmVwb3J0RmlsdGVyR3JvdXAge1xuICByZXR1cm4ge1xuICAgIC4uLmdyb3VwLFxuICAgIC4uLihjaGFuZ2VzLm5hbWUgIT09IHVuZGVmaW5lZCA/IHsgbmFtZTogY2hhbmdlcy5uYW1lIH0gOiB7fSksXG4gICAgLi4uKGNoYW5nZXMubGFiZWwgIT09IHVuZGVmaW5lZCA/IHsgbGFiZWw6IGNoYW5nZXMubGFiZWwgfSA6IHt9KSxcbiAgICBjb25maWc6IGNoYW5nZXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgLi4uZ3JvdXAuY29uZmlnLCBkZWZhdWx0OiBjaGFuZ2VzLmRlZmF1bHQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogZ3JvdXAuY29uZmlnLFxuICB9O1xufVxuXG4vLyBUaGUgaWRzIG9mIGEgZmlsdGVyJ3MgTGFiZWwgYW5kIE5hbWUgaW5wdXRzLCBzbyBhIHJlZnVzZWQgb25lIGNhbiBiZVxuLy8gZm9jdXNlZC5cbmZ1bmN0aW9uIGxhYmVsSW5wdXRJZChncm91cElkOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGZpbHRlckxhYmVsJHtncm91cElkfWA7XG59XG5cbmZ1bmN0aW9uIG5hbWVJbnB1dElkKGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgZmlsdGVyTmFtZSR7Z3JvdXBJZH1gO1xufVxuIiwiPGZvcm1cbiAgICBmc0Zvcm1cbiAgICBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8aDEgbWF0LWRpYWxvZy10aXRsZT5cbiAgICAgIFJlcG9ydCBTZXR0aW5nc1xuICAgIDwvaDE+XG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIDwhLS0gT25lIHNrZWxldG9uIG92ZXIgdGhlIHdob2xlIGJvZHkgdW50aWwgdGhlIGxvY2FsZSBsaXN0IGlzIGluLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKmZzU2tlbGV0b25Gb3JtPVwicmVhZHkoKSB8fCBudWxsXCI+XG4gICAgICAgIDwhLS0gYW5pbWF0aW9uRG9uZTogYSByZWZ1c2VkIExhYmVsIG9yIE5hbWUgaXMgZm9jdXNlZCBvbmNlIHRoZVxuICAgICAgICAgICAgIEZpbHRlcnMgdGFiIGlzIG9uIHNjcmVlbi4gLS0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwXG4gICAgICAgICAgICBbKHNlbGVjdGVkKV09XCJzZWxlY3RlZFRhYlwiXG4gICAgICAgICAgICAoYW5pbWF0aW9uRG9uZSk9XCJmb2N1c1JlZnVzYWwoKVwiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgICBuYW1lPVwic2V0dGluZ3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gdGFiLWJvZHlcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBUaGUgcGFnZSwgdHlwZWQgaW4gaW5jaGVzLiBPcmllbnRhdGlvbiBpcyBub3QgYXNrZWQgZm9yIGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICBpcyBub3QgYW4gaW5kZXBlbmRlbnQgY2hvaWNlIC0gYSBwYWdlIHdpZGVyIHRoYW4gaXQgaXMgdGFsbCBJU1xuICAgICAgICAgICAgICAgIGxhbmRzY2FwZSAtIHNvIHRoZSB0d28gbnVtYmVycyBzYXkgZXZlcnl0aGluZyB0aGVyZSBpcyB0byBzYXkuXG4gICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1zdGFydFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIFdpZHRoXG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFnZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCJwYWdlRGltZW5zaW9uTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cInBhZ2VEaW1lbnNpb25NYXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIEhlaWdodFxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZ2VIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWdlSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCJwYWdlRGltZW5zaW9uTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cInBhZ2VEaW1lbnNpb25NYXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgIEhvdyBkZWVwIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyBhcmUuIFRoZWlyIGNvbnRlbnQgaXMgZWRpdGVkXG4gICAgICAgICAgICAgICAgb24gdGhlIGNhbnZhcyAoRWRpdCBsYXlvdXQg4oaSIEhlYWRlciAmIGZvb3Rlcik7IHRoZXNlIHJlc2VydmUgdGhlXG4gICAgICAgICAgICAgICAgc3BhY2UgZm9yIGl0LCBhbmQgMCBtZWFucyBubyBiYW5kLlxuICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBIZWFkZXIgaGVpZ2h0XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGVySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImhlYWRlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhdPVwiaGVhZGVyRm9vdGVyTWF4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgRm9vdGVyIGhlaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvb3RlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmb290ZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cImhlYWRlckZvb3Rlck1heFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8ZnMtYWktcmVwb3J0LXRpbWV6b25lLXNlbGVjdCBbKHRpbWV6b25lKV09XCJ0aW1lem9uZVwiPjwvZnMtYWktcmVwb3J0LXRpbWV6b25lLXNlbGVjdD5cbiAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgIEhvdyBudW1iZXJzIGFuZCBkYXRlcyBhcmUgd3JpdHRlbiAoZm9ybWF0dGluZyBvbmx5OiBubyB0ZXh0IGlzXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlZCkgYW5kIHdoaWNoIGN1cnJlbmN5IG1vbmV5IGlzIGxhYmVsZWQgaW4uIEhpZGRlbiBvbiBhXG4gICAgICAgICAgICAgICAgc2VydmVyIHRvbyBvbGQgdG8gcmVzb2x2ZSBhIHJlcG9ydCdzIGxvY2FsZS5cbiAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgIEBpZiAobG9jYWxlcygpKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgTG9jYWxlXG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibG9jYWxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxvY2FsZS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImxvY2FsZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgbG9jYWxlT3B0aW9ucygpOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAge3sgZm9ybWF0RXhhbXBsZSgpIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjdXJyZW5jeS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjdXJyZW5jeU9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIE5hbWVzIHRoZSBjdXJyZW5jeSBhbW91bnRzIGFyZSBpbjsgaXQgZG9lcyBub3QgY29udmVydCB0aGVtLlxuICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgICAgbGFiZWw9XCJTdHlsZXNcIlxuICAgICAgICAgICAgICBuYW1lPVwic3R5bGVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgSGVhZGluZyBTaXplXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICBtaW49XCI2XCJcbiAgICAgICAgICAgICAgICAgIG1heD1cIjk2XCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGluZ1NpemVcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImhlYWRpbmdTaXplXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiNlwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cIjk2XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIHB0XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgIEFwcGxpZXMgdG8gY29tcG9uZW50IHRpdGxlcy4gUG9pbnRzIG1hcCAxOjEgdG8gUERGIGFuZCBQb3dlclBvaW50LlxuICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgICAgbGFiZWw9XCJGaWx0ZXJzXCJcbiAgICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gdGFiLWJvZHlcIj5cbiAgICAgICAgICAgICAgQGlmIChmaWx0ZXJSb3dzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBPbmUgc2VjdGlvbiBwZXIgcmVwb3J0IGJhciBmaWx0ZXI6IGl0cyBoZWFkaW5nLCBpdHMgbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lLCB0aGVuIGl0cyBkZWZhdWx0LCBvbmUgZmllbGQgcGVyIHJvdy4gLS0+XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIGZpbHRlclJvd3MoKTsgdHJhY2sgcm93Lmdyb3VwLmlkKSB7XG4gICAgICAgICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgICAgICAgIHt7IHJvdy5oZWFkaW5nIH19XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgbGFiZWwgYW5kIHRoZSBuYW1lIGFyZSBpbmRlcGVuZGVudDogYSBuZXcgbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgY2hhbmdlcyB0aGUgbmFtZSwgYW5kIHRoZSBuYW1lIGlzIGVkaXRlZCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgb3duLiBUaGUgc2VydmVyIGNoZWNrcyBib3RoLCBhbmQgaXRzIHJlZnVzYWwgc2hvd3Mgb25cbiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpZWxkIChyZWZ1c2FsVmFsaWRhdG9yKS4gLS0+XG4gICAgICAgICAgICAgICAgICBAaWYgKHJvdy5zaG93TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJsYWJlbElucHV0SWQocm93Lmdyb3VwLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBsYWJlbDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2xhYmVsJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heExlbmd0aF09XCJsYWJlbE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJyZWZ1c2FsVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubGFiZWxSZWZ1c2FsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCB0aGUgZmlsdGVyIHNob3dzLiBDaGFuZ2luZyBpdCBuZXZlciBjaGFuZ2VzIHRoZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwibmFtZUlucHV0SWQocm93Lmdyb3VwLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG5hbWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIiduYW1lJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVBhdHRlcm5dPVwibmFtZVBhdHRlcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUGF0dGVybk1lc3NhZ2VdPVwibmFtZVBhdHRlcm5NZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heExlbmd0aF09XCJuYW1lTWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cInJlZnVzYWxWYWxpZGF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5uYW1lUmVmdXNhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0aGUgQUkgcmVmZXJzIHRvIHRoaXMgZmlsdGVyOiBhIGxldHRlciwgdGhlbiBsZXR0ZXJzIGFuZCBkaWdpdHMuXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHJvdy5ncm91cC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgcGVyaW9kXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93LnBlcmlvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IHBlcmlvZDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIncGVyaW9kJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2Ygcm93LnBlcmlvZE9wdGlvbnM7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5wZXJpb2QgPT09IGZpeGVkRGF0ZXNQZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidzdGFydCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc0RhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidlbmQnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtYXV0b2NvbXBsZXRlLWNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRlZmF1bHQgdmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hdPVwicm93LmZldGNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIid2YWx1ZXMnICsgcm93Lmdyb3VwLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNBdXRvY29tcGxldGVDaGlwc1RlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtb2JqZWN0PVwib2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb2JqZWN0Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnMtYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuc2hvd0V4Y2x1ZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5leGNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBleGNsdWRlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2V4Y2x1ZGUnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZSB0aGVzZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdudW1iZXJSYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZzTWFza051bWJlciBoYW5kcyBiYWNrIHRleHQ7IHRoZSBjaGVjayBhbmQgdGhlIHNhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgaXQgdGhyb3VnaCBwYXJzZURlZmF1bHRCb3VuZCwgc28gMCBpcyBrZXB0LiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IG1pbmltdW1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2lnbmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCJib3VuZFNjYWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgbWluOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidtaW4nICsgcm93Lmdyb3VwLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVdPVwibWluQm91bmRWYWxpZGF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZURhdGFdPVwicm93Lm1heFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBtYXhpbXVtXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25lZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiYm91bmRTY2FsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Lm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG1heDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbWF4JyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cIm1heEJvdW5kVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5taW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxmcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgICAgICBUaGlzIHJlcG9ydCBoYXMgbm8gcmVwb3J0IGJhciBmaWx0ZXJzIHlldC4gQWRkIGEgZmlsdGVyIHRvIGFcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAoaXRzIHNldHRpbmdzIOKGkiBGaWx0ZXJzKSBhbmQgc2hvdyBpdCBpbiB0aGUgcmVwb3J0IGJhcixcbiAgICAgICAgICAgICAgICAgIHRoZW4gc2V0IGl0cyBkZWZhdWx0IGhlcmUuXG4gICAgICAgICAgICAgICAgPC9mcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgIDxmcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQYWNrYWdlKClcIj5cbiAgICAgICAgICBFeHBvcnRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+Il19
543
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBVSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQzVHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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RTtBQUMzRSxZQUFZO0FBQ1osU0FBUyxXQUFXLENBQUMsS0FBd0IsRUFBRSxPQUFpQztJQUM5RSxPQUFPO1FBQ0wsR0FBRyxLQUFLO1FBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFDbkMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRTtZQUM1RCxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07S0FDakIsQ0FBQztBQUNKLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsV0FBVztBQUNYLFNBQVMsWUFBWSxDQUFDLE9BQWU7SUFDbkMsT0FBTyxjQUFjLE9BQU8sRUFBRSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxPQUFlO0lBQ2xDLE9BQU8sYUFBYSxPQUFPLEVBQUUsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBJbmplY3RvciwgT25Jbml0LCBhZnRlck5leHRSZW5kZXIsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dSZWYsIE1hdERpYWxvZ1RpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdEhpbnQsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXV0b2NvbXBsZXRlLWNoaXBzJztcbmltcG9ydCB7IEZzRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgRnNNYXNrTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWFzayc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGFic01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3RhYnMnO1xuXG5pbXBvcnQgeyBUaW1lem9uZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGltZXpvbmUtc2VsZWN0L3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZmluYWxpemUsIHN3aXRjaE1hcCwgdGFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBhcGlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9hcGktZXJyb3ItbWVzc2FnZSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBEQVlfU0hPUlQsXG4gIFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWSxcbiAgY3VycmVuY3lOYW1lLFxuICBmb3JtYXRMb2NhbERhdGUsXG4gIGZvcm1hdE51bWJlcixcbiAgbG9jYWxlTmFtZSxcbiAgcmVzb2x2ZVJlcG9ydEN1cnJlbmN5LFxuICByZXNvbHZlUmVwb3J0TG9jYWxlLFxufSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRMb2NhbGVzLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBIRUFERVJfRk9PVEVSX01BWCwgUEFHRV9ESU1FTlNJT05fTUFYLCBQQUdFX0RJTUVOU0lPTl9NSU4gfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgZGF0ZUZyb21Cb3VuZCwgZGF0ZVRvQm91bmQsIGxvYWRHcm91cE9wdGlvbnMsIG1hdGNoT3B0aW9ucywgcmVsYXRpdmVMYWJlbCwgcmVzb2x2ZU9wdGlvblZhbHVlcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0JPVU5EX1NDQUxFLFxuICBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfUEFUVEVSTixcbiAgRklMVEVSX05BTUVfUEFUVEVSTl9NRVNTQUdFLFxuICBGSVhFRF9EQVRFU19QRVJJT0QsXG4gIGJvdW5kc0Vycm9yLFxuICBkYXRlUmFuZ2VEZWZhdWx0LFxuICBkZWZhdWx0Q2hhbmdlZCxcbiAgZGVmYXVsdFBlcmlvZCxcbiAgZGVmYXVsdFBlcmlvZE9wdGlvbnMsXG4gIGRlZmF1bHRSb3dHcm91cHMsXG4gIGRlZmF1bHRSb3dMYWJlbCxcbiAgbnVtYmVyUmFuZ2VEZWZhdWx0LFxuICBwYXJzZURlZmF1bHRCb3VuZCxcbiAgc2VsZWN0RGVmYXVsdCxcbiAgc2hvd0V4Y2x1ZGVUb2dnbGUsXG59IGZyb20gJy4uLy4uL2ZpbHRlci1zZXR0aW5ncy1ydWxlcyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXR0aW5nc09wdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyLXNldHRpbmdzLW9wdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyByZXBvcnRMb2NhbGVQYXRjaCB9IGZyb20gJy4vcmVwb3J0LWxvY2FsZS1wYXRjaCc7XG5cblxuLy8gV2hhdCB0aGUgZGlhbG9nIGhhbmRzIGJhY2sgd2hlbiBpdCBjbG9zZXMsIHNvIHRoZSBwYWdlIGtub3dzIHdoYXQgaGFwcGVuZWRcbi8vIHdpdGhvdXQgc25pZmZpbmcgbWFnaWMgc3RyaW5ncy4gQSBkaXNtaXNzZWQgZGlhbG9nIGNsb3NlcyB3aXRoIGB1bmRlZmluZWRgLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB7XG4gIGFjdGlvbjogJ3NhdmVkJyB8ICdkZWxldGVkJztcbn1cblxuXG4vLyBBIE5hbWUgb3IgTGFiZWwgdGhlIHNlcnZlciByZWZ1c2VkIGZvciBhIGZpbHRlciBncm91cCwgd2l0aCB0aGUgbWVzc2FnZSBpdFxuLy8gZ2F2ZS5cbmludGVyZmFjZSBGaWx0ZXJGaWVsZFJlZnVzYWwge1xuICB2YWx1ZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8vIE9uZSByZXBvcnQgYmFyIGZpbHRlciBpbiB0aGUgRmlsdGVycyB0YWI6IGl0cyBncm91cCwgaXRzIGxhYmVsIGFuZCBuYW1lLFxuLy8gYW5kIGFuIGVkaXRhYmxlIGRyYWZ0IGRlZmF1bHQuIFRoZSBkcmFmdCBmaWVsZHMgdXNlZCBkZXBlbmQgb24gdGhlIHR5cGVcbi8vIChkYXRlUmFuZ2Ug4oaSIGEgRGVmYXVsdCBwZXJpb2QsIHdoaWNoIGlzIGEgcmVsYXRpdmUgcmFuZ2Ugb3IgRml4ZWQgZGF0ZXNcbi8vIHdpdGggc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlcywga2VwdCBvciBsZWZ0IG91dDsga2V5d29yZCDihpIgdGV4dDtcbi8vIG51bWJlclJhbmdlIOKGkiBtaW4gYW5kIG1heCkuIGBmZXRjaGAgbG9hZHMgdGhlIHNlbGVjdCBvcHRpb25zIHRoZSBzYW1lIHdheVxuLy8gdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICAvLyBUaGUgc2VjdGlvbiBoZWFkaW5nOiB0aGUgbGFiZWwsIHdpdGggdGhlIHBhZ2UgZm9yIGEgcGFnZSBmaWx0ZXIuXG4gIGhlYWRpbmc6IHN0cmluZztcbiAgLy8gVGhlIGdyb3VwJ3MgbGFiZWwgYW5kIG5hbWUgYXMgdHlwZWQsIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEVhY2ggaXNcbiAgLy8gc2F2ZWQgb25seSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgc3RvcmVkIG9uZTsgdGhlIG5hbWUgaXMgbmV2ZXJcbiAgLy8gZGVyaXZlZCBmcm9tIHRoZSBsYWJlbCBoZXJlLlxuICBsYWJlbDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIFRoZSBzZXJ2ZXIgc2VudCBhIG5hbWUsIHNvIGl0IGFsc28gdGFrZXMgYSBsYWJlbCBhbmQgYSBuYW1lIG9uIHRoZSBncm91cFxuICAvLyB1cGRhdGUgKGFuIG9sZGVyIHNlcnZlciBzZW5kcyBub25lLCBhbmQgdGhlIHR3byBmaWVsZHMgYXJlIGhpZGRlbikuXG4gIHNob3dOYW1lOiBib29sZWFuO1xuICAvLyBUaGUgbGFzdCBsYWJlbCBhbmQgbmFtZSB0aGUgc2VydmVyIHJlZnVzZWQsIGVhY2ggc2hvd24gb24gaXRzIGZpZWxkXG4gIC8vIHdoaWxlIHRoZSBmaWVsZCBzdGlsbCBob2xkcyBpdC5cbiAgbGFiZWxSZWZ1c2FsOiBGaWx0ZXJGaWVsZFJlZnVzYWwgfCBudWxsO1xuICBuYW1lUmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbDtcbiAgLy8gQSByZWxhdGl2ZSByYW5nZSBuYW1lLCBvciBGSVhFRF9EQVRFU19QRVJJT0QgZm9yIHN0YXJ0IGFuZCBlbmQuXG4gIHBlcmlvZDogc3RyaW5nO1xuICBwZXJpb2RPcHRpb25zOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgLy8gVGhlIHZhbHVlcyBhcmUgbGVmdCBvdXQgcmF0aGVyIHRoYW4ga2VwdC5cbiAgZXhjbHVkZTogYm9vbGVhbjtcbiAgc2hvd0V4Y2x1ZGU6IGJvb2xlYW47XG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8vIFRoZSByYW5nZSBlbmRzIGFzIHR5cGVkOiBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0LiBSZWFkIHRocm91Z2hcbiAgLy8gcGFyc2VEZWZhdWx0Qm91bmQuXG4gIG1pbjogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbWF4OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG59XG5cbi8vIE9uZSBmaWx0ZXIncyBncm91cCB1cGRhdGUgaW4gYSBzYXZlOiBvbmx5IHRoZSBrZXlzIHRoZSBvcGVyYXRvciBjaGFuZ2VkLlxuaW50ZXJmYWNlIEZpbHRlckdyb3VwU2F2ZSB7XG4gIHJvdzogRmlsdGVyRGVmYXVsdFJvdztcbiAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzO1xufVxuXG4vLyBPbmUgZW50cnkgb2YgdGhlIExvY2FsZSBvciBDdXJyZW5jeSBzZWxlY3QuICcnIGlzIHRoZSBleHBsaWNpdCBEZWZhdWx0LlxuaW50ZXJmYWNlIExvY2FsZVNlbGVjdE9wdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8vIFRoZSBkYXkgdGhlIExvY2FsZSBoaW50IHdyaXRlcywgYSBmaXhlZCBjYWxlbmRhciBkYXkgc28gdGhlIGV4YW1wbGUgbmV2ZXJcbi8vIGNoYW5nZXMgdW5kZXIgdGhlIG9wZXJhdG9yLlxuY29uc3QgRVhBTVBMRV9EQVkgPSBuZXcgRGF0ZSgyMDI2LCAwLCA1KTtcbmNvbnN0IEVYQU1QTEVfQU1PVU5UID0gMTIzNC41O1xuXG4vLyAnQ2FuYWRpYW4gRnJlbmNoIChmci1DQSknLCAnQ2FuYWRpYW4gRG9sbGFyIChDQUQpJzogRW5nbGlzaCBuYW1lcyB3aGF0ZXZlclxuLy8gdGhlIHJlcG9ydCdzIGxvY2FsZSwgd2l0aCB0aGUgY29kZSB0aGF0IGlzIHN0b3JlZC5cbmZ1bmN0aW9uIGxvY2FsZUxhYmVsKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2FsZU5hbWUodGFnKX0gKCR7dGFnfSlgO1xufVxuXG5mdW5jdGlvbiBjdXJyZW5jeUxhYmVsKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjdXJyZW5jeU5hbWUoY29kZSl9ICgke2NvZGV9KWA7XG59XG5cblxuLy8gUmVwb3J0IHNldHRpbmdzLCBpbiB0aHJlZSB0YWJzOlxuLy8gICBTZXR0aW5ncyDigJQgbmFtZSArIHBhZ2Ugc2V0dXAgKHNpemUgaW4gaW5jaGVzLCBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzKS5cbi8vICAgU3R5bGVzICAg4oCUIHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBzdHlsZXMgKHNpemVzIGluIFBPSU5UUywgMToxIHdpdGhcbi8vICAgUERGL1Bvd2VyUG9pbnQpOyB0aGUgSGVhZGluZyBzaXplIHRvIHN0YXJ0LlxuLy8gICBGaWx0ZXJzICDigJQgdGhlIHJlcG9ydCBiYXIgZmlsdGVycyAoZXZlcnkgcGFnZSBvciBvbmUgcGFnZSkgYW5kIHRoZWlyXG4vLyAgIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHQgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5XG4vLyAgIHZpZXdlcikgYnV0IHN0YXlzIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0XG4vLyAgIGxvY2sgaXQuIFRoaXMgaXMgdGhlIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhXG4vLyAgIGRlZmF1bHQgbW9udGggKyBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbi8vICAgVGhlIHJ1bGVzIG9mIHRoZSByb3dzIGxpdmUgaW4gZmlsdGVyLXNldHRpbmdzLXJ1bGVzLnRzLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNNZXNzYWdlTW9kdWxlLFxuICAgIEZzVGFic01vZHVsZSxcbiAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIEZzRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlLFxuICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdERpYWxvZ1RpdGxlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0SGludCxcbiAgICBNYXRTdWZmaXgsXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBUaW1lem9uZVNlbGVjdENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEEgc2lnbmFsLCBzbyBhIHJlZnVzZWQgTGFiZWwgb3IgTmFtZSBjYW4gYnJpbmcgdGhlIEZpbHRlcnMgdGFiIGZvcndhcmQuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFRhYiA9IHNpZ25hbCgnc2V0dGluZ3MnKTtcbiAgLy8gVHJ1ZSBvbmNlIGFueSBzYXZlIHJlcXVlc3QgaGFzIGJlZW4gc3RvcmVkLCBldmVuIHdoZW4gdGhlIHNhdmUgYXMgYVxuICAvLyB3aG9sZSB0aGVuIGZhaWxlZDogdGhlIHBhZ2UgcmVsb2FkcyBhZnRlciBhIGRpc21pc3NlZCBkaWFsb2cgdG9vLlxuICBwdWJsaWMgcmVhZG9ubHkgd3JvdGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHB1YmxpYyBuYW1lID0gJyc7XG4gIC8vIFRoZSBwYWdlIGluIGluY2hlcy4gTm8gaW5pdGlhbGl6ZXI6IGV2ZXJ5IHJlcG9ydCBjYXJyaWVzIGEgc2l6ZSwgYW5kXG4gIC8vIG5nT25Jbml0IHNlZWRzIGJvdGggYmVmb3JlIHRoZSB0YWIgcmVuZGVycywgc28gYSBwbGFjZWhvbGRlciBoZXJlIGNvdWxkIG9ubHlcbiAgLy8gZXZlciBiZSBhIHdyb25nIG51bWJlciBicmllZmx5IHNob3dpbmcgYXMgdGhlIG9wZXJhdG9yJ3Mgb3duLlxuICAvL1xuICAvLyBUeXBlZCBgbnVtYmVyIHwgc3RyaW5nYCBiZWNhdXNlIGZzTWFza051bWJlciBpcyB0aGUgY29udHJvbDogaXQgaXMgc2VlZGVkXG4gIC8vIHdpdGggdGhlIHJlcG9ydCdzIG51bWJlciBidXQgaGFuZHMgYmFjayB0aGUgdW5tYXNrZWQgU1RSSU5HIHRoZSBvcGVyYXRvclxuICAvLyB0eXBlZC4gU2F2ZSBjYXN0cyBpdCBvbmNlLCBvbiB0aGUgd2F5IG91dCDigJQgc2VlIGBfcGFnZURpbWVuc2lvbigpYC5cbiAgcHVibGljIHBhZ2VXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcGFnZUhlaWdodDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZURpbWVuc2lvbk1pbiA9IFBBR0VfRElNRU5TSU9OX01JTjtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VEaW1lbnNpb25NYXggPSBQQUdFX0RJTUVOU0lPTl9NQVg7XG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kIGRlcHRocywgaW5jaGVzIOKAlCB0eXBlZCBsaWtlIHRoZSBwYWdlIHNpemVcbiAgLy8gYmVjYXVzZSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayBhIHN0cmluZy5cbiAgcHVibGljIGhlYWRlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIGZvb3RlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlckZvb3Rlck1heCA9IEhFQURFUl9GT09URVJfTUFYO1xuICAvLyBTZWVkZWQgd2l0aCB0aGUgem9uZSB0aGUgcmVwb3J0IGFjdHVhbGx5IHVzZXM6IGl0cyBvd24gc3RvcmVkIHpvbmUsIGVsc2VcbiAgLy8gdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQgdGhlIHNlcnZlciByZXNvbHZlZCAoZWZmZWN0aXZlVGltZXpvbmUpLiBTYXZlIHNlbmRzXG4gIC8vIGl0IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhhdCBlZmZlY3RpdmUgem9uZSwgc28gb3BlbmluZyBhbmQgc2F2aW5nIGFcbiAgLy8gcmVwb3J0IHRoYXQgZm9sbG93cyB0aGUgZGVmYXVsdCBuZXZlciBwaW5zIGl0IHRvIGEgem9uZS5cbiAgcHVibGljIHRpbWV6b25lID0gJyc7XG4gIHB1YmxpYyBoZWFkaW5nU2l6ZSA9IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gIC8vIFRoZSBsb2NhbGVzIGFuZCBjdXJyZW5jaWVzIHRoZSBzZXJ2ZXIgb2ZmZXJzLiBudWxsIHVudGlsIGxvYWRlZCwgYW5kXG4gIC8vIG5ldmVyIGxvYWRlZCBmcm9tIGEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZCBlZmZlY3RpdmVMb2NhbGU6IHRoZXJlIHRoZVxuICAvLyBzZWxlY3RzIHN0YXkgaGlkZGVuIGFuZCB0aGUgcmVwb3J0IHJlYWRzIGVuLVVTL1VTRC5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXMgPSBzaWduYWw8UmVwb3J0TG9jYWxlcyB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgcmVwb3J0J3Mgb3duIGxvY2FsZSBhbmQgY3VycmVuY3ksICcnIHdoZW4gaXQgZm9sbG93cyB0aGUgZGVmYXVsdC4gU2F2ZVxuICAvLyBzZW5kcyBlYWNoIG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW5jeSA9IHNpZ25hbCgnJyk7XG4gIC8vIFRoZSB3aG9sZSBmb3JtIHdhaXRzIGJlaGluZCBvbmUgc2tlbGV0b24gdW50aWwgdGhlIGZpbHRlciByb3dzIGFyZSBidWlsdFxuICAvLyBhbmQgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBzZXR0bGVkLCBzbyB0aGUgU2V0dGluZ3MgdGFiIG5ldmVyIHNob3dzXG4gIC8vIHdpdGhvdXQgaXRzIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0cy4gQSBmYWlsZWQgbG9jYWxlIHJlcXVlc3Qgc2V0dGxlc1xuICAvLyB0b286IHRoZSB0d28gc2VsZWN0cyBzdGF5IGhpZGRlbiAobG9jYWxlcygpIGlzIHN0aWxsIG51bGwpIGFuZCBldmVyeSBvdGhlclxuICAvLyBzZXR0aW5nIHN0YXlzIGVkaXRhYmxlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVhZHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJzUmVhZHkoKSAmJiAoIXRoaXMuX3NlcnZlckhhc0xvY2FsZSB8fCB0aGlzLl9sb2NhbGVzU2V0dGxlZCgpKSk7XG5cbiAgLy8gQW4gZXhwbGljaXQgRGVmYXVsdCAoJycpIG5hbWluZyB0aGUgbG9jYWxlIGl0IHN0YW5kcyBmb3IsIHRoZW4gZWFjaCBvZmZlcmVkXG4gIC8vIGxvY2FsZS4gQSBzdG9yZWQgbG9jYWxlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIG9mZmVycyBpcyBsaXN0ZWQgZmlyc3QsIHNvXG4gIC8vIHRoZSBzZWxlY3Qgc3RpbGwgc2hvd3Mgd2hhdCB0aGUgcmVwb3J0IGhvbGRzLlxuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlT3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZmVyZWQgPSBsb2NhbGVzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuX3N0b3JlZE9wdGlvbih0aGlzLl9kYXRhLnJlcG9ydC5sb2NhbGUsIG9mZmVyZWQsIGxvY2FsZUxhYmVsKSxcbiAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogYERlZmF1bHQg4oCUICR7bG9jYWxlTmFtZShsb2NhbGVzLmRlZmF1bHRMb2NhbGUpfWAgfSxcbiAgICAgIC4uLm9mZmVyZWQubWFwKCh0YWcpID0+ICh7IHZhbHVlOiB0YWcsIGxhYmVsOiBsb2NhbGVMYWJlbCh0YWcpIH0pKSxcbiAgICBdO1xuICB9KTtcblxuICAvLyBBbiBleHBsaWNpdCBEZWZhdWx0ICgnJykgbmFtaW5nIHRoZSBjdXJyZW5jeSB0aGUgc2VsZWN0ZWQgbG9jYWxlIHVzZXMgd2hlblxuICAvLyB0aGUgcmVwb3J0IG5hbWVzIG5vbmUsIHRoZW4gZXZlcnkgY3VycmVuY3kuIEEgc3RvcmVkIGNvZGUgdGhlIHNlcnZlciBub1xuICAvLyBsb25nZXIgb2ZmZXJzIGlzIGxpc3RlZCBmaXJzdC5cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbmN5T3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLl9zdG9yZWRPcHRpb24odGhpcy5fZGF0YS5yZXBvcnQuY3VycmVuY3ksIGxvY2FsZXMuY3VycmVuY2llcywgY3VycmVuY3lMYWJlbCksXG4gICAgICB7IHZhbHVlOiAnJywgbGFiZWw6IGBEZWZhdWx0IOKAlCAke2N1cnJlbmN5TGFiZWwodGhpcy5fZGVmYXVsdEN1cnJlbmN5KCkpfWAgfSxcbiAgICAgIC4uLmxvY2FsZXMuY3VycmVuY2llcy5tYXAoKGNvZGUpID0+ICh7IHZhbHVlOiBjb2RlLCBsYWJlbDogY3VycmVuY3lMYWJlbChjb2RlKSB9KSksXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gSG93IHRoZSByZXBvcnQgd2lsbCB3cml0ZSBhbiBhbW91bnQgYW5kIGEgZGF5IG9uY2Ugc2F2ZWQ6IHRoZSBzZWxlY3RlZFxuICAvLyBsb2NhbGUgYW5kIGN1cnJlbmN5LCBvciB0aGUgZGVmYXVsdHMgdGhleSBmYWxsIGJhY2sgdG8sIGUuZy5cbiAgLy8gJzEgMjM0LDUwICQgwrcgNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdEV4YW1wbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZVJlcG9ydExvY2FsZSh0aGlzLl9hcHBsaWVkTG9jYWxlKCkpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHRoaXMuX2FwcGxpZWRDdXJyZW5jeSgpKTtcblxuICAgIHJldHVybiBbXG4gICAgICBmb3JtYXROdW1iZXIoXG4gICAgICAgIEVYQU1QTEVfQU1PVU5ULFxuICAgICAgICB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3ksIHByZWNpc2lvbjogMiB9LFxuICAgICAgICB7IGxvY2FsZSwgY3VycmVuY3ksIHJhdGlvUGVyY2VudDogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGZvcm1hdExvY2FsRGF0ZShFWEFNUExFX0RBWSwgbG9jYWxlLCBEQVlfU0hPUlQpLFxuICAgIF0uam9pbignIMK3ICcpO1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0IGJhciBmaWx0ZXJzIGFuZCB0aGVpciBlZGl0YWJsZSBkZWZhdWx0IHZhbHVlcyAoRmlsdGVycyB0YWIpLlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyUm93cyA9IHNpZ25hbDxGaWx0ZXJEZWZhdWx0Um93W10+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkRGF0ZXNQZXJpb2QgPSBGSVhFRF9EQVRFU19QRVJJT0Q7XG4gIHB1YmxpYyByZWFkb25seSBib3VuZFNjYWxlID0gREVGQVVMVF9CT1VORF9TQ0FMRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuID0gRklMVEVSX05BTUVfUEFUVEVSTjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuTWVzc2FnZSA9IEZJTFRFUl9OQU1FX1BBVFRFUk5fTUVTU0FHRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVNYXhMZW5ndGggPSBGSUxURVJfTkFNRV9NQVhfTEVOR1RIO1xuICBwdWJsaWMgcmVhZG9ubHkgbGFiZWxNYXhMZW5ndGggPSBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSDtcbiAgcHVibGljIHJlYWRvbmx5IGxhYmVsSW5wdXRJZCA9IGxhYmVsSW5wdXRJZDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVJbnB1dElkID0gbmFtZUlucHV0SWQ7XG5cbiAgLy8gVGhlIERlZmF1bHQgbWluaW11bSBhbmQgRGVmYXVsdCBtYXhpbXVtIGNoZWNrcywgdGhyb3VnaCBmc0Zvcm0uIEVhY2ggZmllbGRcbiAgLy8gZ2V0cyB0aGUgb3RoZXIgZW5kIGFzIGl0cyB2YWxpZGF0ZURhdGEsIHNvIHR5cGluZyBpbiBvbmUgY2hlY2tzIHRoZSBwYWlyXG4gIC8vIGFnYWluOyBib3VuZHNFcnJvciB3b3JkcyB0aGUgcmVmdXNhbCBhcyB0aGUgc2VydmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtaW5Cb3VuZFZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1heDogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX3Rocm93Qm91bmRzRXJyb3IoY29udHJvbC52YWx1ZSwgbWF4KTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWF4Qm91bmRWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtaW46IHVua25vd24pOiB2b2lkID0+IHtcbiAgICB0aGlzLl90aHJvd0JvdW5kc0Vycm9yKG1pbiwgY29udHJvbC52YWx1ZSk7XG4gIH07XG5cbiAgLy8gVGhlIHNlcnZlcidzIHJlZnVzYWwgb2YgYSBMYWJlbCBvciBOYW1lLCB0aHJvdWdoIGZzRm9ybS4gVGhlIHNoYXBlIGFuZFxuICAvLyBsZW5ndGggYXJlIGNoZWNrZWQgb24gdGhlIGZpZWxkIChmc0Zvcm1QYXR0ZXJuLCBmc0Zvcm1NYXhMZW5ndGgpLCBidXQgb25seVxuICAvLyB0aGUgc2VydmVyIGtub3dzIHRoZSByZXBvcnQncyBvdGhlciBuYW1lcywgc28gdGhlIGZpZWxkIHNob3dzIHRoZVxuICAvLyBzZXJ2ZXIncyBvd24gd29yZHMgd2hpbGUgaXQgc3RpbGwgaG9sZHMgdGhlIHJlZnVzZWQgdmFsdWUuIEEgbmV3IHJlZnVzYWxcbiAgLy8gYXJyaXZlcyBhcyB0aGUgZmllbGQncyB2YWxpZGF0ZURhdGEsIHdoaWNoIGNoZWNrcyB0aGUgZmllbGQgYWdhaW4uXG4gIHB1YmxpYyByZWFkb25seSByZWZ1c2FsVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIGlmIChyZWZ1c2FsICYmIFN0cmluZyhjb250cm9sLnZhbHVlID8/ICcnKS50cmltKCkgPT09IHJlZnVzYWwudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZWZ1c2FsLm1lc3NhZ2UpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiB7IHJlcG9ydDogUmVwb3J0IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAvLyBUaGUgaWQgb2YgdGhlIExhYmVsIG9yIE5hbWUgaW5wdXQgdGhlIHNlcnZlciBsYXN0IHJlZnVzZWQsIGZvY3VzZWQgb25jZVxuICAvLyBpdCBpcyBvbiBzY3JlZW4gKHNlZSBmb2N1c1JlZnVzYWwpLlxuICBwcml2YXRlIF9yZWZ1c2VkSW5wdXRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8vIE9ubHkgYSBzZXJ2ZXIgdGhhdCByZXNvbHZlcyBhIHJlcG9ydCdzIGxvY2FsZSBvZmZlcnMgdGhlIGxvY2FsZSBsaXN0LlxuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJ2ZXJIYXNMb2NhbGUgPSB0aGlzLl9kYXRhLnJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcbiAgLy8gVHJ1ZSBvbmNlIHRoZSBsb2NhbGUgcmVxdWVzdCBoYXMgYW5zd2VyZWQsIHdpdGggdGhlIGxpc3Qgb3IgYW4gZXJyb3IuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvY2FsZXNTZXR0bGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgLy8gVHJ1ZSBvbmNlIHRoZSBmaWx0ZXIgcm93cyBhcmUgcHVibGlzaGVkIChzZWUgX2J1aWxkRmlsdGVyUm93cykuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcnNSZWFkeSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIGxvY2FsZSB0aGUgcmVwb3J0IHdvdWxkIGJlIHdyaXR0ZW4gaW46IHRoZSBzZWxlY3RlZCBvbmUgd2hlbiB0aGVcbiAgLy8gc2VydmVyIG9mZmVycyBpdCwgZWxzZSB0aGUgZGVmYXVsdCAoYSBzdG9yZWQgbG9jYWxlIGl0IG5vIGxvbmdlciBvZmZlcnNcbiAgLy8gZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCwgYXMgaXQgZG9lcyBvbiB0aGUgc2VydmVyKS5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXBwbGllZExvY2FsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5sb2NhbGVzKCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5sb2NhbGUoKTtcblxuICAgIHJldHVybiBsb2NhbGVzPy5vcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLmxvY2FsZSA9PT0gbG9jYWxlKVxuICAgICAgPyBsb2NhbGVcbiAgICAgIDogbG9jYWxlcz8uZGVmYXVsdExvY2FsZSA/PyAnJztcbiAgfSk7XG5cbiAgLy8gVGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIHRoZSBhcHBsaWVkIGxvY2FsZSB1c2VzIHdoZW4gaXQgbmFtZXMgbm9uZS5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEN1cnJlbmN5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuX2FwcGxpZWRMb2NhbGUoKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2FsZXMoKT8ub3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUgPT09IGxvY2FsZSk/LmRlZmF1bHRDdXJyZW5jeVxuICAgICAgPz8gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9KTtcblxuICAvLyBUaGUgY3VycmVuY3kgdGhlIHJlcG9ydCB3b3VsZCBsYWJlbCBtb25leSBpbjogdGhlIHNlbGVjdGVkIG9uZSB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgb2ZmZXJzIGl0LCBlbHNlIHRoZSBkZWZhdWx0LlxuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBsaWVkQ3VycmVuY3kgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5KCk7XG5cbiAgICByZXR1cm4gdGhpcy5sb2NhbGVzKCk/LmN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kpXG4gICAgICA/IGN1cnJlbmN5XG4gICAgICA6IHRoaXMuX2RlZmF1bHRDdXJyZW5jeSgpO1xuICB9KTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XG4gICAgdGhpcy5uYW1lID0gcmVwb3J0Lm5hbWU7XG4gICAgdGhpcy5wYWdlV2lkdGggPSByZXBvcnQucGFnZVdpZHRoO1xuICAgIHRoaXMucGFnZUhlaWdodCA9IHJlcG9ydC5wYWdlSGVpZ2h0O1xuICAgIHRoaXMuaGVhZGVySGVpZ2h0ID0gcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyPy5oZWFkZXJIZWlnaHQgPz8gMDtcbiAgICB0aGlzLmZvb3RlckhlaWdodCA9IHJlcG9ydC5jb25maWc/LmhlYWRlckZvb3Rlcj8uZm9vdGVySGVpZ2h0ID8/IDA7XG4gICAgdGhpcy50aW1lem9uZSA9IHJlcG9ydC50aW1lem9uZSA/PyByZXBvcnQuZWZmZWN0aXZlVGltZXpvbmUgPz8gJyc7XG4gICAgdGhpcy5oZWFkaW5nU2l6ZSA9IHJlcG9ydC5jb25maWc/LnN0eWxlcz8uaGVhZGluZz8uc2l6ZSA/PyBERUZBVUxUX0hFQURJTkdfU0laRTtcbiAgICB0aGlzLmxvY2FsZS5zZXQocmVwb3J0LmxvY2FsZSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW5jeS5zZXQocmVwb3J0LmN1cnJlbmN5ID8/ICcnKTtcblxuICAgIHRoaXMuX2J1aWxkRmlsdGVyUm93cyhyZXBvcnQpO1xuXG4gICAgaWYgKHRoaXMuX3NlcnZlckhhc0xvY2FsZSkge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5sb2NhbGVzKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChsb2NhbGVzKSA9PiB0aGlzLmxvY2FsZXMuc2V0KGxvY2FsZXMpKSxcbiAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSxcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLl9sb2NhbGVzU2V0dGxlZC5zZXQodHJ1ZSkpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBjaGFuZ2UgdG8gYSByb3cncyBMYWJlbCwgTmFtZSwgRGVmYXVsdCBwZXJpb2QsIGV4Y2x1ZGUgdG9nZ2xlIG9yIHJhbmdlIGVuZHMuIEEgbmV3XG4gIC8vIHJvdyBvYmplY3QgcmF0aGVyIHRoYW4gYSBtdXRhdGlvbiwgc28gdGhlIHNpZ25hbCBzZWVzIHRoZSBjaGFuZ2U7IHRoZVxuICAvLyBAZm9yIHRyYWNrcyBncm91cC5pZCwgc28gdGhlIHJvdydzIGNvbnRyb2xzIHN1cnZpdmUgdGhlIHN3YXAuXG4gIHB1YmxpYyBwYXRjaFJvdyhyb3c6IEZpbHRlckRlZmF1bHRSb3csIHBhdGNoOiBQYXJ0aWFsPEZpbHRlckRlZmF1bHRSb3c+KTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJSb3dzLnVwZGF0ZSgocm93cykgPT4gcm93c1xuICAgICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0uZ3JvdXAuaWQgPT09IHJvdy5ncm91cC5pZCA/IHsgLi4uaXRlbSwgLi4ucGF0Y2ggfSA6IGl0ZW0pKSk7XG4gIH1cblxuICAvLyBGb2N1c2VzIHRoZSBMYWJlbCBvciBOYW1lIGlucHV0IHRoZSBzZXJ2ZXIgcmVmdXNlZCwgb25jZSBpdCBpcyBvblxuICAvLyBzY3JlZW46IHN0cmFpZ2h0IGFmdGVyIHRoZSByZWZ1c2FsIHdoZW4gdGhlIEZpbHRlcnMgdGFiIGlzIHNob3dpbmcsIGVsc2VcbiAgLy8gd2hlbiB0aGUgdGFiIGdyb3VwIGhhcyBicm91Z2h0IGl0IGZvcndhcmQuXG4gIHB1YmxpYyBmb2N1c1JlZnVzYWwoKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA/IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX3JlZnVzZWRJbnB1dElkKSA6IG51bGw7XG5cbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlybSBhbmQgZGVsZXRlIGhlcmUsIHdoaWxlIHRoZSBkaWFsb2cgaXMgc3RpbGwgb3BlbiwgdGhlbiBjbG9zZSB3aXRoXG4gIC8vIGEgYGRlbGV0ZWRgIHJlc3VsdC4gVGhlIHBhZ2UgcmVhY3RzIHRvIHRoZSByZXN1bHQ7IGl0IG5vIGxvbmdlciBvd25zIHRoZVxuICAvLyBwcm9tcHQgb3IgdGhlIEFQSSBjYWxsLlxuICBwdWJsaWMgZGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgIHRpdGxlOiAnRGVsZXRlIFJlcG9ydCcsXG4gICAgICB0ZW1wbGF0ZTogYERlbGV0ZSBcIiR7dGhpcy5fZGF0YS5yZXBvcnQubmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGUodGhpcy5fZGF0YS5yZXBvcnQuaWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVwb3J0IGRlbGV0ZWQnKTtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHsgYWN0aW9uOiAnZGVsZXRlZCcgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5fZGF0YS5yZXBvcnQuaWQ7XG5cbiAgICAvLyBPbmUgU2F2ZSBjb3ZlcnMgYWxsIHRocmVlIHRhYnMuIFRoZSByZXBvcnQgcmVsb2FkcyBvbiB0aGUgYHNhdmVkYFxuICAgIC8vIHJlc3VsdCwgcmUtc2VlZGluZyB0aGUgYmFyIGZyb20gdGhlIG5ldyBkZWZhdWx0cy5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHBhZ2VXaWR0aDogdGhpcy5fcGFnZURpbWVuc2lvbih0aGlzLnBhZ2VXaWR0aCksXG4gICAgICBwYWdlSGVpZ2h0OiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMucGFnZUhlaWdodCksXG4gICAgICAuLi50aGlzLl90aW1lem9uZVNldHRpbmcoKSxcbiAgICAgIC4uLnJlcG9ydExvY2FsZVBhdGNoKHRoaXMuX2RhdGEucmVwb3J0LCB0aGlzLmxvY2FsZSgpLCB0aGlzLmN1cnJlbmN5KCkpLFxuICAgICAgc3R5bGVzOiB7IGhlYWRpbmc6IHsgc2l6ZTogdGhpcy5oZWFkaW5nU2l6ZSB9IH0sXG4gICAgICBoZWFkZXJGb290ZXI6IHtcbiAgICAgICAgaGVhZGVySGVpZ2h0OiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMuaGVhZGVySGVpZ2h0KSB8fCAwLFxuICAgICAgICBmb290ZXJIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5mb290ZXJIZWlnaHQpIHx8IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBPbmUgZ3JvdXAgdXBkYXRlIHBlciBjaGFuZ2VkIGZpbHRlciwgY2Fycnlpbmcgb25seSB3aGF0IGNoYW5nZWQ6IGl0c1xuICAgIC8vIGxhYmVsLCBuYW1lIGFuZCBkZWZhdWx0IGFsbCBsaXZlIGluIHRoZSBncm91cCdzIGNvbmZpZywgc28gdHdvIHJlcXVlc3RzXG4gICAgLy8gZm9yIG9uZSBncm91cCB3b3VsZCBlYWNoIHdyaXRlIHRoZSBjb25maWcgb3ZlciB0aGUgb3RoZXIuXG4gICAgY29uc3Qgc2F2ZXMgPSB0aGlzLmZpbHRlclJvd3MoKVxuICAgICAgLm1hcCgocm93KSA9PiAoeyByb3csIGNoYW5nZXM6IHRoaXMuX2dyb3VwQ2hhbmdlcyhyb3cpIH0pKVxuICAgICAgLmZpbHRlcigoc2F2ZSkgPT4gT2JqZWN0LmtleXMoc2F2ZS5jaGFuZ2VzKS5sZW5ndGggPiAwKTtcblxuICAgIC8vIEEgbGFiZWwgb3IgbmFtZSBjYW4gYmUgcmVmdXNlZCwgc28gdGhvc2UgdXBkYXRlcyBnbyBmaXJzdCwgb25lIGFmdGVyXG4gICAgLy8gYW5vdGhlciwgYW5kIGEgcmVmdXNhbCBzdG9wcyB0aGUgc2F2ZSBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyB3cml0dGVuOlxuICAgIC8vIHRoZSByZXBvcnQgc2V0dGluZ3MgYW5kIHRoZSBvdGhlciBkZWZhdWx0cyB3YWl0IHVudGlsIGV2ZXJ5IG5hbWUgaXNcbiAgICAvLyB0YWtlbi4gSW4gc2VxdWVuY2UsIHR3byByZW5hbWVzIGluIG9uZSBzYXZlIGFyZSBjaGVja2VkIGFnYWluc3QgZWFjaFxuICAgIC8vIG90aGVyLCBhbmQgYSByZW5hbWUgb250byBhIG5hbWUgYW5vdGhlciBmaWx0ZXIgaXMgZ2l2aW5nIHVwIGdvZXMgYWZ0ZXJcbiAgICAvLyBpdC4gVGhlIHNlcnZlciBhcHBsaWVzIG5hbWUgYmVmb3JlIGRlZmF1bHQsIHNvIGEgcmVmdXNlZCBuYW1lIGxlYXZlc1xuICAgIC8vIHRoYXQgZmlsdGVyJ3MgZGVmYXVsdCB1bndyaXR0ZW4gdG9vLlxuICAgIGNvbnN0IG5hbWVkID0gdGhpcy5fcmVuYW1lT3JkZXIoc2F2ZXMuZmlsdGVyKChzYXZlKSA9PiB0aGlzLl9uYW1lc09yTGFiZWxzKHNhdmUuY2hhbmdlcykpKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHNhdmVzLmZpbHRlcigoc2F2ZSkgPT4gIXRoaXMuX25hbWVzT3JMYWJlbHMoc2F2ZS5jaGFuZ2VzKSk7XG5cbiAgICByZXR1cm4gZnJvbShuYW1lZClcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKHNhdmUpID0+IHRoaXMuX3NhdmVOYW1lZChyZXBvcnRJZCwgc2F2ZSkpLFxuICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBmb3JrSm9pbihbXG4gICAgICAgICAgdGhpcy5fcmVwb3J0RGF0YS51cGRhdGUocmVwb3J0SWQsIHNldHRpbmdzKSxcbiAgICAgICAgICAuLi5kZWZhdWx0cy5tYXAoKHNhdmUpID0+IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAocmVwb3J0SWQsIHNhdmUucm93Lmdyb3VwLmlkLCBzYXZlLmNoYW5nZXMpKSxcbiAgICAgICAgXS5tYXAoKHJlcXVlc3QkKSA9PiByZXF1ZXN0JC5waXBlKHRhcCgoKSA9PiB0aGlzLndyb3RlLnNldCh0cnVlKSkpKSkpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVwb3J0IHNldHRpbmdzIHNhdmVkJyk7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZWQnIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH07XG5cbiAgLy8gVGhlIHBhZ2UgZGltZW5zaW9uIGFzIGEgcmVhbCBudW1iZXIgZm9yIHRoZSB3aXJlLiBmc01hc2tOdW1iZXIgaGFuZHMgYmFja1xuICAvLyB0aGUgdW5tYXNrZWQgc3RyaW5nIGl0IGJ1aWx0IHdpdGggYSBmaXhlZCAnLicgcmFkaXggKHdoaWNoIGlzIHRoZSB3aG9sZVxuICAvLyBwb2ludCBvZiB0aGUgbWFzayAtIGEgbmF0aXZlIG51bWJlciBpbnB1dCBwYWludHMgdGhlIHZpZXdlcidzIGxvY2FsZVxuICAvLyBzZXBhcmF0b3IgaW5zdGVhZCksIHNvIHRoZSBjYXN0IGhlcmUgaXMgYSBzdHJhaWdodCBwYXJzZSBhbmQgbmV2ZXIgc2VlcyBhXG4gIC8vIGNvbW1hLiBUaGUgYmFja2VuZCByZWplY3RzIGFueXRoaW5nIG5vbi1udW1lcmljIHJhdGhlciB0aGFuIGNvZXJjaW5nLCBzbyBhXG4gIC8vIE5hTiBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBzdG9yaW5nIGEgd3JvbmcgcGFnZSBzaXplLlxuICBwcml2YXRlIF9wYWdlRGltZW5zaW9uKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIGZvciB0aGUgc2V0dGluZ3MgUFVULCBzZW50IG9ubHkgd2hlbiBpdCBtb3ZlcyB0aGUgcmVwb3J0IG9mZiB0aGVcbiAgLy8gem9uZSBpdCBhbHJlYWR5IHVzZXMsIHNvIGFuIHVudG91Y2hlZCBkaWFsb2cgbmV2ZXIgcGlucyBhIHJlcG9ydCB0aGF0XG4gIC8vIGZvbGxvd3MgdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQuIEEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZFxuICAvLyBlZmZlY3RpdmVUaW1lem9uZSBnZXRzIHRoZSB6b25lIGV2ZXJ5IHRpbWUsIGFzIGl0IGFsd2F5cyBkaWQuXG4gIHByaXZhdGUgX3RpbWV6b25lU2V0dGluZygpOiB7IHRpbWV6b25lPzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWV6b25lID0gdGhpcy5fZGF0YS5yZXBvcnQuZWZmZWN0aXZlVGltZXpvbmU7XG5cbiAgICByZXR1cm4gZWZmZWN0aXZlVGltZXpvbmUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnRpbWV6b25lICE9PSBlZmZlY3RpdmVUaW1lem9uZVxuICAgICAgPyB7IHRpbWV6b25lOiB0aGlzLnRpbWV6b25lIH1cbiAgICAgIDoge307XG4gIH1cblxuICAvLyBUaGUgc3RvcmVkIHZhbHVlIGFzIGl0cyBvd24gb3B0aW9uIHdoZW4gdGhlIHNlcnZlciBubyBsb25nZXIgb2ZmZXJzIGl0LCBzb1xuICAvLyB0aGUgc2VsZWN0IG5hbWVzIGl0IGluc3RlYWQgb2Ygc2hvd2luZyBibGFuay4gTGVmdCBhcyBpdCBpcywgaXQgaXMgbmV2ZXJcbiAgLy8gc2VudCAoc2VlIHJlcG9ydExvY2FsZVBhdGNoKSwgYW5kIHRoZSByZXBvcnQgcmVhZHMgdGhlIGRlZmF1bHQgbWVhbndoaWxlLlxuICBwcml2YXRlIF9zdG9yZWRPcHRpb24oXG4gICAgc3RvcmVkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIG9mZmVyZWQ6IHN0cmluZ1tdLFxuICAgIGxhYmVsOiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nLFxuICApOiBMb2NhbGVTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIHN0b3JlZCAmJiAhb2ZmZXJlZC5pbmNsdWRlcyhzdG9yZWQpID8gW3sgdmFsdWU6IHN0b3JlZCwgbGFiZWw6IGxhYmVsKHN0b3JlZCkgfV0gOiBbXTtcbiAgfVxuXG4gIC8vIFdoYXQgYSBzYXZlIGNoYW5nZXMgb24gYSByb3cncyBncm91cDogdGhlIGxhYmVsLCBuYW1lIGFuZCBkZWZhdWx0LCBlYWNoXG4gIC8vIG9ubHkgd2hlbiB0aGUgb3BlcmF0b3IgY2hhbmdlZCBpdC4gTGFiZWwgYW5kIG5hbWUgYXJlIHNlbnQgb25seSB0byBhXG4gIC8vIHNlcnZlciB0aGF0IHNlbnQgYSBuYW1lLCBhbmQgbmV2ZXIgb25lIGZyb20gdGhlIG90aGVyLlxuICBwcml2YXRlIF9ncm91cENoYW5nZXMocm93OiBGaWx0ZXJEZWZhdWx0Um93KTogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIHtcbiAgICBjb25zdCBjaGFuZ2VzOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMgPSB7fTtcblxuICAgIGlmIChyb3cuc2hvd05hbWUpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gcm93LmxhYmVsLnRyaW0oKTtcbiAgICAgIGlmIChsYWJlbCAhPT0gKHJvdy5ncm91cC5sYWJlbCA/PyAnJykpIHtcbiAgICAgICAgY2hhbmdlcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gcm93Lm5hbWUudHJpbSgpO1xuICAgICAgaWYgKG5hbWUgIT09IHJvdy5ncm91cC5uYW1lKSB7XG4gICAgICAgIGNoYW5nZXMubmFtZSA9IG5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm93RGVmYXVsdCA9IHRoaXMuX3Jvd0RlZmF1bHQocm93KTtcbiAgICBpZiAoZGVmYXVsdENoYW5nZWQocm93Lmdyb3VwLmNvbmZpZz8uZGVmYXVsdCwgcm93RGVmYXVsdCkpIHtcbiAgICAgIGNoYW5nZXMuZGVmYXVsdCA9IHJvd0RlZmF1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIF9uYW1lc09yTGFiZWxzKGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGFuZ2VzLm5hbWUgIT09IHVuZGVmaW5lZCB8fCBjaGFuZ2VzLmxhYmVsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBUaGUgdXBkYXRlcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc2VudDogYSByZW5hbWUgb250byBhIG5hbWUgYW5vdGhlclxuICAvLyBmaWx0ZXIgaG9sZHMgZ29lcyBhZnRlciB0aGUgb3RoZXJzLCBzbyBhIGZpbHRlciBnaXZpbmcgdGhhdCBuYW1lIHVwIGluXG4gIC8vIHRoZSBzYW1lIHNhdmUgaGFzIGRvbmUgc28gZmlyc3QuXG4gIHByaXZhdGUgX3JlbmFtZU9yZGVyKHNhdmVzOiBGaWx0ZXJHcm91cFNhdmVbXSk6IEZpbHRlckdyb3VwU2F2ZVtdIHtcbiAgICBjb25zdCBoZWxkID0gKHNhdmU6IEZpbHRlckdyb3VwU2F2ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNhdmUuY2hhbmdlcy5uYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gbmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVyUm93cygpXG4gICAgICAgIC5zb21lKChyb3cpID0+IHJvdy5ncm91cC5pZCAhPT0gc2F2ZS5yb3cuZ3JvdXAuaWQgJiYgcm93Lmdyb3VwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWy4uLnNhdmVzXS5zb3J0KChhLCBiKSA9PiBOdW1iZXIoaGVsZChhKSkgLSBOdW1iZXIoaGVsZChiKSkpO1xuICB9XG5cbiAgLy8gU2F2ZXMgYSBmaWx0ZXIncyB1cGRhdGUgdGhhdCBjYXJyaWVzIGEgbGFiZWwgb3IgbmFtZS4gQSByZWZ1c2FsIGlzIHRoZVxuICAvLyBzZXJ2ZXIncyB0byB3b3JkICgnTmFtZSBcInJlZ2lvblwiIGlzIGFscmVhZHkgdXNlZCBieSB0aGUgZmlsdGVyXG4gIC8vIFwiQXJlYVwiLicpLCBzbyBpdCBzaG93cyBvbiB0aGUgZmllbGQgcmF0aGVyIHRoYW4gaW4gYSBkaWFsb2csIGFuZCB0aGUgc2F2ZVxuICAvLyBmYWlscy4gV2hhdCB3YXMgc2F2ZWQgYmVjb21lcyB0aGUgcm93J3Mgc3RvcmVkIGdyb3VwLCBzbyBhIGxhdGVyIHNhdmVcbiAgLy8gZG9lcyBub3Qgc2VuZCBpdCBhZ2Fpbi5cbiAgcHJpdmF0ZSBfc2F2ZU5hbWVkKHJlcG9ydElkOiBudW1iZXIsIHNhdmU6IEZpbHRlckdyb3VwU2F2ZSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgcm93LCBjaGFuZ2VzIH0gPSBzYXZlO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAoXG4gICAgICByZXBvcnRJZCxcbiAgICAgIHJvdy5ncm91cC5pZCxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7IGNvbnRleHQ6IG5ldyBIdHRwQ29udGV4dCgpLnNldChEaXNwbGF5QXBpRXJyb3IsIGZhbHNlKSB9LFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMud3JvdGUuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMucGF0Y2hSb3cocm93LCB7IGdyb3VwOiBzdG9yZWRHcm91cChyb3cuZ3JvdXAsIGNoYW5nZXMpIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLl9zaG93UmVmdXNhbChyb3csIGNoYW5nZXMsIGFwaUVycm9yTWVzc2FnZShlcnJvciwgJ1RoZSBmaWx0ZXIgY291bGQgbm90IGJlIHNhdmVkLicpKTtcblxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU2hvd3MgYSByZWZ1c2FsIG9uIHRoZSBmaWVsZCBpdCBpcyBhYm91dCAodGhlIG5hbWUsIHdoaWNoIHRoZSBzZXJ2ZXJcbiAgLy8gY2hlY2tzIGZpcnN0LCBlbHNlIHRoZSBsYWJlbCksIGJyaW5ncyB0aGUgRmlsdGVycyB0YWIgZm9yd2FyZCBhbmRcbiAgLy8gZm9jdXNlcyB0aGUgZmllbGQsIHNvIGEgc2F2ZSBtYWRlIGZyb20gYW5vdGhlciB0YWIgc2F5cyB3aHkgaXQgZmFpbGVkLlxuICBwcml2YXRlIF9zaG93UmVmdXNhbChyb3c6IEZpbHRlckRlZmF1bHRSb3csIGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGNoUm93KHJvdywgeyBuYW1lUmVmdXNhbDogeyB2YWx1ZTogY2hhbmdlcy5uYW1lLCBtZXNzYWdlIH0gfSk7XG4gICAgICB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA9IG5hbWVJbnB1dElkKHJvdy5ncm91cC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGF0Y2hSb3cocm93LCB7IGxhYmVsUmVmdXNhbDogeyB2YWx1ZTogY2hhbmdlcy5sYWJlbCA/PyAnJywgbWVzc2FnZSB9IH0pO1xuICAgICAgdGhpcy5fcmVmdXNlZElucHV0SWQgPSBsYWJlbElucHV0SWQocm93Lmdyb3VwLmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkVGFiLnNldCgnZmlsdGVycycpO1xuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLmZvY3VzUmVmdXNhbCgpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Rocm93Qm91bmRzRXJyb3IobWluOiB1bmtub3duLCBtYXg6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvciA9IGJvdW5kc0Vycm9yKHBhcnNlRGVmYXVsdEJvdW5kKG1pbiksIHBhcnNlRGVmYXVsdEJvdW5kKG1heCkpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIG9uZSBlZGl0YWJsZSByb3cgcGVyIHJlcG9ydCBiYXIgZmlsdGVyIGdyb3VwIChldmVyeSBwYWdlIG9yIG9uZVxuICAvLyBwYWdlKSwgaW4gYmFyIG9yZGVyLCBzZWVkaW5nIGVhY2ggZHJhZnQgZnJvbSB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgYnVpbHQgPSBkZWZhdWx0Um93R3JvdXBzKHJlcG9ydC5maWx0ZXJHcm91cHMpXG4gICAgICAubWFwKChncm91cCkgPT4ge1xuICAgICAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgICAgIC8vIE9uZSBzaGFyZWQsIHJlcGxheWVkIG9wdGlvbiBzdHJlYW0gcGVyIGdyb3VwOiB0aGUgY2hpcHMgZmV0Y2ggYW5kIHRoZVxuICAgICAgICAvLyBzdG9yZWQgZGVmYXVsdCdzIGxhYmVscyByZWFkIHRoZSBzYW1lIGxpc3QsIHNvIGl0IGlzIGZldGNoZWQgb25jZS5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyQgPSBsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnQuaWQpO1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLl9maWx0ZXJSb3cocmVwb3J0LCBncm91cCwgb3B0aW9ucyQpO1xuXG4gICAgICAgIHJldHVybiB7IHJvdywgb3B0aW9ucyQsIHZhbHVlczogZ3JvdXBEZWZhdWx0Py52YWx1ZXMgPz8gZ3JvdXBEZWZhdWx0Py5leGNsdWRlVmFsdWVzID8/IFtdIH07XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHJvd3MgPSBidWlsdC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5yb3cpO1xuICAgIGNvbnN0IHNlZWRlZCA9IGJ1aWx0LmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnZhbHVlcy5sZW5ndGgpO1xuXG4gICAgLy8gTm90aGluZyB0byBuYW1lIOKAlCBwdWJsaXNoIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIHdhaXRpbmcgb24gYSByZXF1ZXN0XG4gICAgLy8gbm8gcm93IG5lZWRzLlxuICAgIGlmICghc2VlZGVkLmxlbmd0aCkge1xuICAgICAgdGhpcy5fcHVibGlzaEZpbHRlclJvd3Mocm93cyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIHN0b3JlZCBzZWxlY3QgZGVmYXVsdCBob2xkcyBpZHMsIHNvIGl0cyBjaGlwcyBjYW4gb25seSBiZSBuYW1lZCBvbmNlIHRoZVxuICAgIC8vIG9wdGlvbiBsaXN0IGlzIGluLiBSZXNvbHZlIGV2ZXJ5IHNlZWRlZCByb3cgZmlyc3QgYW5kIHB1Ymxpc2ggdGhlIHJvd3MgaW5cbiAgICAvLyBvbmUgZ28sIHNvIHRoZSB0YWIgbmV2ZXIgcmVuZGVycyBhIGNoaXAgc2hvd2luZyBhIHJhdyBpZC4gV2hlbiBhbiBvcHRpb25cbiAgICAvLyBsaXN0IGZhaWxzIHRvIGxvYWQsIHRoZSByb3dzIHB1Ymxpc2ggdW5yZXNvbHZlZDogZWFjaCBjaGlwIG5hbWVzIGl0cyBpZCxcbiAgICAvLyBhbmQgYW4gdW50b3VjaGVkIHJvdyBzdGlsbCBzYXZlcyB0aGUgc3RvcmVkIGRlZmF1bHQgdW5jaGFuZ2VkLlxuICAgIGZvcmtKb2luKHNlZWRlZC5tYXAoKGVudHJ5KSA9PiByZXNvbHZlT3B0aW9uVmFsdWVzKGVudHJ5Lm9wdGlvbnMkLCBlbnRyeS52YWx1ZXMpKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHNlZWRlZC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHsgbmFtZTogU3RyaW5nKHZhbHVlKSwgdmFsdWUgfSkpKSkpLFxuICAgICAgICB0YXAoKHJlc29sdmVkKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZWQuZm9yRWFjaCgodmFsdWVzLCBpbmRleCkgPT4gc2VlZGVkW2luZGV4XS5yb3cudmFsdWVzID0gdmFsdWVzKTtcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoRmlsdGVyUm93cyhyb3dzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIE9uZSByb3cncyBkcmFmdCwgc2VlZGVkIGZyb20gaXRzIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIEEgc3RvcmVkIHNlbGVjdFxuICAvLyBkZWZhdWx0J3MgdmFsdWVzIGFyZSBuYW1lZCBsYXRlciwgb25jZSB0aGUgb3B0aW9uIGxpc3QgY2FycnlpbmcgdGhlaXJcbiAgLy8gbGFiZWxzIGlzIGluIChzZWUgX2J1aWxkRmlsdGVyUm93cykuXG4gIHByaXZhdGUgX2ZpbHRlclJvdyhcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgb3B0aW9ucyQ6IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4sXG4gICk6IEZpbHRlckRlZmF1bHRSb3cge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICAgIHJldHVybiB7XG4gICAgICBncm91cCxcbiAgICAgIGhlYWRpbmc6IGRlZmF1bHRSb3dMYWJlbChncm91cCwgcmVwb3J0LnBhZ2VzKSxcbiAgICAgIGxhYmVsOiBncm91cC5sYWJlbCA/PyAnJyxcbiAgICAgIG5hbWU6IGdyb3VwLm5hbWUgPz8gJycsXG4gICAgICBzaG93TmFtZTogdHlwZW9mIGdyb3VwLm5hbWUgPT09ICdzdHJpbmcnLFxuICAgICAgbGFiZWxSZWZ1c2FsOiBudWxsLFxuICAgICAgbmFtZVJlZnVzYWw6IG51bGwsXG4gICAgICBwZXJpb2Q6IGRlZmF1bHRQZXJpb2QoZ3JvdXBEZWZhdWx0KSxcbiAgICAgIHBlcmlvZE9wdGlvbnM6IGRlZmF1bHRQZXJpb2RPcHRpb25zKHJlbGF0aXZlTGFiZWwsIGdyb3VwRGVmYXVsdD8ucmVsYXRpdmUgPz8gbnVsbCksXG4gICAgICBzdGFydDogZGF0ZUZyb21Cb3VuZChncm91cERlZmF1bHQ/LnN0YXJ0KSxcbiAgICAgIGVuZDogZGF0ZUZyb21Cb3VuZChncm91cERlZmF1bHQ/LmVuZCksXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgICAgZXhjbHVkZTogISFncm91cERlZmF1bHQ/LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCxcbiAgICAgIC8vIEFuIG9sZGVyIHNlcnZlciBsaXN0cyBubyBmZWF0dXJlcywgYW5kIGxlYXZlcyBubyB2YWx1ZXMgb3V0LlxuICAgICAgc2hvd0V4Y2x1ZGU6IHNob3dFeGNsdWRlVG9nZ2xlKGdyb3VwLCByZXBvcnQudmlld2VyRmVhdHVyZXMpLFxuICAgICAgdmFsdWU6IGdyb3VwRGVmYXVsdD8udmFsdWUgPz8gJycsXG4gICAgICBtaW46IGdyb3VwRGVmYXVsdD8ubWluID8/IG51bGwsXG4gICAgICBtYXg6IGdyb3VwRGVmYXVsdD8ubWF4ID8/IG51bGwsXG4gICAgICAvLyBmcy1hdXRvY29tcGxldGUtY2hpcHMgZmV0Y2g6IHRoZSBncm91cCdzIGRpc3RpbmN0IG9wdGlvbnMsIG5hbWUtZmlsdGVyZWQuXG4gICAgICAvLyBTYW1lIGxvYWRlciB0aGUgcmVwb3J0IGJhciB1c2VzLCBzbyB0aGUgdHdvIG5ldmVyIGRyaWZ0LlxuICAgICAgZmV0Y2g6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBtYXRjaE9wdGlvbnMob3B0aW9ucyQsIGtleXdvcmQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9wdWJsaXNoRmlsdGVyUm93cyhyb3dzOiBGaWx0ZXJEZWZhdWx0Um93W10pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclJvd3Muc2V0KHJvd3MpO1xuICAgIHRoaXMuX2ZpbHRlcnNSZWFkeS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvLyBUaGUgZHJhZnQgZGVmYXVsdCBub3JtYWxpemVkIHRvIHRoZSB3aXJlIHNoYXBlIGZvciB0aGlzIHJvdydzIHR5cGUsIG9yIG51bGxcbiAgLy8gd2hlbiBlbXB0eSAod2hpY2ggY2xlYXJzIHRoZSBzdG9yZWQgZGVmYXVsdCkuXG4gIHByaXZhdGUgX3Jvd0RlZmF1bHQocm93OiBGaWx0ZXJEZWZhdWx0Um93KTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gICAgc3dpdGNoIChyb3cuZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgcmV0dXJuIGRhdGVSYW5nZURlZmF1bHQocm93LnBlcmlvZCwgZGF0ZVRvQm91bmQocm93LnN0YXJ0KSwgZGF0ZVRvQm91bmQocm93LmVuZCkpO1xuXG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAvLyBBIGhpZGRlbiB0b2dnbGUgbGVhdmVzIG5vdGhpbmcgb3V0LlxuICAgICAgICByZXR1cm4gc2VsZWN0RGVmYXVsdChyb3cudmFsdWVzLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpLCByb3cuc2hvd0V4Y2x1ZGUgJiYgcm93LmV4Y2x1ZGUpO1xuXG4gICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgIHJldHVybiBudW1iZXJSYW5nZURlZmF1bHQocm93Lm1pbiwgcm93Lm1heCk7XG5cbiAgICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy52YWx1ZS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyB2YWx1ZSB9IDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5cbi8vIFRoZSBncm91cCBhcyB0aGUgc2VydmVyIG5vdyBzdG9yZXMgaXQsIG9uY2UgYW4gdXBkYXRlIGNhcnJ5aW5nIGBjaGFuZ2VzYFxuLy8gaXMgdGFrZW4uXG5mdW5jdGlvbiBzdG9yZWRHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyk6IFJlcG9ydEZpbHRlckdyb3VwIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5ncm91cCxcbiAgICAuLi4oY2hhbmdlcy5uYW1lICE9PSB1bmRlZmluZWQgPyB7IG5hbWU6IGNoYW5nZXMubmFtZSB9IDoge30pLFxuICAgIC4uLihjaGFuZ2VzLmxhYmVsICE9PSB1bmRlZmluZWQgPyB7IGxhYmVsOiBjaGFuZ2VzLmxhYmVsIH0gOiB7fSksXG4gICAgY29uZmlnOiBjaGFuZ2VzLmRlZmF1bHQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IC4uLmdyb3VwLmNvbmZpZywgZGVmYXVsdDogY2hhbmdlcy5kZWZhdWx0ID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IGdyb3VwLmNvbmZpZyxcbiAgfTtcbn1cblxuLy8gVGhlIGlkcyBvZiBhIGZpbHRlcidzIExhYmVsIGFuZCBOYW1lIGlucHV0cywgc28gYSByZWZ1c2VkIG9uZSBjYW4gYmVcbi8vIGZvY3VzZWQuXG5mdW5jdGlvbiBsYWJlbElucHV0SWQoZ3JvdXBJZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBmaWx0ZXJMYWJlbCR7Z3JvdXBJZH1gO1xufVxuXG5mdW5jdGlvbiBuYW1lSW5wdXRJZChncm91cElkOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGZpbHRlck5hbWUke2dyb3VwSWR9YDtcbn1cbiIsIjxmb3JtXG4gICAgZnNGb3JtXG4gICAgW3N1Ym1pdF09XCJzYXZlXCI+XG4gIDxmcy1kaWFsb2c+XG4gICAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+XG4gICAgICBSZXBvcnQgU2V0dGluZ3NcbiAgICA8L2gxPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICA8IS0tIE9uZSBza2VsZXRvbiBvdmVyIHRoZSB3aG9sZSBib2R5IHVudGlsIHRoZSBsb2NhbGUgbGlzdCBpcyBpbi4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpmc1NrZWxldG9uRm9ybT1cInJlYWR5KCkgfHwgbnVsbFwiPlxuICAgICAgICA8IS0tIGFuaW1hdGlvbkRvbmU6IGEgcmVmdXNlZCBMYWJlbCBvciBOYW1lIGlzIGZvY3VzZWQgb25jZSB0aGVcbiAgICAgICAgICAgICBGaWx0ZXJzIHRhYiBpcyBvbiBzY3JlZW4uIC0tPlxuICAgICAgICA8bWF0LXRhYi1ncm91cFxuICAgICAgICAgICAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIlxuICAgICAgICAgICAgKGFuaW1hdGlvbkRvbmUpPVwiZm9jdXNSZWZ1c2FsKClcIj5cbiAgICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgICBsYWJlbD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgVGhlIHBhZ2UsIHR5cGVkIGluIGluY2hlcy4gT3JpZW50YXRpb24gaXMgbm90IGFza2VkIGZvciBiZWNhdXNlIGl0XG4gICAgICAgICAgICAgICAgaXMgbm90IGFuIGluZGVwZW5kZW50IGNob2ljZSAtIGEgcGFnZSB3aWRlciB0aGFuIGl0IGlzIHRhbGwgSVNcbiAgICAgICAgICAgICAgICBsYW5kc2NhcGUgLSBzbyB0aGUgdHdvIG51bWJlcnMgc2F5IGV2ZXJ5dGhpbmcgdGhlcmUgaXMgdG8gc2F5LlxuICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtc20uYWxpZ24tc3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICBXaWR0aFxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwicGFnZURpbWVuc2lvbk1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJwYWdlRGltZW5zaW9uTWF4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICBIZWlnaHRcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZUhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwicGFnZURpbWVuc2lvbk1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJwYWdlRGltZW5zaW9uTWF4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBIb3cgZGVlcCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgYmFuZHMgYXJlLiBUaGVpciBjb250ZW50IGlzIGVkaXRlZFxuICAgICAgICAgICAgICAgIG9uIHRoZSBjYW52YXMgKEVkaXQgbGF5b3V0IOKGkiBIZWFkZXIgJiBmb290ZXIpOyB0aGVzZSByZXNlcnZlIHRoZVxuICAgICAgICAgICAgICAgIHNwYWNlIGZvciBpdCwgYW5kIDAgbWVhbnMgbm8gYmFuZC5cbiAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cImhlYWRlckZvb3Rlck1heFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHRcbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb290ZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9vdGVySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJoZWFkZXJGb290ZXJNYXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpbmNoZXNcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPGZzLWFpLXJlcG9ydC10aW1lem9uZS1zZWxlY3QgWyh0aW1lem9uZSldPVwidGltZXpvbmVcIj48L2ZzLWFpLXJlcG9ydC10aW1lem9uZS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBIb3cgbnVtYmVycyBhbmQgZGF0ZXMgYXJlIHdyaXR0ZW4gKGZvcm1hdHRpbmcgb25seTogbm8gdGV4dCBpc1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWQpIGFuZCB3aGljaCBjdXJyZW5jeSBtb25leSBpcyBsYWJlbGVkIGluLiBIaWRkZW4gb24gYVxuICAgICAgICAgICAgICAgIHNlcnZlciB0b28gb2xkIHRvIHJlc29sdmUgYSByZXBvcnQncyBsb2NhbGUuXG4gICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICBAaWYgKGxvY2FsZXMoKSkge1xuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIExvY2FsZVxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsb2NhbGUuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJsb2NhbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGxvY2FsZU9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdEV4YW1wbGUoKSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY3VycmVuY3kuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgY3VycmVuY3lPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICBOYW1lcyB0aGUgY3VycmVuY3kgYW1vdW50cyBhcmUgaW47IGl0IGRvZXMgbm90IGNvbnZlcnQgdGhlbS5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU3R5bGVzXCJcbiAgICAgICAgICAgICAgbmFtZT1cInN0eWxlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEhlYWRpbmcgU2l6ZVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiNlwiXG4gICAgICAgICAgICAgICAgICBtYXg9XCI5NlwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRpbmdTaXplXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkaW5nU2l6ZVwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjZcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCI5NlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBwdFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICBBcHBsaWVzIHRvIGNvbXBvbmVudCB0aXRsZXMuIFBvaW50cyBtYXAgMToxIHRvIFBERiBhbmQgUG93ZXJQb2ludC5cbiAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRmlsdGVyc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJmaWx0ZXJzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIEBpZiAoZmlsdGVyUm93cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDwhLS0gT25lIHNlY3Rpb24gcGVyIHJlcG9ydCBiYXIgZmlsdGVyOiBpdHMgaGVhZGluZywgaXRzIGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZSwgdGhlbiBpdHMgZGVmYXVsdCwgb25lIGZpZWxkIHBlciByb3cuIC0tPlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBmaWx0ZXJSb3dzKCk7IHRyYWNrIHJvdy5ncm91cC5pZCkge1xuICAgICAgICAgICAgICAgICAgPGgzPlxuICAgICAgICAgICAgICAgICAgICB7eyByb3cuaGVhZGluZyB9fVxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIGxhYmVsIGFuZCB0aGUgbmFtZSBhcmUgaW5kZXBlbmRlbnQ6IGEgbmV3IGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGNoYW5nZXMgdGhlIG5hbWUsIGFuZCB0aGUgbmFtZSBpcyBlZGl0ZWQgb24gaXRzXG4gICAgICAgICAgICAgICAgICAgICAgIG93bi4gVGhlIHNlcnZlciBjaGVja3MgYm90aCwgYW5kIGl0cyByZWZ1c2FsIHNob3dzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWVsZCAocmVmdXNhbFZhbGlkYXRvcikuIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChyb3cuc2hvd05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICBMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwibGFiZWxJbnB1dElkKHJvdy5ncm91cC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgbGFiZWw6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidsYWJlbCcgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhMZW5ndGhdPVwibGFiZWxNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVdPVwicmVmdXNhbFZhbGlkYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZURhdGFdPVwicm93LmxhYmVsUmVmdXNhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgdGhlIGZpbHRlciBzaG93cy4gQ2hhbmdpbmcgaXQgbmV2ZXIgY2hhbmdlcyB0aGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm5hbWVJbnB1dElkKHJvdy5ncm91cC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBuYW1lOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbmFtZScgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1QYXR0ZXJuXT1cIm5hbWVQYXR0ZXJuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVBhdHRlcm5NZXNzYWdlXT1cIm5hbWVQYXR0ZXJuTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhMZW5ndGhdPVwibmFtZU1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJyZWZ1c2FsVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubmFtZVJlZnVzYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBIb3cgdGhlIEFJIHJlZmVycyB0byB0aGlzIGZpbHRlcjogYSBsZXR0ZXIsIHRoZW4gbGV0dGVycyBhbmQgZGlnaXRzLlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAc3dpdGNoIChyb3cuZ3JvdXAudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RhdGVSYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHBlcmlvZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5wZXJpb2RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBwZXJpb2Q6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3BlcmlvZCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIHJvdy5wZXJpb2RPcHRpb25zOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cucGVyaW9kID09PSBmaXhlZERhdGVzUGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzRGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LnN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInc3RhcnQnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInZW5kJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWxhYmVsLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLWF1dG9jb21wbGV0ZS1jaGlwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IHZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoXT1cInJvdy5mZXRjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cudmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIndmFsdWVzJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZXRjaE9uRm9jdXNdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzQXV0b2NvbXBsZXRlQ2hpcHNUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LW9iamVjdD1cIm9iamVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9iamVjdC5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWF1dG9jb21wbGV0ZS1jaGlwcz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93LnNob3dFeGNsdWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuZXhjbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgZXhjbHVkZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidleGNsdWRlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGUgdGhlc2UgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0OyB0aGUgY2hlY2sgYW5kIHRoZSBzYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGl0IHRocm91Z2ggcGFyc2VEZWZhdWx0Qm91bmQsIHNvIDAgaXMga2VwdC4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBtaW5pbXVtXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25lZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiYm91bmRTY2FsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Lm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG1pbjogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbWluJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cIm1pbkJvdW5kVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgbWF4aW11bVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaWduZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImJvdW5kU2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBtYXg6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ21heCcgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJtYXhCb3VuZFZhbGlkYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIid2YWx1ZScgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZnMtbWVzc2FnZS1pbmZvPlxuICAgICAgICAgICAgICAgICAgVGhpcyByZXBvcnQgaGFzIG5vIHJlcG9ydCBiYXIgZmlsdGVycyB5ZXQuIEFkZCBhIGZpbHRlciB0byBhXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQgKGl0cyBzZXR0aW5ncyDihpIgRmlsdGVycykgYW5kIHNob3cgaXQgaW4gdGhlIHJlcG9ydCBiYXIsXG4gICAgICAgICAgICAgICAgICB0aGVuIHNldCBpdHMgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgICAgIDwvZnMtbWVzc2FnZS1pbmZvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICA8ZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgpXCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=