ontimize-web-ngx 15.4.2 → 15.4.4

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.
@@ -26,6 +26,7 @@ import * as i14 from "@angular/material/radio";
26
26
  import * as i15 from "@angular/material/slide-toggle";
27
27
  import * as i16 from "@angular/cdk/scrolling";
28
28
  import * as i17 from "../../../../../pipes/o-translate.pipe";
29
+ import * as i18 from "../../../../../pipes/is-empty-value.pipe";
29
30
  const CUSTOM_FILTERS_OPERATORS = [ColumnValueFilterOperator.LESS_EQUAL, ColumnValueFilterOperator.MORE_EQUAL, ColumnValueFilterOperator.BETWEEN, ColumnValueFilterOperator.EQUAL];
30
31
  export class OTableFilterByColumnDataDialogComponent {
31
32
  constructor(dialogRef, data) {
@@ -180,6 +181,9 @@ export class OTableFilterByColumnDataDialogComponent {
180
181
  }
181
182
  else {
182
183
  colRenderedValues.forEach((renderedValue, i) => {
184
+ if (renderedValue === null || renderedValue === undefined) {
185
+ renderedValue = '';
186
+ }
183
187
  if (!this.columnData.find(item => item.renderedValue === renderedValue)) {
184
188
  this.addIntoColumnData(renderedValue, colValues, i, filter);
185
189
  }
@@ -366,12 +370,12 @@ export class OTableFilterByColumnDataDialogComponent {
366
370
  }
367
371
  }
368
372
  OTableFilterByColumnDataDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableFilterByColumnDataDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
369
- OTableFilterByColumnDataDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableFilterByColumnDataDialogComponent, selector: "o-table-filter-by-column-data-dialog", host: { properties: { "class.o-filter-by-column-dialog": "true" } }, viewQueries: [{ propertyName: "filter", first: true, predicate: ["filter"], descendants: true }, { propertyName: "filterValueList", first: true, predicate: ["filterValueList"], descendants: true }], ngImport: i0, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.FILTER_BY_COLUMN' | oTranslate }}: {{ column.title | oTranslate }}</span>\n<div mat-dialog-content class=\"dialog-list-container\">\n <div fxLayout=\"column\" class=\"content-wrapper\" [class.content-wrapper-fixed-dimension]=\"getFixedDimensionClass()\">\n <mat-slide-toggle #customFilterSlide (change)=\"onSlideChange($event)\" [checked]=\"(isCustomFilter | async)\" *ngIf=\"isDefaultFilter | async\">\n {{ 'TABLE.FILTER_BY_COLUMN.CUSTOM_FILTER' | oTranslate }}\n </mat-slide-toggle>\n <div fxFlex=\"1 1 100%\" *ngIf=\"!(isCustomFilter | async);else customFilterTemplate\" fxLayout=\"column\">\n <mat-form-field class=\"hinted\">\n <mat-icon matPrefix svgIcon=\"ontimize:search\"></mat-icon>\n <input matInput #filter placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n </mat-form-field>\n <div *ngIf=\"(listData | async).length > 0; else emptyListData\" fxLayout=\"row\" fxLayoutAlign=\"space-between start\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" [disabled]=\"!listData\"\n class=\"select-all-checkbox\">\n {{ 'TABLE.FILTER_BY_COLUMN.CHECK_ALL' | oTranslate }}\n </mat-checkbox>\n <span *ngIf=\"!listData\" class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY_FILTER' | oTranslate }}\n </span>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <button type=\"button\" mat-icon-button (click)=\"onClickSortValues()\">\n <mat-icon [svgIcon]=\"getSortByAlphaIcon()\"></mat-icon>\n </button>\n <button type=\"button\" mat-icon-button [matMenuTriggerFor]=\"menu\" *ngIf=\"showFilterValuesOption\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <div fxLayout=\"column\" class=\"filtervalues-container\">\n <div mat-subheader>\n {{'TABLE.FILTER_BY_COLUMN.LABEL_DATA' | oTranslate}}\n </div>\n <mat-divider></mat-divider>\n <mat-radio-group aria-label=\"Data\" fxLayout=\"column\" fxLayoutGap=\"12px\" [(ngModel)]=\"sourceData\" (change)=\"onChangeDataSource($event)\">\n <mat-radio-button value=\"current-page\">{{'TABLE.FILTER_BY_COLUMN.CURRENT_PAGE' | oTranslate}}</mat-radio-button>\n <mat-radio-button value=\"all-data\">{{'TABLE.FILTER_BY_COLUMN.ALL_PAGE' | oTranslate}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <ng-template #emptyListData>\n <span class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY' | oTranslate }}\n </span>\n </ng-template>\n\n <cdk-virtual-scroll-viewport itemSize=\"25\" fxFlex>\n <mat-selection-list *ngIf=\"preloadValues || listData\" #filterValueList class=\"select-values-list\" (selectionChange)=\"onSelect($event)\">\n\n <ng-container *cdkVirtualFor=\"let record of (listData | async); let i = index\">\n <mat-list-option checkboxPosition=\"before\" [selected]=\"record.selected\" [value]=\"record\">\n <ng-container *ngIf=\"!column.renderer\">\n {{ record.value || ('TABLE.FILTER_BY_COLUMN.EMPTY_VALUE' | oTranslate) }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{ cellvalue: record.value, rowvalue: record.rowValue }\">\n </ng-template>\n </mat-list-option>\n </ng-container>\n </mat-selection-list>\n </cdk-virtual-scroll-viewport>\n\n </div>\n </div>\n</div>\n\n\n<mat-dialog-actions fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"clearAction\" class=\"o-button-info\">\n {{ 'TABLE.BUTTONS.FILTER_CLEAR' | oTranslate }} </button>\n <span align=\"end\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"cancelAction\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }} </button>\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"acceptAction\" class=\"o-button-primary\">\n {{ 'ACCEPT' | oTranslate }} </button>\n </span>\n</mat-dialog-actions>\n\n<!-- TEMPLATE CUSTOM FILTER-->\n<ng-template #customFilterTemplate>\n <div *ngIf=\"isTextType()\">\n <mat-form-field fxFlex class=\"hinted\">\n <input matInput #filterText [formControl]=\"fcText\" placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div *ngIf=\"isNumericType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [formControl]=\"fcFrom\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n </mat-form-field>\n <mat-form-field>\n <input matInput [formControl]=\"fcTo\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n </mat-form-field>\n <button type=\"button\" mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n <div *ngIf=\"isDateType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerFrom\" [max]=\"fcTo.value\" [formControl]=\"fcFrom\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerFrom\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerFrom [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerTo\" [min]=\"fcFrom.value\" [formControl]=\"fcTo\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerTo\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerTo [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n\n</ng-template>\n", styles: [".filtervalues-container{padding:12px}.filtervalues-container .mat-divider{margin:8px}.filtervalues-container .mdc-list-group__subheader{font-weight:400;margin-top:0;margin-bottom:0}.filtervalues-container mat-radio-group.mat-mdc-radio-group{margin:12px 12px 0}.o-filter-by-column-dialog .mat-mdc-slide-toggle{padding-bottom:24px;padding-left:14px}.o-filter-by-column-dialog .content-wrapper{padding-top:12px;margin:0}.o-filter-by-column-dialog .content-wrapper.content-wrapper-fixed-dimension{max-height:430px;min-height:430px;min-width:250px;width:100%}.o-filter-by-column-dialog .content-wrapper .mat-mdc-form-field.hinted{margin-bottom:24px}.o-filter-by-column-dialog .content-wrapper .select-values-list{padding-top:0;overflow-y:auto;overflow-x:hidden;outline:none}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item{height:30px}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item .mat-icon{font-size:24px}.o-filter-by-column-dialog .content-wrapper .column-filter-empty-list{text-align:center}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i7.MatDatepickerToggleIcon, selector: "[matDatepickerToggleIcon]" }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.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: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i11.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i11.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i14.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i15.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i16.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i16.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
373
+ OTableFilterByColumnDataDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableFilterByColumnDataDialogComponent, selector: "o-table-filter-by-column-data-dialog", host: { properties: { "class.o-filter-by-column-dialog": "true" } }, viewQueries: [{ propertyName: "filter", first: true, predicate: ["filter"], descendants: true }, { propertyName: "filterValueList", first: true, predicate: ["filterValueList"], descendants: true }], ngImport: i0, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.FILTER_BY_COLUMN' | oTranslate }}: {{ column.title | oTranslate }}</span>\n<div mat-dialog-content class=\"dialog-list-container\">\n <div fxLayout=\"column\" class=\"content-wrapper\" [class.content-wrapper-fixed-dimension]=\"getFixedDimensionClass()\">\n <mat-slide-toggle #customFilterSlide (change)=\"onSlideChange($event)\" [checked]=\"(isCustomFilter | async)\" *ngIf=\"isDefaultFilter | async\">\n {{ 'TABLE.FILTER_BY_COLUMN.CUSTOM_FILTER' | oTranslate }}\n </mat-slide-toggle>\n <div fxFlex=\"1 1 100%\" *ngIf=\"!(isCustomFilter | async);else customFilterTemplate\" fxLayout=\"column\">\n <mat-form-field class=\"hinted\">\n <mat-icon matPrefix svgIcon=\"ontimize:search\"></mat-icon>\n <input matInput #filter placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n </mat-form-field>\n <div *ngIf=\"(listData | async).length > 0; else emptyListData\" fxLayout=\"row\" fxLayoutAlign=\"space-between start\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" [disabled]=\"!listData\"\n class=\"select-all-checkbox\">\n {{ 'TABLE.FILTER_BY_COLUMN.CHECK_ALL' | oTranslate }}\n </mat-checkbox>\n <span *ngIf=\"!listData\" class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY_FILTER' | oTranslate }}\n </span>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <button type=\"button\" mat-icon-button (click)=\"onClickSortValues()\">\n <mat-icon [svgIcon]=\"getSortByAlphaIcon()\"></mat-icon>\n </button>\n <button type=\"button\" mat-icon-button [matMenuTriggerFor]=\"menu\" *ngIf=\"showFilterValuesOption\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <div fxLayout=\"column\" class=\"filtervalues-container\">\n <div mat-subheader>\n {{'TABLE.FILTER_BY_COLUMN.LABEL_DATA' | oTranslate}}\n </div>\n <mat-divider></mat-divider>\n <mat-radio-group aria-label=\"Data\" fxLayout=\"column\" fxLayoutGap=\"12px\" [(ngModel)]=\"sourceData\" (change)=\"onChangeDataSource($event)\">\n <mat-radio-button value=\"current-page\">{{'TABLE.FILTER_BY_COLUMN.CURRENT_PAGE' | oTranslate}}</mat-radio-button>\n <mat-radio-button value=\"all-data\">{{'TABLE.FILTER_BY_COLUMN.ALL_PAGE' | oTranslate}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <ng-template #emptyListData>\n <span class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY' | oTranslate }}\n </span>\n </ng-template>\n\n <cdk-virtual-scroll-viewport itemSize=\"25\" fxFlex>\n <mat-selection-list *ngIf=\"preloadValues || listData\" #filterValueList class=\"select-values-list\" (selectionChange)=\"onSelect($event)\">\n\n <ng-container *cdkVirtualFor=\"let record of (listData | async); let i = index\">\n <mat-list-option checkboxPosition=\"before\" [selected]=\"record.selected\" [value]=\"record\">\n <ng-container *ngIf=\"record.value | isEmptyValue; else showValue\">\n {{ 'TABLE.FILTER_BY_COLUMN.EMPTY_VALUE' | oTranslate }}\n </ng-container>\n <ng-template #showValue>\n <ng-container *ngIf=\"!column.renderer\">\n {{ record.value }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{ cellvalue: record.value, rowvalue: record.rowValue }\">\n </ng-template>\n </ng-template>\n </mat-list-option>\n </ng-container>\n </mat-selection-list>\n </cdk-virtual-scroll-viewport>\n\n </div>\n </div>\n</div>\n\n\n<mat-dialog-actions fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"clearAction\" class=\"o-button-info\">\n {{ 'TABLE.BUTTONS.FILTER_CLEAR' | oTranslate }} </button>\n <span align=\"end\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"cancelAction\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }} </button>\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"acceptAction\" class=\"o-button-primary\">\n {{ 'ACCEPT' | oTranslate }} </button>\n </span>\n</mat-dialog-actions>\n\n<!-- TEMPLATE CUSTOM FILTER-->\n<ng-template #customFilterTemplate>\n <div *ngIf=\"isTextType()\">\n <mat-form-field fxFlex class=\"hinted\">\n <input matInput #filterText [formControl]=\"fcText\" placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div *ngIf=\"isNumericType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [formControl]=\"fcFrom\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n </mat-form-field>\n <mat-form-field>\n <input matInput [formControl]=\"fcTo\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n </mat-form-field>\n <button type=\"button\" mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n <div *ngIf=\"isDateType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerFrom\" [max]=\"fcTo.value\" [formControl]=\"fcFrom\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerFrom\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerFrom [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerTo\" [min]=\"fcFrom.value\" [formControl]=\"fcTo\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerTo\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerTo [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n\n</ng-template>\n", styles: [".filtervalues-container{padding:12px}.filtervalues-container .mat-divider{margin:8px}.filtervalues-container .mdc-list-group__subheader{font-weight:400;margin-top:0;margin-bottom:0}.filtervalues-container mat-radio-group.mat-mdc-radio-group{margin:12px 12px 0}.o-filter-by-column-dialog .mat-mdc-slide-toggle{padding-bottom:24px;padding-left:14px}.o-filter-by-column-dialog .content-wrapper{padding-top:12px;margin:0}.o-filter-by-column-dialog .content-wrapper.content-wrapper-fixed-dimension{max-height:430px;min-height:430px;min-width:250px;width:100%}.o-filter-by-column-dialog .content-wrapper .mat-mdc-form-field.hinted{margin-bottom:24px}.o-filter-by-column-dialog .content-wrapper .select-values-list{padding-top:0;overflow-y:auto;overflow-x:hidden;outline:none}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item{height:30px}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item .mat-icon{font-size:24px}.o-filter-by-column-dialog .content-wrapper .column-filter-empty-list{text-align:center}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i7.MatDatepickerToggleIcon, selector: "[matDatepickerToggleIcon]" }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.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: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i11.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i11.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i14.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i15.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i16.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i16.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.OTranslatePipe, name: "oTranslate" }, { kind: "pipe", type: i18.IsEmptyValuePipe, name: "isEmptyValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
370
374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableFilterByColumnDataDialogComponent, decorators: [{
371
375
  type: Component,
372
376
  args: [{ selector: 'o-table-filter-by-column-data-dialog', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
373
377
  '[class.o-filter-by-column-dialog]': 'true'
374
- }, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.FILTER_BY_COLUMN' | oTranslate }}: {{ column.title | oTranslate }}</span>\n<div mat-dialog-content class=\"dialog-list-container\">\n <div fxLayout=\"column\" class=\"content-wrapper\" [class.content-wrapper-fixed-dimension]=\"getFixedDimensionClass()\">\n <mat-slide-toggle #customFilterSlide (change)=\"onSlideChange($event)\" [checked]=\"(isCustomFilter | async)\" *ngIf=\"isDefaultFilter | async\">\n {{ 'TABLE.FILTER_BY_COLUMN.CUSTOM_FILTER' | oTranslate }}\n </mat-slide-toggle>\n <div fxFlex=\"1 1 100%\" *ngIf=\"!(isCustomFilter | async);else customFilterTemplate\" fxLayout=\"column\">\n <mat-form-field class=\"hinted\">\n <mat-icon matPrefix svgIcon=\"ontimize:search\"></mat-icon>\n <input matInput #filter placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n </mat-form-field>\n <div *ngIf=\"(listData | async).length > 0; else emptyListData\" fxLayout=\"row\" fxLayoutAlign=\"space-between start\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" [disabled]=\"!listData\"\n class=\"select-all-checkbox\">\n {{ 'TABLE.FILTER_BY_COLUMN.CHECK_ALL' | oTranslate }}\n </mat-checkbox>\n <span *ngIf=\"!listData\" class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY_FILTER' | oTranslate }}\n </span>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <button type=\"button\" mat-icon-button (click)=\"onClickSortValues()\">\n <mat-icon [svgIcon]=\"getSortByAlphaIcon()\"></mat-icon>\n </button>\n <button type=\"button\" mat-icon-button [matMenuTriggerFor]=\"menu\" *ngIf=\"showFilterValuesOption\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <div fxLayout=\"column\" class=\"filtervalues-container\">\n <div mat-subheader>\n {{'TABLE.FILTER_BY_COLUMN.LABEL_DATA' | oTranslate}}\n </div>\n <mat-divider></mat-divider>\n <mat-radio-group aria-label=\"Data\" fxLayout=\"column\" fxLayoutGap=\"12px\" [(ngModel)]=\"sourceData\" (change)=\"onChangeDataSource($event)\">\n <mat-radio-button value=\"current-page\">{{'TABLE.FILTER_BY_COLUMN.CURRENT_PAGE' | oTranslate}}</mat-radio-button>\n <mat-radio-button value=\"all-data\">{{'TABLE.FILTER_BY_COLUMN.ALL_PAGE' | oTranslate}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <ng-template #emptyListData>\n <span class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY' | oTranslate }}\n </span>\n </ng-template>\n\n <cdk-virtual-scroll-viewport itemSize=\"25\" fxFlex>\n <mat-selection-list *ngIf=\"preloadValues || listData\" #filterValueList class=\"select-values-list\" (selectionChange)=\"onSelect($event)\">\n\n <ng-container *cdkVirtualFor=\"let record of (listData | async); let i = index\">\n <mat-list-option checkboxPosition=\"before\" [selected]=\"record.selected\" [value]=\"record\">\n <ng-container *ngIf=\"!column.renderer\">\n {{ record.value || ('TABLE.FILTER_BY_COLUMN.EMPTY_VALUE' | oTranslate) }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{ cellvalue: record.value, rowvalue: record.rowValue }\">\n </ng-template>\n </mat-list-option>\n </ng-container>\n </mat-selection-list>\n </cdk-virtual-scroll-viewport>\n\n </div>\n </div>\n</div>\n\n\n<mat-dialog-actions fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"clearAction\" class=\"o-button-info\">\n {{ 'TABLE.BUTTONS.FILTER_CLEAR' | oTranslate }} </button>\n <span align=\"end\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"cancelAction\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }} </button>\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"acceptAction\" class=\"o-button-primary\">\n {{ 'ACCEPT' | oTranslate }} </button>\n </span>\n</mat-dialog-actions>\n\n<!-- TEMPLATE CUSTOM FILTER-->\n<ng-template #customFilterTemplate>\n <div *ngIf=\"isTextType()\">\n <mat-form-field fxFlex class=\"hinted\">\n <input matInput #filterText [formControl]=\"fcText\" placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div *ngIf=\"isNumericType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [formControl]=\"fcFrom\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n </mat-form-field>\n <mat-form-field>\n <input matInput [formControl]=\"fcTo\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n </mat-form-field>\n <button type=\"button\" mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n <div *ngIf=\"isDateType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerFrom\" [max]=\"fcTo.value\" [formControl]=\"fcFrom\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerFrom\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerFrom [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerTo\" [min]=\"fcFrom.value\" [formControl]=\"fcTo\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerTo\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerTo [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n\n</ng-template>\n", styles: [".filtervalues-container{padding:12px}.filtervalues-container .mat-divider{margin:8px}.filtervalues-container .mdc-list-group__subheader{font-weight:400;margin-top:0;margin-bottom:0}.filtervalues-container mat-radio-group.mat-mdc-radio-group{margin:12px 12px 0}.o-filter-by-column-dialog .mat-mdc-slide-toggle{padding-bottom:24px;padding-left:14px}.o-filter-by-column-dialog .content-wrapper{padding-top:12px;margin:0}.o-filter-by-column-dialog .content-wrapper.content-wrapper-fixed-dimension{max-height:430px;min-height:430px;min-width:250px;width:100%}.o-filter-by-column-dialog .content-wrapper .mat-mdc-form-field.hinted{margin-bottom:24px}.o-filter-by-column-dialog .content-wrapper .select-values-list{padding-top:0;overflow-y:auto;overflow-x:hidden;outline:none}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item{height:30px}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item .mat-icon{font-size:24px}.o-filter-by-column-dialog .content-wrapper .column-filter-empty-list{text-align:center}\n"] }]
378
+ }, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.FILTER_BY_COLUMN' | oTranslate }}: {{ column.title | oTranslate }}</span>\n<div mat-dialog-content class=\"dialog-list-container\">\n <div fxLayout=\"column\" class=\"content-wrapper\" [class.content-wrapper-fixed-dimension]=\"getFixedDimensionClass()\">\n <mat-slide-toggle #customFilterSlide (change)=\"onSlideChange($event)\" [checked]=\"(isCustomFilter | async)\" *ngIf=\"isDefaultFilter | async\">\n {{ 'TABLE.FILTER_BY_COLUMN.CUSTOM_FILTER' | oTranslate }}\n </mat-slide-toggle>\n <div fxFlex=\"1 1 100%\" *ngIf=\"!(isCustomFilter | async);else customFilterTemplate\" fxLayout=\"column\">\n <mat-form-field class=\"hinted\">\n <mat-icon matPrefix svgIcon=\"ontimize:search\"></mat-icon>\n <input matInput #filter placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n </mat-form-field>\n <div *ngIf=\"(listData | async).length > 0; else emptyListData\" fxLayout=\"row\" fxLayoutAlign=\"space-between start\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" [disabled]=\"!listData\"\n class=\"select-all-checkbox\">\n {{ 'TABLE.FILTER_BY_COLUMN.CHECK_ALL' | oTranslate }}\n </mat-checkbox>\n <span *ngIf=\"!listData\" class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY_FILTER' | oTranslate }}\n </span>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <button type=\"button\" mat-icon-button (click)=\"onClickSortValues()\">\n <mat-icon [svgIcon]=\"getSortByAlphaIcon()\"></mat-icon>\n </button>\n <button type=\"button\" mat-icon-button [matMenuTriggerFor]=\"menu\" *ngIf=\"showFilterValuesOption\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <div fxLayout=\"column\" class=\"filtervalues-container\">\n <div mat-subheader>\n {{'TABLE.FILTER_BY_COLUMN.LABEL_DATA' | oTranslate}}\n </div>\n <mat-divider></mat-divider>\n <mat-radio-group aria-label=\"Data\" fxLayout=\"column\" fxLayoutGap=\"12px\" [(ngModel)]=\"sourceData\" (change)=\"onChangeDataSource($event)\">\n <mat-radio-button value=\"current-page\">{{'TABLE.FILTER_BY_COLUMN.CURRENT_PAGE' | oTranslate}}</mat-radio-button>\n <mat-radio-button value=\"all-data\">{{'TABLE.FILTER_BY_COLUMN.ALL_PAGE' | oTranslate}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <ng-template #emptyListData>\n <span class=\"column-filter-empty-list\">\n {{ 'TABLE.FILTER_BY_COLUMN.LIST_EMPTY' | oTranslate }}\n </span>\n </ng-template>\n\n <cdk-virtual-scroll-viewport itemSize=\"25\" fxFlex>\n <mat-selection-list *ngIf=\"preloadValues || listData\" #filterValueList class=\"select-values-list\" (selectionChange)=\"onSelect($event)\">\n\n <ng-container *cdkVirtualFor=\"let record of (listData | async); let i = index\">\n <mat-list-option checkboxPosition=\"before\" [selected]=\"record.selected\" [value]=\"record\">\n <ng-container *ngIf=\"record.value | isEmptyValue; else showValue\">\n {{ 'TABLE.FILTER_BY_COLUMN.EMPTY_VALUE' | oTranslate }}\n </ng-container>\n <ng-template #showValue>\n <ng-container *ngIf=\"!column.renderer\">\n {{ record.value }}\n </ng-container>\n <ng-template *ngIf=\"column.renderer\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{ cellvalue: record.value, rowvalue: record.rowValue }\">\n </ng-template>\n </ng-template>\n </mat-list-option>\n </ng-container>\n </mat-selection-list>\n </cdk-virtual-scroll-viewport>\n\n </div>\n </div>\n</div>\n\n\n<mat-dialog-actions fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"clearAction\" class=\"o-button-info\">\n {{ 'TABLE.BUTTONS.FILTER_CLEAR' | oTranslate }} </button>\n <span align=\"end\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"cancelAction\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }} </button>\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"acceptAction\" class=\"o-button-primary\">\n {{ 'ACCEPT' | oTranslate }} </button>\n </span>\n</mat-dialog-actions>\n\n<!-- TEMPLATE CUSTOM FILTER-->\n<ng-template #customFilterTemplate>\n <div *ngIf=\"isTextType()\">\n <mat-form-field fxFlex class=\"hinted\">\n <input matInput #filterText [formControl]=\"fcText\" placeholder=\"{{ 'TABLE.FILTER' | oTranslate }}\">\n <mat-hint>{{ 'TABLE.FILTER_BY_COLUMN.HINT_STAR' | oTranslate }}</mat-hint>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div *ngIf=\"isNumericType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [formControl]=\"fcFrom\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n </mat-form-field>\n <mat-form-field>\n <input matInput [formControl]=\"fcTo\" placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n </mat-form-field>\n <button type=\"button\" mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n <div *ngIf=\"isDateType()\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"12px\">\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerFrom\" [max]=\"fcTo.value\" [formControl]=\"fcFrom\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.FROM' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerFrom\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerFrom [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <mat-form-field>\n <input matInput [matDatepicker]=\"datepickerTo\" [min]=\"fcFrom.value\" [formControl]=\"fcTo\"\n placeholder=\"{{ 'TABLE.FILTER_BY_COLUMN.TO' | oTranslate }}\">\n <mat-datepicker-toggle matSuffix [for]=\"datepickerTo\">\n <mat-icon matDatepickerToggleIcon>today</mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker #datepickerTo [startView]=\"getStartedViewDatepicker()\"></mat-datepicker>\n </mat-form-field>\n <button type=\"button\" matSuffix mat-icon-button (click)=\"clearValues()\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n\n</ng-template>\n", styles: [".filtervalues-container{padding:12px}.filtervalues-container .mat-divider{margin:8px}.filtervalues-container .mdc-list-group__subheader{font-weight:400;margin-top:0;margin-bottom:0}.filtervalues-container mat-radio-group.mat-mdc-radio-group{margin:12px 12px 0}.o-filter-by-column-dialog .mat-mdc-slide-toggle{padding-bottom:24px;padding-left:14px}.o-filter-by-column-dialog .content-wrapper{padding-top:12px;margin:0}.o-filter-by-column-dialog .content-wrapper.content-wrapper-fixed-dimension{max-height:430px;min-height:430px;min-width:250px;width:100%}.o-filter-by-column-dialog .content-wrapper .mat-mdc-form-field.hinted{margin-bottom:24px}.o-filter-by-column-dialog .content-wrapper .select-values-list{padding-top:0;overflow-y:auto;overflow-x:hidden;outline:none}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item{height:30px}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-filter-by-column-dialog .content-wrapper .select-values-list .mat-mdc-list-item .mat-mdc-list-item .mat-icon{font-size:24px}.o-filter-by-column-dialog .content-wrapper .column-filter-empty-list{text-align:center}\n"] }]
375
379
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
376
380
  type: Inject,
377
381
  args: [MAT_DIALOG_DATA]
@@ -382,4 +386,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
382
386
  type: ViewChild,
383
387
  args: ['filterValueList']
384
388
  }] } });
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUdsRixPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSx1REFBdUQsQ0FBQztBQUN0SCxPQUFPLEVBQTJCLCtCQUErQixFQUFFLE1BQU0sK0RBQStE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Q1csZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTZWxlY3Rpb25MaXN0LCBNYXRTZWxlY3Rpb25MaXN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBNYXRSYWRpb0NoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLCBPQ29sdW1uVmFsdWVGaWx0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi12YWx1ZS1maWx0ZXIudHlwZSc7XG5pbXBvcnQgeyBUYWJsZUZpbHRlckJ5Q29sdW1uRGF0YSwgVGFibGVGaWx0ZXJCeUNvbHVtbkRpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtZmlsdGVyLWJ5LWNvbHVtbi1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vby10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0ZpbHRlckNvbHVtbiB9IGZyb20gJy4uLy4uL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1maWx0ZXItY29sdW1uLmNvbXBvbmVudCc7XG5cbmltcG9ydCB0eXBlIHsgT0NvbHVtbiB9IGZyb20gJy4uLy4uLy4uL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5cbmNvbnN0IENVU1RPTV9GSUxURVJTX09QRVJBVE9SUyA9IFtDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkxFU1NfRVFVQUwsIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTCwgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOLCBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICdvLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLWZpbHRlci1ieS1jb2x1bW4tZGlhbG9nXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIHB1YmxpYyBhY2NlcHRBY3Rpb24gPSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkFDQ0VQVDtcbiAgcHVibGljIGNhbmNlbEFjdGlvbiA9IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQ0FOQ0VMO1xuICBwdWJsaWMgY2xlYXJBY3Rpb24gPSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkNMRUFSO1xuXG4gIGNvbHVtbjogT0NvbHVtbjtcbiAgcHJlbG9hZFZhbHVlczogYm9vbGVhbiA9IHRydWU7XG4gIG1vZGU6IHN0cmluZztcbiAgc3RhcnRWaWV3OiAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInIHwgJyc7XG5cbiAgcHVibGljIG9uU29ydEZpbHRlclZhbHVlc0NoYW5nZTogRXZlbnRFbWl0dGVyPE9GaWx0ZXJDb2x1bW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQ3VzdG9tRmlsdGVyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0N1c3RvbUZpbHRlcjogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNDdXN0b21GaWx0ZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNEZWZhdWx0RmlsdGVyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0RlZmF1bHRGaWx0ZXI6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzRGVmYXVsdEZpbHRlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgZmNUZXh0ID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuICBmY0Zyb20gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIGZjVG8gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkRhdGE6IFRhYmxlRmlsdGVyQnlDb2x1bW5EYXRhW10gPSBbXTtcbiAgcHJvdGVjdGVkIHRhYmxlRGF0YTogYW55W10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3REYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFbXT4oW10pO1xuICBwcm90ZWN0ZWQgX2xpc3REYXRhOiBPYnNlcnZhYmxlPFRhYmxlRmlsdGVyQnlDb2x1bW5EYXRhW10+ID0gdGhpcy5saXN0RGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgQFZpZXdDaGlsZCgnZmlsdGVyJykgZmlsdGVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdmaWx0ZXJWYWx1ZUxpc3QnKSBmaWx0ZXJWYWx1ZUxpc3Q6IE1hdFNlbGVjdGlvbkxpc3Q7XG4gIHB1YmxpYyBhY3RpdmVTb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnO1xuICBzb3VyY2VEYXRhO1xuICBxdWVyeUJ5RmlsdGVyQ29sdW1uU3Vic2NyaXB0aW9uOiBhbnk7XG4gIHRhYmxlOiBPVGFibGVDb21wb25lbnQ7XG4gIHNob3dGaWx0ZXJWYWx1ZXNPcHRpb246IGJvb2xlYW47XG4gIHF1ZXJ5TWV0aG9kTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBkYXRhOiBhbnlcbiAgKSB7XG5cbiAgICBpZiAoZGF0YS5jb2x1bW4pIHtcbiAgICAgIHRoaXMuY29sdW1uID0gZGF0YS5jb2x1bW47XG4gICAgfVxuICAgIHRoaXMudGFibGUgPSBkYXRhLnRhYmxlO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy5zaG93RmlsdGVyVmFsdWVzT3B0aW9uID0gdGhpcy50YWJsZS5wYWdpbmF0aW9uQ29udHJvbHM7XG4gICAgdGhpcy5zb3VyY2VEYXRhID1cbiAgICAgIHRoaXMudGFibGUub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudD8uZ2V0RmlsdGVyVmFsdWVzSW5EYXRhKHRoaXMuY29sdW1uLmF0dHIpIHx8XG4gICAgICB0aGlzLnRhYmxlLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmZpbHRlclZhbHVlc0luRGF0YSB8fFxuICAgICAgKHRoaXMudGFibGUucGFnZWFibGUgPyAnY3VycmVudC1wYWdlJyA6ICdhbGwtZGF0YScpO1xuXG4gICAgdGhpcy5tb2RlID0gdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID8gdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Lm1vZGUgOiAnZGVmYXVsdCc7XG4gICAgdGhpcy5pc0RlZmF1bHRGaWx0ZXJTdWJqZWN0Lm5leHQodGhpcy5tb2RlID09PSAnZGVmYXVsdCcpO1xuICAgIHRoaXMuaXNDdXN0b21GaWx0ZXJTdWJqZWN0Lm5leHQodGhpcy5tb2RlID09PSAnY3VzdG9tJyk7XG5cbiAgICBsZXQgcHJldmlvdXNGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlciA9IHRoaXMudGFibGUuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlckJ5QXR0cih0aGlzLmNvbHVtbi5hdHRyKSB8fCB7XG4gICAgICBhdHRyOiB1bmRlZmluZWQsXG4gICAgICBvcGVyYXRvcjogdW5kZWZpbmVkLFxuICAgICAgdmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBhdmFpbGFibGVWYWx1ZXM6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQocHJldmlvdXNGaWx0ZXIub3BlcmF0b3IpKSB7XG4gICAgICB0aGlzLmlzQ3VzdG9tRmlsdGVyU3ViamVjdC5uZXh0KENVU1RPTV9GSUxURVJTX09QRVJBVE9SUy5pbmRleE9mKHByZXZpb3VzRmlsdGVyLm9wZXJhdG9yKSAhPT0gLTEpO1xuICAgIH1cblxuICAgIHRoaXMucHJlbG9hZFZhbHVlcyA9IHRoaXMudGFibGUub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCA/IHRoaXMudGFibGUub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5wcmVsb2FkVmFsdWVzIDogdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb24gPSB0aGlzLnRhYmxlLmdldFNvcnRGaWx0ZXJDb2x1bW4odGhpcy5jb2x1bW4pIHx8ICcnO1xuICAgIHRoaXMuc3RhcnRWaWV3ID0gdGhpcy50YWJsZS5nZXRTdGFydFZpZXdGaWx0ZXJDb2x1bW4odGhpcy5jb2x1bW4pIHx8ICdtb250aCdcblxuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5nZXRRdWVyeU1ldGhvZE9mRmlsdGVyQ29sdW1uKHRoaXMuY29sdW1uLmF0dHIpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChxdWVyeU1ldGhvZCkpIHtcbiAgICAgIHRoaXMucXVlcnlNZXRob2ROYW1lID0gcXVlcnlNZXRob2Q7XG4gICAgICB0aGlzLnNvdXJjZURhdGEgPSAnYWxsLWRhdGEnO1xuICAgIH1cbiAgICB0aGlzLmdldERhdGEodGhpcy5zb3VyY2VEYXRhKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBwYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QocHJldmlvdXNGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuXG4gICAgdGhpcy5wYXJzZUxpc3REYXRhKHByZXZpb3VzRmlsdGVyKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwcmV2aW91c0ZpbHRlcikpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUN1c3RvbUZpbHRlclZhbHVlcyhwcmV2aW91c0ZpbHRlcik7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMaXN0KHByZXZpb3VzRmlsdGVyKTtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlckV2ZW50KCk7XG4gIH1cblxuICBnZXQgbGlzdERhdGEoKTogT2JzZXJ2YWJsZTxUYWJsZUZpbHRlckJ5Q29sdW1uRGF0YVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3REYXRhO1xuICB9XG5cbiAgc2V0IGxpc3REYXRhKGFyZzogT2JzZXJ2YWJsZTxUYWJsZUZpbHRlckJ5Q29sdW1uRGF0YVtdPikge1xuICAgIHRoaXMuX2xpc3REYXRhID0gYXJnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYXRhTGlzdChmaWx0ZXI/OiBPQ29sdW1uVmFsdWVGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVsb2FkVmFsdWVzIHx8IChmaWx0ZXIgJiYgZmlsdGVyLm9wZXJhdG9yID09PSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLklOKSkge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlU29ydERpcmVjdGlvbiA9PT0gQ29kZXMuQVNDX1NPUlQgfHwgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID09PSBDb2Rlcy5ERVNDX1NPUlQpIHtcbiAgICAgICAgdGhpcy5zb3J0RGF0YSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YVN1YmplY3QubmV4dCh0aGlzLmNvbHVtbkRhdGEuc2xpY2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVGaWx0ZXJFdmVudCgpIHtcbiAgICBpZiAodGhpcy5maWx0ZXIpIHtcbiAgICAgIGZyb21FdmVudCh0aGlzLmZpbHRlci5uYXRpdmVFbGVtZW50LCAna2V5dXAnKVxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTUwKSlcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbGV0IGZpbHRlclZhbHVlOiBzdHJpbmcgPSB0aGlzLmZpbHRlci5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgICAgIGZpbHRlclZhbHVlID0gVXRpbC5ub3JtYWxpemVTdHJpbmcoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5pbmRleE9mKCcqJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhU3ViamVjdC5uZXh0KHRoaXMuY29sdW1uRGF0YS5maWx0ZXIoaXRlbSA9PiBuZXcgUmVnRXhwKCdeJyArIFV0aWwubm9ybWFsaXplU3RyaW5nKGZpbHRlclZhbHVlKS5zcGxpdCgnKicpLmpvaW4oJy4qJykgKyAnJCcpLnRlc3QoVXRpbC5ub3JtYWxpemVTdHJpbmcoaXRlbS5yZW5kZXJlZFZhbHVlKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5saXN0RGF0YVN1YmplY3QubmV4dCh0aGlzLmNvbHVtbkRhdGEuZmlsdGVyKGl0ZW0gPT4gKFV0aWwubm9ybWFsaXplU3RyaW5nKGl0ZW0ucmVuZGVyZWRWYWx1ZSkuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgIT09IC0xKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVDdXN0b21GaWx0ZXJWYWx1ZXMoZmlsdGVyOiBPQ29sdW1uVmFsdWVGaWx0ZXIpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgZmlsdGVyLm9wZXJhdG9yID09PSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMOlxuICAgICAgICBpZiAodGhpcy5pc1RleHRUeXBlKCkpIHtcbiAgICAgICAgICB0aGlzLmZjVGV4dC5zZXRWYWx1ZShmaWx0ZXIudmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZmlsdGVyLm9wZXJhdG9yID09PSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkJFVFdFRU46XG4gICAgICAgIHRoaXMuZmNGcm9tLnNldFZhbHVlKHRoaXMuaXNEYXRlVHlwZSgpID8gbmV3IERhdGUoZmlsdGVyLnZhbHVlc1swXSkgOiBmaWx0ZXIudmFsdWVzWzBdKTtcbiAgICAgICAgdGhpcy5mY1RvLnNldFZhbHVlKHRoaXMuaXNEYXRlVHlwZSgpID8gbmV3IERhdGUoZmlsdGVyLnZhbHVlc1sxXSkgOiBmaWx0ZXIudmFsdWVzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGZpbHRlci5vcGVyYXRvciA9PT0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5NT1JFX0VRVUFMOlxuICAgICAgICB0aGlzLmZjRnJvbS5zZXRWYWx1ZSh0aGlzLmlzRGF0ZVR5cGUoKSA/IG5ldyBEYXRlKGZpbHRlci52YWx1ZXMpIDogZmlsdGVyLnZhbHVlcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBmaWx0ZXIub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTEVTU19FUVVBTDpcbiAgICAgICAgdGhpcy5mY1RvLnNldFZhbHVlKHRoaXMuaXNEYXRlVHlwZSgpID8gbmV3IERhdGUoZmlsdGVyLnZhbHVlcykgOiBmaWx0ZXIudmFsdWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRWYWx1ZXMoKTogVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyVmFsdWVMaXN0ID8gdGhpcy5maWx0ZXJWYWx1ZUxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLm1hcChzZWxlY3RlZCA9PiBzZWxlY3RlZC52YWx1ZSkgOiBbXTtcbiAgfVxuXG4gIGFyZUFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gdGhpcy5jb2x1bW5EYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXM7XG4gICAgcmV0dXJuIHNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoICE9PSB0aGlzLmNvbHVtbkRhdGEubGVuZ3RoO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UpIHtcbiAgICBldmVudC5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi52YWx1ZS5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZCk7XG4gIH1cblxuICBvblNlbGVjdEFsbENoYW5nZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZUxpc3Quc2VsZWN0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWVMaXN0LmRlc2VsZWN0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlTGlzdERhdGEoZmlsdGVyOiBPQ29sdW1uVmFsdWVGaWx0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbkRhdGEgPSBbXTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoZmlsdGVyPy5hdmFpbGFibGVWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmNvbHVtbkRhdGEgPSBmaWx0ZXIuYXZhaWxhYmxlVmFsdWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xSZW5kZXJlZFZhbHVlcyA9IHRoaXMuZ2V0Q29sdW1uRGF0YVVzaW5nUmVuZGVyZXIoKTtcbiAgICAgIGNvbnN0IGNvbFZhbHVlczogYW55W10gPSB0aGlzLnRhYmxlRGF0YS5tYXAoZWxlbSA9PiBlbGVtW3RoaXMuY29sdW1uLmF0dHJdKTtcblxuICAgICAgaWYgKHRoaXMudGFibGUucGFnZWFibGUgJiYgdGhpcy5zb3VyY2VEYXRhID09PSAnYWxsLWRhdGEnKSB7XG4gICAgICAgIGNvbFJlbmRlcmVkVmFsdWVzLmZvckVhY2goKHJlbmRlcmVkVmFsdWUsIGkpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZEludG9Db2x1bW5EYXRhKHJlbmRlcmVkVmFsdWUsIGNvbFZhbHVlcywgaSwgZmlsdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xSZW5kZXJlZFZhbHVlcy5mb3JFYWNoKChyZW5kZXJlZFZhbHVlLCBpKSA9PiB7XG4gICAgICAgICAgLypTZWxlY3Rpb24gZGlzdGludCB2YWx1ZXMgKi9cbiAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5yZW5kZXJlZFZhbHVlID09PSByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRJbnRvQ29sdW1uRGF0YShyZW5kZXJlZFZhbHVlLCBjb2xWYWx1ZXMsIGksIGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEludG9Db2x1bW5EYXRhKHJlbmRlcmVkVmFsdWU6IGFueSwgY29sVmFsdWVzOiBhbnlbXSwgaTogbnVtYmVyLCBmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMuY29sdW1uRGF0YS5wdXNoKHtcbiAgICAgIHJlbmRlcmVkVmFsdWU6IHJlbmRlcmVkVmFsdWUsXG4gICAgICB2YWx1ZTogY29sVmFsdWVzW2ldLFxuICAgICAgcm93VmFsdWU6IHRoaXMudGFibGVEYXRhW2ldLFxuICAgICAgc2VsZWN0ZWQ6IGZpbHRlcj8ub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU4gJiYgKGZpbHRlcj8udmFsdWVzIHx8IFtdKS5pbmRleE9mKGNvbFZhbHVlc1tpXSkgIT09IC0xLFxuICAgICAgLy8gc3RvcmluZyB0aGUgZmlyc3QgaW5kZXggd2hlcmUgdGhpcyByZW5kZXJlZFZhbHVlIGlzIG9idGFpbmVkLiBJbiB0aGUgdGVtcGxhdGUgb2YgdGhpcyBjb21wb25lbnQgdGhlIGNvbHVtbiByZW5kZXJlciB3aWxsIG9idGFpbiB0aGVcbiAgICAgIC8vIHJvdyB2YWx1ZSBvZiB0aGlzIGluZGV4XG4gICAgICB0YWJsZUluZGV4OiBpXG4gICAgfSk7XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZXNGaWx0ZXIoKTogT0NvbHVtblZhbHVlRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlciA9IHtcbiAgICAgIGF0dHI6IHRoaXMuY29sdW1uLmF0dHIsXG4gICAgICBvcGVyYXRvcjogdW5kZWZpbmVkLFxuICAgICAgdmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBhdmFpbGFibGVWYWx1ZXM6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuaXNDdXN0b21GaWx0ZXJTdWJqZWN0LmdldFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gdGhpcy5zZWxlY3RlZFZhbHVlcztcbiAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yID0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5JTjtcbiAgICAgICAgZmlsdGVyLnZhbHVlcyA9IHNlbGVjdGVkVmFsdWVzLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gICAgICAgIGZpbHRlci5hdmFpbGFibGVWYWx1ZXMgPSB0aGlzLmNvbHVtbkRhdGE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZjVGV4dC52YWx1ZSkge1xuICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMO1xuICAgICAgICBmaWx0ZXIudmFsdWVzID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUZXh0KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZjRnJvbS52YWx1ZSAmJiB0aGlzLmZjVG8udmFsdWUpIHtcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yID0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOO1xuICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSB0aGlzLmdldFR5cGVkVmFsdWUodGhpcy5mY0Zyb20pO1xuICAgICAgICBjb25zdCB0b1ZhbHVlID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUbyk7XG4gICAgICAgIGZpbHRlci52YWx1ZXMgPSBmcm9tVmFsdWUgPD0gdG9WYWx1ZSA/IFtmcm9tVmFsdWUsIHRvVmFsdWVdIDogW3RvVmFsdWUsIGZyb21WYWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5mY0Zyb20udmFsdWUpIHtcbiAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw7XG4gICAgICAgICAgZmlsdGVyLnZhbHVlcyA9IHRoaXMuZ2V0VHlwZWRWYWx1ZSh0aGlzLmZjRnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmNUby52YWx1ZSkge1xuICAgICAgICAgIGZpbHRlci5vcGVyYXRvciA9IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTEVTU19FUVVBTDtcbiAgICAgICAgICBmaWx0ZXIudmFsdWVzID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUbyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIGNsZWFyVmFsdWVzKCkge1xuICAgIGlmICh0aGlzLmlzVGV4dFR5cGUoKSkge1xuICAgICAgdGhpcy5mY1RleHQuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEYXRlVHlwZSgpIHx8IHRoaXMuaXNOdW1lcmljVHlwZSgpKSB7XG4gICAgICB0aGlzLmZjRnJvbS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5mY1RvLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlja1NvcnRWYWx1ZXMoKSB7XG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2FzYyc6XG4gICAgICAgIHRoaXMuYWN0aXZlU29ydERpcmVjdGlvbiA9ICdkZXNjJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXNjJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLm9uU29ydEZpbHRlclZhbHVlc0NoYW5nZS5lbWl0KHRoaXMuZ2V0RmlsdGVyQ29sdW1uKCkpO1xuICAgIHRoaXMuc29ydERhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzb3J0RGF0YSgpIHtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5jb2x1bW5EYXRhKTtcbiAgICBpZiAodGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgdGhpcy5saXN0RGF0YVN1YmplY3QubmV4dChzb3J0ZWREYXRhLnNvcnQodGhpcy5zb3J0RnVuY3Rpb24uYmluZCh0aGlzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpc3REYXRhU3ViamVjdC5uZXh0KHNvcnRlZERhdGEpO1xuICAgIH1cblxuICB9XG5cbiAgcHJvdGVjdGVkIHNvcnRGdW5jdGlvbihhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHByb3BlcnR5QTogbnVtYmVyIHwgc3RyaW5nID0gJyc7XG4gICAgbGV0IHByb3BlcnR5QjogbnVtYmVyIHwgc3RyaW5nID0gJyc7XG4gICAgW3Byb3BlcnR5QSwgcHJvcGVydHlCXSA9IFthWyd2YWx1ZSddLCBiWyd2YWx1ZSddXTtcblxuICAgIHJldHVybiBVdGlsLnNvcnRGdW5jdGlvbihwcm9wZXJ0eUEsIHByb3BlcnR5QiwgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIG9uU2xpZGVDaGFuZ2UoZTogTWF0U2xpZGVUb2dnbGVDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ3VzdG9tRmlsdGVyU3ViamVjdC5uZXh0KGUuY2hlY2tlZCk7XG5cbiAgICBpZiAoIWUuY2hlY2tlZCkge1xuICAgICAgLy8gU2VsZWN0aW9uIG1vZGVcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMaXN0KCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVyRXZlbnQoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGlzVGV4dFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzTnVtZXJpY1R5cGUoKSAmJiAhdGhpcy5pc0RhdGVUeXBlKCk7XG4gIH1cblxuICBpc051bWVyaWNUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbJ2ludGVnZXInLCAncmVhbCcsICdjdXJyZW5jeSddLmluZGV4T2YodGhpcy5jb2x1bW4udHlwZSkgIT09IC0xO1xuICB9XG5cbiAgaXNEYXRlVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ2RhdGUnID09PSB0aGlzLmNvbHVtbi50eXBlO1xuICB9XG5cbiAgZ2V0Rml4ZWREaW1lbnNpb25DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc2VsZWN0aW9uJyB8fCB0aGlzLm1vZGUgPT09ICdkZWZhdWx0JztcbiAgfVxuXG4gIGdldFNvcnRCeUFscGhhSWNvbigpIHtcbiAgICBsZXQgaWNvbiA9ICdvbnRpbWl6ZTpzb3J0X2J5X2FscGhhJztcbiAgICBpZiAodGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgaWNvbiArPSAnXycgKyB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBpY29uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpbHRlckNvbHVtbigpOiBPRmlsdGVyQ29sdW1uIHtcbiAgICBsZXQgb2JqOiBPRmlsdGVyQ29sdW1uID0geyBhdHRyOiAnJywgc29ydDogJycsIHN0YXJ0VmlldzogJycgfTtcbiAgICBvYmouYXR0ciA9IHRoaXMuY29sdW1uLmF0dHI7XG4gICAgb2JqLnNvcnQgPSB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb247XG4gICAgb2JqLnN0YXJ0VmlldyA9IHRoaXMuc3RhcnRWaWV3O1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhcnRlZFZpZXdEYXRlcGlja2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRWaWV3O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFR5cGVkVmFsdWUoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogYW55IHtcbiAgICBsZXQgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY1R5cGUoKSkge1xuICAgICAgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0RhdGVUeXBlKCkpIHtcbiAgICAgIHZhbHVlID0gY29udHJvbC52YWx1ZS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBvbkNoYW5nZURhdGFTb3VyY2UoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKSB7XG4gICAgdGhpcy5nZXREYXRhKGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YShzb3VyY2VEYXRhOiBzdHJpbmcpIHtcbiAgICBpZiAoc291cmNlRGF0YSA9PT0gJ2N1cnJlbnQtcGFnZScpIHtcbiAgICAgIC8qR2V0IGZpbHRlciB2YWx1ZXMgb24gdGhlIGN1cnJlbnQgcGFnZSovXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMudGFibGUuZGF0YVNvdXJjZS5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMudGFibGUucGFnZWFibGUpIHtcbiAgICAgIC8qR2V0IGZpbHRlciB2YWx1ZXMgb24gdGhlIGFsbCBwYWdlcyovXG4gICAgICB0aGlzLnF1ZXJ5QnlGaWx0ZXJDb2x1bW5TdWJzY3JpcHRpb24gPSB0aGlzLnF1ZXJ5QnlGaWx0ZXJDb2x1bW4odGhpcy5jb2x1bW4uYXR0cikuc3Vic2NyaWJlKChyZXM6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgZGF0YSA9IHJlcy5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLnRhYmxlLmdldEFsbFZhbHVlcygpO1xuICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcXVlcnlCeUZpbHRlckNvbHVtbihhdHRyOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlcnZpY2VSZXNwb25zZT4gfCBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgY29uc3Qga3YgPSB0aGlzLnRhYmxlLmdldENvbXBvbmVudEZpbHRlcigpO1xuICAgIGNvbnN0IGF2ID0gW2F0dHJdO1xuICAgIGxldCBzcWxUeXBlcyA9IHt9O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChrdikgJiYgIVV0aWwuaXNPYmplY3RFbXB0eShrdikpIHtcbiAgICAgIHNxbFR5cGVzID0gdGhpcy50YWJsZS5nZXRTcWxUeXBlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtblF1ZXJ5QXJncyA9IFtrdiwgYXYsIHRoaXMudGFibGUuZW50aXR5LCBzcWxUeXBlcywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5xdWVyeU1ldGhvZE5hbWUgfHwgQ29kZXMuUVVFUllfTUVUSE9EO1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnRhYmxlLmdldFNlcnZpY2UoKTtcbiAgICBpZiAoc2VydmljZSAmJiAocXVlcnlNZXRob2ROYW1lIGluIHNlcnZpY2UpICYmIHRoaXMudGFibGUuZW50aXR5KSB7XG4gICAgICByZXR1cm4gc2VydmljZVtxdWVyeU1ldGhvZE5hbWVdKC4uLmNvbHVtblF1ZXJ5QXJncylcbiAgICB9XG4gICAgcmV0dXJuIG9mKHt9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb2x1bW5EYXRhVXNpbmdSZW5kZXJlcigpIHtcbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IHRoaXMuY29sdW1uLnJlbmRlcmVyICYmIHRoaXMuY29sdW1uLnJlbmRlcmVyLmdldENlbGxEYXRhO1xuICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5tYXAoKHJvdykgPT4gdXNlUmVuZGVyZXIgPyB0aGlzLmNvbHVtbi5yZW5kZXJlci5nZXRDZWxsRGF0YShyb3dbdGhpcy5jb2x1bW4uYXR0cl0sIHJvdykgOiByb3dbdGhpcy5jb2x1bW4uYXR0cl0pO1xuICB9XG59XG4iLCI8c3BhbiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdUQUJMRS5CVVRUT05TLkZJTFRFUl9CWV9DT0xVTU4nIHwgb1RyYW5zbGF0ZSB9fToge3sgY29sdW1uLnRpdGxlIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwiZGlhbG9nLWxpc3QtY29udGFpbmVyXCI+XG4gIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiIFtjbGFzcy5jb250ZW50LXdyYXBwZXItZml4ZWQtZGltZW5zaW9uXT1cImdldEZpeGVkRGltZW5zaW9uQ2xhc3MoKVwiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNjdXN0b21GaWx0ZXJTbGlkZSAoY2hhbmdlKT1cIm9uU2xpZGVDaGFuZ2UoJGV2ZW50KVwiIFtjaGVja2VkXT1cIihpc0N1c3RvbUZpbHRlciB8IGFzeW5jKVwiICpuZ0lmPVwiaXNEZWZhdWx0RmlsdGVyIHwgYXN5bmNcIj5cbiAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkNVU1RPTV9GSUxURVInIHwgb1RyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8ZGl2IGZ4RmxleD1cIjEgMSAxMDAlXCIgKm5nSWY9XCIhKGlzQ3VzdG9tRmlsdGVyIHwgYXN5bmMpO2Vsc2UgY3VzdG9tRmlsdGVyVGVtcGxhdGVcIiBmeExheW91dD1cImNvbHVtblwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaGludGVkXCI+XG4gICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXggc3ZnSWNvbj1cIm9udGltaXplOnNlYXJjaFwiPjwvbWF0LWljb24+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCAjZmlsdGVyIHBsYWNlaG9sZGVyPVwie3sgJ1RBQkxFLkZJTFRFUicgfCBvVHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxtYXQtaGludD57eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5ISU5UX1NUQVInIHwgb1RyYW5zbGF0ZSB9fTwvbWF0LWhpbnQ+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPGRpdiAqbmdJZj1cIihsaXN0RGF0YSB8IGFzeW5jKS5sZW5ndGggPiAwOyBlbHNlIGVtcHR5TGlzdERhdGFcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgc3RhcnRcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiIFtjaGVja2VkXT1cImFyZUFsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJpc0luZGV0ZXJtaW5hdGUoKVwiIFtkaXNhYmxlZF09XCIhbGlzdERhdGFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCI+XG4gICAgICAgICAgICB7eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5DSEVDS19BTEwnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxpc3REYXRhXCIgY2xhc3M9XCJjb2x1bW4tZmlsdGVyLWVtcHR5LWxpc3RcIj5cbiAgICAgICAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkxJU1RfRU1QVFlfRklMVEVSJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0YXJ0XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkNsaWNrU29ydFZhbHVlcygpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiZ2V0U29ydEJ5QWxwaGFJY29uKClcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiICpuZ0lmPVwic2hvd0ZpbHRlclZhbHVlc09wdGlvblwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwiZmlsdGVydmFsdWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG1hdC1zdWJoZWFkZXI+XG4gICAgICAgICAgICAgICAge3snVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5MQUJFTF9EQVRBJyB8IG9UcmFuc2xhdGV9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIkRhdGFcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMTJweFwiIFsobmdNb2RlbCldPVwic291cmNlRGF0YVwiIChjaGFuZ2UpPVwib25DaGFuZ2VEYXRhU291cmNlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImN1cnJlbnQtcGFnZVwiPnt7J1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uQ1VSUkVOVF9QQUdFJyB8IG9UcmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImFsbC1kYXRhXCI+e3snVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5BTExfUEFHRScgfCBvVHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUxpc3REYXRhPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbi1maWx0ZXItZW1wdHktbGlzdFwiPlxuICAgICAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkxJU1RfRU1QVFknIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IGl0ZW1TaXplPVwiMjVcIiBmeEZsZXg+XG4gICAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgKm5nSWY9XCJwcmVsb2FkVmFsdWVzIHx8IGxpc3REYXRhXCIgI2ZpbHRlclZhbHVlTGlzdCBjbGFzcz1cInNlbGVjdC12YWx1ZXMtbGlzdFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3QoJGV2ZW50KVwiPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCByZWNvcmQgb2YgKGxpc3REYXRhIHwgYXN5bmMpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIGNoZWNrYm94UG9zaXRpb249XCJiZWZvcmVcIiBbc2VsZWN0ZWRdPVwicmVjb3JkLnNlbGVjdGVkXCIgW3ZhbHVlXT1cInJlY29yZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5yZW5kZXJlclwiPlxuICAgICAgICAgICAgICAgIHt7IHJlY29yZC52YWx1ZSB8fCAoJ1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uRU1QVFlfVkFMVUUnIHwgb1RyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbHVtbi5yZW5kZXJlclwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5yZW5kZXJlci50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY2VsbHZhbHVlOiByZWNvcmQudmFsdWUsIHJvd3ZhbHVlOiByZWNvcmQucm93VmFsdWUgfVwiPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuXG48bWF0LWRpYWxvZy1hY3Rpb25zIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwiY2xlYXJBY3Rpb25cIiBjbGFzcz1cIm8tYnV0dG9uLWluZm9cIj5cbiAgICB7eyAnVEFCTEUuQlVUVE9OUy5GSUxURVJfQ0xFQVInIHwgb1RyYW5zbGF0ZSB9fSA8L2J1dHRvbj5cbiAgPHNwYW4gYWxpZ249XCJlbmRcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwiY2FuY2VsQWN0aW9uXCIgY2xhc3M9XCJvLWJ1dHRvbi1kZWZhdWx0IGNhbmNlbFwiPlxuICAgICAge3sgJ0NBTkNFTCcgfCBvVHJhbnNsYXRlIH19IDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJhY2NlcHRBY3Rpb25cIiBjbGFzcz1cIm8tYnV0dG9uLXByaW1hcnlcIj5cbiAgICAgIHt7ICdBQ0NFUFQnIHwgb1RyYW5zbGF0ZSB9fSA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG5cbjwhLS0gVEVNUExBVEUgQ1VTVE9NIEZJTFRFUi0tPlxuPG5nLXRlbXBsYXRlICNjdXN0b21GaWx0ZXJUZW1wbGF0ZT5cbiAgPGRpdiAqbmdJZj1cImlzVGV4dFR5cGUoKVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXggY2xhc3M9XCJoaW50ZWRcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCAjZmlsdGVyVGV4dCBbZm9ybUNvbnRyb2xdPVwiZmNUZXh0XCIgcGxhY2Vob2xkZXI9XCJ7eyAnVEFCTEUuRklMVEVSJyB8IG9UcmFuc2xhdGUgfX1cIj5cbiAgICAgIDxtYXQtaGludD57eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5ISU5UX1NUQVInIHwgb1RyYW5zbGF0ZSB9fTwvbWF0LWhpbnQ+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjbGVhclZhbHVlcygpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6Y2xvc2VcIj48L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc051bWVyaWNUeXBlKClcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiIGZ4TGF5b3V0R2FwPVwiMTJweFwiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZmNGcm9tXCIgcGxhY2Vob2xkZXI9XCJ7eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5GUk9NJyB8IG9UcmFuc2xhdGUgfX1cIj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZmNUb1wiIHBsYWNlaG9sZGVyPVwie3sgJ1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uVE8nIHwgb1RyYW5zbGF0ZSB9fVwiPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjbGVhclZhbHVlcygpXCI+XG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc0RhdGVUeXBlKClcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiIGZ4TGF5b3V0R2FwPVwiMTJweFwiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlcGlja2VyRnJvbVwiIFttYXhdPVwiZmNUby52YWx1ZVwiIFtmb3JtQ29udHJvbF09XCJmY0Zyb21cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkZST00nIHwgb1RyYW5zbGF0ZSB9fVwiPlxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRlcGlja2VyRnJvbVwiPlxuICAgICAgICA8bWF0LWljb24gbWF0RGF0ZXBpY2tlclRvZ2dsZUljb24+dG9kYXk8L21hdC1pY29uPlxuICAgICAgPC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVwaWNrZXJGcm9tIFtzdGFydFZpZXddPVwiZ2V0U3RhcnRlZFZpZXdEYXRlcGlja2VyKClcIj48L21hdC1kYXRlcGlja2VyPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cImRhdGVwaWNrZXJUb1wiIFttaW5dPVwiZmNGcm9tLnZhbHVlXCIgW2Zvcm1Db250cm9sXT1cImZjVG9cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLlRPJyB8IG9UcmFuc2xhdGUgfX1cIj5cbiAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZGF0ZXBpY2tlclRvXCI+XG4gICAgICAgIDxtYXQtaWNvbiBtYXREYXRlcGlja2VyVG9nZ2xlSWNvbj50b2RheTwvbWF0LWljb24+XG4gICAgICA8L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZXBpY2tlclRvIFtzdGFydFZpZXddPVwiZ2V0U3RhcnRlZFZpZXdEYXRlcGlja2VyKClcIj48L21hdC1kYXRlcGlja2VyPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiY2xlYXJWYWx1ZXMoKVwiPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTpjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuIl19
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUdsRixPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSx1REFBdUQsQ0FBQztBQUN0SCxPQUFPLEVBQTJCLCtCQUErQixFQUFFLE1BQU0sK0RBQStE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LG1DQUFtQyxFQUFFLE1BQU07cUJBQzVDOzswQkF5Q0UsTUFBTTsyQkFBQyxlQUFlOzRDQVhKLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUTtnQkFDVyxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNlbGVjdGlvbkxpc3QsIE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdFJhZGlvQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IsIE9Db2x1bW5WYWx1ZUZpbHRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXZhbHVlLWZpbHRlci50eXBlJztcbmltcG9ydCB7IFRhYmxlRmlsdGVyQnlDb2x1bW5EYXRhLCBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9vLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRmlsdGVyQ29sdW1uIH0gZnJvbSAnLi4vLi4vaGVhZGVyL3RhYmxlLWNvbHVtbnMtZmlsdGVyL2NvbHVtbnMvby10YWJsZS1jb2x1bW5zLWZpbHRlci1jb2x1bW4uY29tcG9uZW50JztcblxuaW1wb3J0IHR5cGUgeyBPQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vY29sdW1uL28tY29sdW1uLmNsYXNzJztcblxuY29uc3QgQ1VTVE9NX0ZJTFRFUlNfT1BFUkFUT1JTID0gW0NvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTEVTU19FUVVBTCwgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5NT1JFX0VRVUFMLCBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkJFVFdFRU4sIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUxdO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJ28tdGFibGUtZmlsdGVyLWJ5LWNvbHVtbi1kYXRhLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydvLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tZmlsdGVyLWJ5LWNvbHVtbi1kaWFsb2ddJzogJ3RydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgcHVibGljIGFjY2VwdEFjdGlvbiA9IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQUNDRVBUO1xuICBwdWJsaWMgY2FuY2VsQWN0aW9uID0gVGFibGVGaWx0ZXJCeUNvbHVtbkRpYWxvZ1Jlc3VsdC5DQU5DRUw7XG4gIHB1YmxpYyBjbGVhckFjdGlvbiA9IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQ0xFQVI7XG5cbiAgY29sdW1uOiBPQ29sdW1uO1xuICBwcmVsb2FkVmFsdWVzOiBib29sZWFuID0gdHJ1ZTtcbiAgbW9kZTogc3RyaW5nO1xuICBzdGFydFZpZXc6ICdtb250aCcgfCAneWVhcicgfCAnbXVsdGkteWVhcicgfCAnJztcblxuICBwdWJsaWMgb25Tb3J0RmlsdGVyVmFsdWVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8T0ZpbHRlckNvbHVtbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNDdXN0b21GaWx0ZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzQ3VzdG9tRmlsdGVyOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5pc0N1c3RvbUZpbHRlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0RlZmF1bHRGaWx0ZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzRGVmYXVsdEZpbHRlcjogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNEZWZhdWx0RmlsdGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBmY1RleHQgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIGZjRnJvbSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcbiAgZmNUbyA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcblxuICBwcm90ZWN0ZWQgY29sdW1uRGF0YTogVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFbXSA9IFtdO1xuICBwcm90ZWN0ZWQgdGFibGVEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdERhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUZpbHRlckJ5Q29sdW1uRGF0YVtdPihbXSk7XG4gIHByb3RlY3RlZCBfbGlzdERhdGE6IE9ic2VydmFibGU8VGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFbXT4gPSB0aGlzLmxpc3REYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBAVmlld0NoaWxkKCdmaWx0ZXInKSBmaWx0ZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlclZhbHVlTGlzdCcpIGZpbHRlclZhbHVlTGlzdDogTWF0U2VsZWN0aW9uTGlzdDtcbiAgcHVibGljIGFjdGl2ZVNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJyc7XG4gIHNvdXJjZURhdGE7XG4gIHF1ZXJ5QnlGaWx0ZXJDb2x1bW5TdWJzY3JpcHRpb246IGFueTtcbiAgdGFibGU6IE9UYWJsZUNvbXBvbmVudDtcbiAgc2hvd0ZpbHRlclZhbHVlc09wdGlvbjogYm9vbGVhbjtcbiAgcXVlcnlNZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIGRhdGE6IGFueVxuICApIHtcblxuICAgIGlmIChkYXRhLmNvbHVtbikge1xuICAgICAgdGhpcy5jb2x1bW4gPSBkYXRhLmNvbHVtbjtcbiAgICB9XG4gICAgdGhpcy50YWJsZSA9IGRhdGEudGFibGU7XG5cbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLnNob3dGaWx0ZXJWYWx1ZXNPcHRpb24gPSB0aGlzLnRhYmxlLnBhZ2luYXRpb25Db250cm9scztcbiAgICB0aGlzLnNvdXJjZURhdGEgPVxuICAgICAgdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5nZXRGaWx0ZXJWYWx1ZXNJbkRhdGEodGhpcy5jb2x1bW4uYXR0cikgfHxcbiAgICAgIHRoaXMudGFibGUub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudD8uZmlsdGVyVmFsdWVzSW5EYXRhIHx8XG4gICAgICAodGhpcy50YWJsZS5wYWdlYWJsZSA/ICdjdXJyZW50LXBhZ2UnIDogJ2FsbC1kYXRhJyk7XG5cbiAgICB0aGlzLm1vZGUgPSB0aGlzLnRhYmxlLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQgPyB0aGlzLnRhYmxlLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQubW9kZSA6ICdkZWZhdWx0JztcbiAgICB0aGlzLmlzRGVmYXVsdEZpbHRlclN1YmplY3QubmV4dCh0aGlzLm1vZGUgPT09ICdkZWZhdWx0Jyk7XG4gICAgdGhpcy5pc0N1c3RvbUZpbHRlclN1YmplY3QubmV4dCh0aGlzLm1vZGUgPT09ICdjdXN0b20nKTtcblxuICAgIGxldCBwcmV2aW91c0ZpbHRlcjogT0NvbHVtblZhbHVlRmlsdGVyID0gdGhpcy50YWJsZS5kYXRhU291cmNlLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKHRoaXMuY29sdW1uLmF0dHIpIHx8IHtcbiAgICAgIGF0dHI6IHVuZGVmaW5lZCxcbiAgICAgIG9wZXJhdG9yOiB1bmRlZmluZWQsXG4gICAgICB2YWx1ZXM6IHVuZGVmaW5lZCxcbiAgICAgIGF2YWlsYWJsZVZhbHVlczogdW5kZWZpbmVkXG4gICAgfTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwcmV2aW91c0ZpbHRlci5vcGVyYXRvcikpIHtcbiAgICAgIHRoaXMuaXNDdXN0b21GaWx0ZXJTdWJqZWN0Lm5leHQoQ1VTVE9NX0ZJTFRFUlNfT1BFUkFUT1JTLmluZGV4T2YocHJldmlvdXNGaWx0ZXIub3BlcmF0b3IpICE9PSAtMSk7XG4gICAgfVxuXG4gICAgdGhpcy5wcmVsb2FkVmFsdWVzID0gdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID8gdGhpcy50YWJsZS5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LnByZWxvYWRWYWx1ZXMgOiB0cnVlO1xuICAgIHRoaXMuYWN0aXZlU29ydERpcmVjdGlvbiA9IHRoaXMudGFibGUuZ2V0U29ydEZpbHRlckNvbHVtbih0aGlzLmNvbHVtbikgfHwgJyc7XG4gICAgdGhpcy5zdGFydFZpZXcgPSB0aGlzLnRhYmxlLmdldFN0YXJ0Vmlld0ZpbHRlckNvbHVtbih0aGlzLmNvbHVtbikgfHwgJ21vbnRoJ1xuXG4gICAgY29uc3QgcXVlcnlNZXRob2QgPSB0aGlzLnRhYmxlLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmdldFF1ZXJ5TWV0aG9kT2ZGaWx0ZXJDb2x1bW4odGhpcy5jb2x1bW4uYXR0cik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHF1ZXJ5TWV0aG9kKSkge1xuICAgICAgdGhpcy5xdWVyeU1ldGhvZE5hbWUgPSBxdWVyeU1ldGhvZDtcbiAgICAgIHRoaXMuc291cmNlRGF0YSA9ICdhbGwtZGF0YSc7XG4gICAgfVxuICAgIHRoaXMuZ2V0RGF0YSh0aGlzLnNvdXJjZURhdGEpO1xuICB9XG5cblxuICBwcml2YXRlIHBhcnNlRGF0YUFuZEluaXRpYWxpemVEYXRhTGlzdChwcmV2aW91c0ZpbHRlcjogT0NvbHVtblZhbHVlRmlsdGVyKSB7XG5cbiAgICB0aGlzLnBhcnNlTGlzdERhdGEocHJldmlvdXNGaWx0ZXIpO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHByZXZpb3VzRmlsdGVyKSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplQ3VzdG9tRmlsdGVyVmFsdWVzKHByZXZpb3VzRmlsdGVyKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplRGF0YUxpc3QocHJldmlvdXNGaWx0ZXIpO1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplRmlsdGVyRXZlbnQoKTtcbiAgfVxuXG4gIGdldCBsaXN0RGF0YSgpOiBPYnNlcnZhYmxlPFRhYmxlRmlsdGVyQnlDb2x1bW5EYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdERhdGE7XG4gIH1cblxuICBzZXQgbGlzdERhdGEoYXJnOiBPYnNlcnZhYmxlPFRhYmxlRmlsdGVyQnlDb2x1bW5EYXRhW10+KSB7XG4gICAgdGhpcy5fbGlzdERhdGEgPSBhcmc7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZURhdGFMaXN0KGZpbHRlcj86IE9Db2x1bW5WYWx1ZUZpbHRlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRWYWx1ZXMgfHwgKGZpbHRlciAmJiBmaWx0ZXIub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU4pKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID09PSBDb2Rlcy5BU0NfU09SVCB8fCB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb24gPT09IENvZGVzLkRFU0NfU09SVCkge1xuICAgICAgICB0aGlzLnNvcnREYXRhKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpc3REYXRhU3ViamVjdC5uZXh0KHRoaXMuY29sdW1uRGF0YS5zbGljZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUZpbHRlckV2ZW50KCkge1xuICAgIGlmICh0aGlzLmZpbHRlcikge1xuICAgICAgZnJvbUV2ZW50KHRoaXMuZmlsdGVyLm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcpXG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNTApKVxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBsZXQgZmlsdGVyVmFsdWU6IHN0cmluZyA9IHRoaXMuZmlsdGVyLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBVdGlsLm5vcm1hbGl6ZVN0cmluZyhmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgaWYgKGZpbHRlclZhbHVlLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdERhdGFTdWJqZWN0Lm5leHQodGhpcy5jb2x1bW5EYXRhLmZpbHRlcihpdGVtID0+IG5ldyBSZWdFeHAoJ14nICsgVXRpbC5ub3JtYWxpemVTdHJpbmcoZmlsdGVyVmFsdWUpLnNwbGl0KCcqJykuam9pbignLionKSArICckJykudGVzdChVdGlsLm5vcm1hbGl6ZVN0cmluZyhpdGVtLnJlbmRlcmVkVmFsdWUpKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3REYXRhU3ViamVjdC5uZXh0KHRoaXMuY29sdW1uRGF0YS5maWx0ZXIoaXRlbSA9PiAoVXRpbC5ub3JtYWxpemVTdHJpbmcoaXRlbS5yZW5kZXJlZFZhbHVlKS5pbmRleE9mKGZpbHRlclZhbHVlKSAhPT0gLTEpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUN1c3RvbUZpbHRlclZhbHVlcyhmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcik6IHZvaWQge1xuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSBmaWx0ZXIub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgIGlmICh0aGlzLmlzVGV4dFR5cGUoKSkge1xuICAgICAgICAgIHRoaXMuZmNUZXh0LnNldFZhbHVlKGZpbHRlci52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBmaWx0ZXIub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuQkVUV0VFTjpcbiAgICAgICAgdGhpcy5mY0Zyb20uc2V0VmFsdWUodGhpcy5pc0RhdGVUeXBlKCkgPyBuZXcgRGF0ZShmaWx0ZXIudmFsdWVzWzBdKSA6IGZpbHRlci52YWx1ZXNbMF0pO1xuICAgICAgICB0aGlzLmZjVG8uc2V0VmFsdWUodGhpcy5pc0RhdGVUeXBlKCkgPyBuZXcgRGF0ZShmaWx0ZXIudmFsdWVzWzFdKSA6IGZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZmlsdGVyLm9wZXJhdG9yID09PSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw6XG4gICAgICAgIHRoaXMuZmNGcm9tLnNldFZhbHVlKHRoaXMuaXNEYXRlVHlwZSgpID8gbmV3IERhdGUoZmlsdGVyLnZhbHVlcykgOiBmaWx0ZXIudmFsdWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGZpbHRlci5vcGVyYXRvciA9PT0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5MRVNTX0VRVUFMOlxuICAgICAgICB0aGlzLmZjVG8uc2V0VmFsdWUodGhpcy5pc0RhdGVUeXBlKCkgPyBuZXcgRGF0ZShmaWx0ZXIudmFsdWVzKSA6IGZpbHRlci52YWx1ZXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RlZFZhbHVlcygpOiBUYWJsZUZpbHRlckJ5Q29sdW1uRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZUxpc3QgPyB0aGlzLmZpbHRlclZhbHVlTGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubWFwKHNlbGVjdGVkID0+IHNlbGVjdGVkLnZhbHVlKSA6IFtdO1xuICB9XG5cbiAgYXJlQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID09PSB0aGlzLmNvbHVtbkRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gdGhpcy5zZWxlY3RlZFZhbHVlcztcbiAgICByZXR1cm4gc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZFZhbHVlcy5sZW5ndGggIT09IHRoaXMuY29sdW1uRGF0YS5sZW5ndGg7XG4gIH1cblxuICBvblNlbGVjdChldmVudDogTWF0U2VsZWN0aW9uTGlzdENoYW5nZSkge1xuICAgIGV2ZW50Lm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gb3B0aW9uLnZhbHVlLnNlbGVjdGVkID0gb3B0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmZpbHRlclZhbHVlTGlzdC5zZWxlY3RBbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZUxpc3QuZGVzZWxlY3RBbGwoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VMaXN0RGF0YShmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcik6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uRGF0YSA9IFtdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChmaWx0ZXI/LmF2YWlsYWJsZVZhbHVlcykpIHtcbiAgICAgIHRoaXMuY29sdW1uRGF0YSA9IGZpbHRlci5hdmFpbGFibGVWYWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbFJlbmRlcmVkVmFsdWVzID0gdGhpcy5nZXRDb2x1bW5EYXRhVXNpbmdSZW5kZXJlcigpO1xuICAgICAgY29uc3QgY29sVmFsdWVzOiBhbnlbXSA9IHRoaXMudGFibGVEYXRhLm1hcChlbGVtID0+IGVsZW1bdGhpcy5jb2x1bW4uYXR0cl0pO1xuXG4gICAgICBpZiAodGhpcy50YWJsZS5wYWdlYWJsZSAmJiB0aGlzLnNvdXJjZURhdGEgPT09ICdhbGwtZGF0YScpIHtcbiAgICAgICAgY29sUmVuZGVyZWRWYWx1ZXMuZm9yRWFjaCgocmVuZGVyZWRWYWx1ZSwgaSkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkSW50b0NvbHVtbkRhdGEocmVuZGVyZWRWYWx1ZSwgY29sVmFsdWVzLCBpLCBmaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbFJlbmRlcmVkVmFsdWVzLmZvckVhY2goKHJlbmRlcmVkVmFsdWUsIGkpID0+IHtcbiAgICAgICAgICAvKlNlbGVjdGlvbiBkaXN0aW50IHZhbHVlcyAqL1xuICAgICAgICAgIGlmIChyZW5kZXJlZFZhbHVlID09PSBudWxsIHx8IHJlbmRlcmVkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVuZGVyZWRWYWx1ZSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5yZW5kZXJlZFZhbHVlID09PSByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRJbnRvQ29sdW1uRGF0YShyZW5kZXJlZFZhbHVlLCBjb2xWYWx1ZXMsIGksIGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEludG9Db2x1bW5EYXRhKHJlbmRlcmVkVmFsdWU6IGFueSwgY29sVmFsdWVzOiBhbnlbXSwgaTogbnVtYmVyLCBmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMuY29sdW1uRGF0YS5wdXNoKHtcbiAgICAgIHJlbmRlcmVkVmFsdWU6IHJlbmRlcmVkVmFsdWUsXG4gICAgICB2YWx1ZTogY29sVmFsdWVzW2ldLFxuICAgICAgcm93VmFsdWU6IHRoaXMudGFibGVEYXRhW2ldLFxuICAgICAgc2VsZWN0ZWQ6IGZpbHRlcj8ub3BlcmF0b3IgPT09IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU4gJiYgKGZpbHRlcj8udmFsdWVzIHx8IFtdKS5pbmRleE9mKGNvbFZhbHVlc1tpXSkgIT09IC0xLFxuICAgICAgLy8gc3RvcmluZyB0aGUgZmlyc3QgaW5kZXggd2hlcmUgdGhpcyByZW5kZXJlZFZhbHVlIGlzIG9idGFpbmVkLiBJbiB0aGUgdGVtcGxhdGUgb2YgdGhpcyBjb21wb25lbnQgdGhlIGNvbHVtbiByZW5kZXJlciB3aWxsIG9idGFpbiB0aGVcbiAgICAgIC8vIHJvdyB2YWx1ZSBvZiB0aGlzIGluZGV4XG4gICAgICB0YWJsZUluZGV4OiBpXG4gICAgfSk7XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZXNGaWx0ZXIoKTogT0NvbHVtblZhbHVlRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlciA9IHtcbiAgICAgIGF0dHI6IHRoaXMuY29sdW1uLmF0dHIsXG4gICAgICBvcGVyYXRvcjogdW5kZWZpbmVkLFxuICAgICAgdmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBhdmFpbGFibGVWYWx1ZXM6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuaXNDdXN0b21GaWx0ZXJTdWJqZWN0LmdldFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gdGhpcy5zZWxlY3RlZFZhbHVlcztcbiAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yID0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5JTjtcbiAgICAgICAgZmlsdGVyLnZhbHVlcyA9IHNlbGVjdGVkVmFsdWVzLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gICAgICAgIGZpbHRlci5hdmFpbGFibGVWYWx1ZXMgPSB0aGlzLmNvbHVtbkRhdGE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZjVGV4dC52YWx1ZSkge1xuICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMO1xuICAgICAgICBmaWx0ZXIudmFsdWVzID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUZXh0KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZjRnJvbS52YWx1ZSAmJiB0aGlzLmZjVG8udmFsdWUpIHtcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yID0gQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOO1xuICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSB0aGlzLmdldFR5cGVkVmFsdWUodGhpcy5mY0Zyb20pO1xuICAgICAgICBjb25zdCB0b1ZhbHVlID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUbyk7XG4gICAgICAgIGZpbHRlci52YWx1ZXMgPSBmcm9tVmFsdWUgPD0gdG9WYWx1ZSA/IFtmcm9tVmFsdWUsIHRvVmFsdWVdIDogW3RvVmFsdWUsIGZyb21WYWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5mY0Zyb20udmFsdWUpIHtcbiAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw7XG4gICAgICAgICAgZmlsdGVyLnZhbHVlcyA9IHRoaXMuZ2V0VHlwZWRWYWx1ZSh0aGlzLmZjRnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmNUby52YWx1ZSkge1xuICAgICAgICAgIGZpbHRlci5vcGVyYXRvciA9IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTEVTU19FUVVBTDtcbiAgICAgICAgICBmaWx0ZXIudmFsdWVzID0gdGhpcy5nZXRUeXBlZFZhbHVlKHRoaXMuZmNUbyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIGNsZWFyVmFsdWVzKCkge1xuICAgIGlmICh0aGlzLmlzVGV4dFR5cGUoKSkge1xuICAgICAgdGhpcy5mY1RleHQuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEYXRlVHlwZSgpIHx8IHRoaXMuaXNOdW1lcmljVHlwZSgpKSB7XG4gICAgICB0aGlzLmZjRnJvbS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5mY1RvLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlja1NvcnRWYWx1ZXMoKSB7XG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2FzYyc6XG4gICAgICAgIHRoaXMuYWN0aXZlU29ydERpcmVjdGlvbiA9ICdkZXNjJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXNjJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLm9uU29ydEZpbHRlclZhbHVlc0NoYW5nZS5lbWl0KHRoaXMuZ2V0RmlsdGVyQ29sdW1uKCkpO1xuICAgIHRoaXMuc29ydERhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzb3J0RGF0YSgpIHtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5jb2x1bW5EYXRhKTtcbiAgICBpZiAodGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgdGhpcy5saXN0RGF0YVN1YmplY3QubmV4dChzb3J0ZWREYXRhLnNvcnQodGhpcy5zb3J0RnVuY3Rpb24uYmluZCh0aGlzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpc3REYXRhU3ViamVjdC5uZXh0KHNvcnRlZERhdGEpO1xuICAgIH1cblxuICB9XG5cbiAgcHJvdGVjdGVkIHNvcnRGdW5jdGlvbihhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHByb3BlcnR5QTogbnVtYmVyIHwgc3RyaW5nID0gJyc7XG4gICAgbGV0IHByb3BlcnR5QjogbnVtYmVyIHwgc3RyaW5nID0gJyc7XG4gICAgW3Byb3BlcnR5QSwgcHJvcGVydHlCXSA9IFthWyd2YWx1ZSddLCBiWyd2YWx1ZSddXTtcblxuICAgIHJldHVybiBVdGlsLnNvcnRGdW5jdGlvbihwcm9wZXJ0eUEsIHByb3BlcnR5QiwgdGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIG9uU2xpZGVDaGFuZ2UoZTogTWF0U2xpZGVUb2dnbGVDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ3VzdG9tRmlsdGVyU3ViamVjdC5uZXh0KGUuY2hlY2tlZCk7XG5cbiAgICBpZiAoIWUuY2hlY2tlZCkge1xuICAgICAgLy8gU2VsZWN0aW9uIG1vZGVcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMaXN0KCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVyRXZlbnQoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGlzVGV4dFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzTnVtZXJpY1R5cGUoKSAmJiAhdGhpcy5pc0RhdGVUeXBlKCk7XG4gIH1cblxuICBpc051bWVyaWNUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbJ2ludGVnZXInLCAncmVhbCcsICdjdXJyZW5jeSddLmluZGV4T2YodGhpcy5jb2x1bW4udHlwZSkgIT09IC0xO1xuICB9XG5cbiAgaXNEYXRlVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ2RhdGUnID09PSB0aGlzLmNvbHVtbi50eXBlO1xuICB9XG5cbiAgZ2V0Rml4ZWREaW1lbnNpb25DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc2VsZWN0aW9uJyB8fCB0aGlzLm1vZGUgPT09ICdkZWZhdWx0JztcbiAgfVxuXG4gIGdldFNvcnRCeUFscGhhSWNvbigpIHtcbiAgICBsZXQgaWNvbiA9ICdvbnRpbWl6ZTpzb3J0X2J5X2FscGhhJztcbiAgICBpZiAodGhpcy5hY3RpdmVTb3J0RGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgaWNvbiArPSAnXycgKyB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBpY29uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpbHRlckNvbHVtbigpOiBPRmlsdGVyQ29sdW1uIHtcbiAgICBsZXQgb2JqOiBPRmlsdGVyQ29sdW1uID0geyBhdHRyOiAnJywgc29ydDogJycsIHN0YXJ0VmlldzogJycgfTtcbiAgICBvYmouYXR0ciA9IHRoaXMuY29sdW1uLmF0dHI7XG4gICAgb2JqLnNvcnQgPSB0aGlzLmFjdGl2ZVNvcnREaXJlY3Rpb247XG4gICAgb2JqLnN0YXJ0VmlldyA9IHRoaXMuc3RhcnRWaWV3O1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhcnRlZFZpZXdEYXRlcGlja2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRWaWV3O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFR5cGVkVmFsdWUoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogYW55IHtcbiAgICBsZXQgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY1R5cGUoKSkge1xuICAgICAgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0RhdGVUeXBlKCkpIHtcbiAgICAgIHZhbHVlID0gY29udHJvbC52YWx1ZS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBvbkNoYW5nZURhdGFTb3VyY2UoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKSB7XG4gICAgdGhpcy5nZXREYXRhKGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YShzb3VyY2VEYXRhOiBzdHJpbmcpIHtcbiAgICBpZiAoc291cmNlRGF0YSA9PT0gJ2N1cnJlbnQtcGFnZScpIHtcbiAgICAgIC8qR2V0IGZpbHRlciB2YWx1ZXMgb24gdGhlIGN1cnJlbnQgcGFnZSovXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMudGFibGUuZGF0YVNvdXJjZS5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMudGFibGUucGFnZWFibGUpIHtcbiAgICAgIC8qR2V0IGZpbHRlciB2YWx1ZXMgb24gdGhlIGFsbCBwYWdlcyovXG4gICAgICB0aGlzLnF1ZXJ5QnlGaWx0ZXJDb2x1bW5TdWJzY3JpcHRpb24gPSB0aGlzLnF1ZXJ5QnlGaWx0ZXJDb2x1bW4odGhpcy5jb2x1bW4uYXR0cikuc3Vic2NyaWJlKChyZXM6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgZGF0YSA9IHJlcy5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLnRhYmxlLmdldEFsbFZhbHVlcygpO1xuICAgICAgdGhpcy5wYXJzZURhdGFBbmRJbml0aWFsaXplRGF0YUxpc3QobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcXVlcnlCeUZpbHRlckNvbHVtbihhdHRyOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlcnZpY2VSZXNwb25zZT4gfCBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgY29uc3Qga3YgPSB0aGlzLnRhYmxlLmdldENvbXBvbmVudEZpbHRlcigpO1xuICAgIGNvbnN0IGF2ID0gW2F0dHJdO1xuICAgIGxldCBzcWxUeXBlcyA9IHt9O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChrdikgJiYgIVV0aWwuaXNPYmplY3RFbXB0eShrdikpIHtcbiAgICAgIHNxbFR5cGVzID0gdGhpcy50YWJsZS5nZXRTcWxUeXBlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtblF1ZXJ5QXJncyA9IFtrdiwgYXYsIHRoaXMudGFibGUuZW50aXR5LCBzcWxUeXBlcywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5xdWVyeU1ldGhvZE5hbWUgfHwgQ29kZXMuUVVFUllfTUVUSE9EO1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnRhYmxlLmdldFNlcnZpY2UoKTtcbiAgICBpZiAoc2VydmljZSAmJiAocXVlcnlNZXRob2ROYW1lIGluIHNlcnZpY2UpICYmIHRoaXMudGFibGUuZW50aXR5KSB7XG4gICAgICByZXR1cm4gc2VydmljZVtxdWVyeU1ldGhvZE5hbWVdKC4uLmNvbHVtblF1ZXJ5QXJncylcbiAgICB9XG4gICAgcmV0dXJuIG9mKHt9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb2x1bW5EYXRhVXNpbmdSZW5kZXJlcigpIHtcbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IHRoaXMuY29sdW1uLnJlbmRlcmVyICYmIHRoaXMuY29sdW1uLnJlbmRlcmVyLmdldENlbGxEYXRhO1xuICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5tYXAoKHJvdykgPT4gdXNlUmVuZGVyZXIgPyB0aGlzLmNvbHVtbi5yZW5kZXJlci5nZXRDZWxsRGF0YShyb3dbdGhpcy5jb2x1bW4uYXR0cl0sIHJvdykgOiByb3dbdGhpcy5jb2x1bW4uYXR0cl0pO1xuICB9XG59XG4iLCI8c3BhbiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdUQUJMRS5CVVRUT05TLkZJTFRFUl9CWV9DT0xVTU4nIHwgb1RyYW5zbGF0ZSB9fToge3sgY29sdW1uLnRpdGxlIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwiZGlhbG9nLWxpc3QtY29udGFpbmVyXCI+XG4gIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiIFtjbGFzcy5jb250ZW50LXdyYXBwZXItZml4ZWQtZGltZW5zaW9uXT1cImdldEZpeGVkRGltZW5zaW9uQ2xhc3MoKVwiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNjdXN0b21GaWx0ZXJTbGlkZSAoY2hhbmdlKT1cIm9uU2xpZGVDaGFuZ2UoJGV2ZW50KVwiIFtjaGVja2VkXT1cIihpc0N1c3RvbUZpbHRlciB8IGFzeW5jKVwiICpuZ0lmPVwiaXNEZWZhdWx0RmlsdGVyIHwgYXN5bmNcIj5cbiAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkNVU1RPTV9GSUxURVInIHwgb1RyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8ZGl2IGZ4RmxleD1cIjEgMSAxMDAlXCIgKm5nSWY9XCIhKGlzQ3VzdG9tRmlsdGVyIHwgYXN5bmMpO2Vsc2UgY3VzdG9tRmlsdGVyVGVtcGxhdGVcIiBmeExheW91dD1cImNvbHVtblwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaGludGVkXCI+XG4gICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXggc3ZnSWNvbj1cIm9udGltaXplOnNlYXJjaFwiPjwvbWF0LWljb24+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCAjZmlsdGVyIHBsYWNlaG9sZGVyPVwie3sgJ1RBQkxFLkZJTFRFUicgfCBvVHJhbnNsYXRlIH19XCI+XG4gICAgICAgIDxtYXQtaGludD57eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5ISU5UX1NUQVInIHwgb1RyYW5zbGF0ZSB9fTwvbWF0LWhpbnQ+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPGRpdiAqbmdJZj1cIihsaXN0RGF0YSB8IGFzeW5jKS5sZW5ndGggPiAwOyBlbHNlIGVtcHR5TGlzdERhdGFcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgc3RhcnRcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiIFtjaGVja2VkXT1cImFyZUFsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJpc0luZGV0ZXJtaW5hdGUoKVwiIFtkaXNhYmxlZF09XCIhbGlzdERhdGFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCI+XG4gICAgICAgICAgICB7eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5DSEVDS19BTEwnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxpc3REYXRhXCIgY2xhc3M9XCJjb2x1bW4tZmlsdGVyLWVtcHR5LWxpc3RcIj5cbiAgICAgICAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkxJU1RfRU1QVFlfRklMVEVSJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0YXJ0XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkNsaWNrU29ydFZhbHVlcygpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiZ2V0U29ydEJ5QWxwaGFJY29uKClcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiICpuZ0lmPVwic2hvd0ZpbHRlclZhbHVlc09wdGlvblwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwiZmlsdGVydmFsdWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG1hdC1zdWJoZWFkZXI+XG4gICAgICAgICAgICAgICAge3snVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5MQUJFTF9EQVRBJyB8IG9UcmFuc2xhdGV9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIkRhdGFcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMTJweFwiIFsobmdNb2RlbCldPVwic291cmNlRGF0YVwiIChjaGFuZ2UpPVwib25DaGFuZ2VEYXRhU291cmNlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImN1cnJlbnQtcGFnZVwiPnt7J1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uQ1VSUkVOVF9QQUdFJyB8IG9UcmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImFsbC1kYXRhXCI+e3snVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5BTExfUEFHRScgfCBvVHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUxpc3REYXRhPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbi1maWx0ZXItZW1wdHktbGlzdFwiPlxuICAgICAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkxJU1RfRU1QVFknIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IGl0ZW1TaXplPVwiMjVcIiBmeEZsZXg+XG4gICAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgKm5nSWY9XCJwcmVsb2FkVmFsdWVzIHx8IGxpc3REYXRhXCIgI2ZpbHRlclZhbHVlTGlzdCBjbGFzcz1cInNlbGVjdC12YWx1ZXMtbGlzdFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3QoJGV2ZW50KVwiPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCByZWNvcmQgb2YgKGxpc3REYXRhIHwgYXN5bmMpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIGNoZWNrYm94UG9zaXRpb249XCJiZWZvcmVcIiBbc2VsZWN0ZWRdPVwicmVjb3JkLnNlbGVjdGVkXCIgW3ZhbHVlXT1cInJlY29yZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb3JkLnZhbHVlIHwgaXNFbXB0eVZhbHVlOyBlbHNlIHNob3dWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkVNUFRZX1ZBTFVFJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1ZhbHVlPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnJlbmRlcmVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyByZWNvcmQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb2x1bW4ucmVuZGVyZXJcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4ucmVuZGVyZXIudGVtcGxhdGVyZWZcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY2VsbHZhbHVlOiByZWNvcmQudmFsdWUsIHJvd3ZhbHVlOiByZWNvcmQucm93VmFsdWUgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJjbGVhckFjdGlvblwiIGNsYXNzPVwiby1idXR0b24taW5mb1wiPlxuICAgIHt7ICdUQUJMRS5CVVRUT05TLkZJTFRFUl9DTEVBUicgfCBvVHJhbnNsYXRlIH19IDwvYnV0dG9uPlxuICA8c3BhbiBhbGlnbj1cImVuZFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJjYW5jZWxBY3Rpb25cIiBjbGFzcz1cIm8tYnV0dG9uLWRlZmF1bHQgY2FuY2VsXCI+XG4gICAgICB7eyAnQ0FOQ0VMJyB8IG9UcmFuc2xhdGUgfX0gPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cImFjY2VwdEFjdGlvblwiIGNsYXNzPVwiby1idXR0b24tcHJpbWFyeVwiPlxuICAgICAge3sgJ0FDQ0VQVCcgfCBvVHJhbnNsYXRlIH19IDwvYnV0dG9uPlxuICA8L3NwYW4+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cblxuPCEtLSBURU1QTEFURSBDVVNUT00gRklMVEVSLS0+XG48bmctdGVtcGxhdGUgI2N1c3RvbUZpbHRlclRlbXBsYXRlPlxuICA8ZGl2ICpuZ0lmPVwiaXNUZXh0VHlwZSgpXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleCBjbGFzcz1cImhpbnRlZFwiPlxuICAgICAgPGlucHV0IG1hdElucHV0ICNmaWx0ZXJUZXh0IFtmb3JtQ29udHJvbF09XCJmY1RleHRcIiBwbGFjZWhvbGRlcj1cInt7ICdUQUJMRS5GSUxURVInIHwgb1RyYW5zbGF0ZSB9fVwiPlxuICAgICAgPG1hdC1oaW50Pnt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkhJTlRfU1RBUicgfCBvVHJhbnNsYXRlIH19PC9tYXQtaGludD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNsZWFyVmFsdWVzKClcIj5cbiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTpjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImlzTnVtZXJpY1R5cGUoKVwiIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCIgZnhMYXlvdXRHYXA9XCIxMnB4XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJmY0Zyb21cIiBwbGFjZWhvbGRlcj1cInt7ICdUQUJMRS5GSUxURVJfQllfQ09MVU1OLkZST00nIHwgb1RyYW5zbGF0ZSB9fVwiPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJmY1RvXCIgcGxhY2Vob2xkZXI9XCJ7eyAnVEFCTEUuRklMVEVSX0JZX0NPTFVNTi5UTycgfCBvVHJhbnNsYXRlIH19XCI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNsZWFyVmFsdWVzKClcIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6Y2xvc2VcIj48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImlzRGF0ZVR5cGUoKVwiIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCIgZnhMYXlvdXRHYXA9XCIxMnB4XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cImRhdGVwaWNrZXJGcm9tXCIgW21heF09XCJmY1RvLnZhbHVlXCIgW2Zvcm1Db250cm9sXT1cImZjRnJvbVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uRlJPTScgfCBvVHJhbnNsYXRlIH19XCI+XG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGVwaWNrZXJGcm9tXCI+XG4gICAgICAgIDxtYXQtaWNvbiBtYXREYXRlcGlja2VyVG9nZ2xlSWNvbj50b2RheTwvbWF0LWljb24+XG4gICAgICA8L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZXBpY2tlckZyb20gW3N0YXJ0Vmlld109XCJnZXRTdGFydGVkVmlld0RhdGVwaWNrZXIoKVwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwiZGF0ZXBpY2tlclRvXCIgW21pbl09XCJmY0Zyb20udmFsdWVcIiBbZm9ybUNvbnRyb2xdPVwiZmNUb1wiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1RBQkxFLkZJTFRFUl9CWV9DT0xVTU4uVE8nIHwgb1RyYW5zbGF0ZSB9fVwiPlxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRlcGlja2VyVG9cIj5cbiAgICAgICAgPG1hdC1pY29uIG1hdERhdGVwaWNrZXJUb2dnbGVJY29uPnRvZGF5PC9tYXQtaWNvbj5cbiAgICAgIDwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRlcGlja2VyVG8gW3N0YXJ0Vmlld109XCJnZXRTdGFydGVkVmlld0RhdGVwaWNrZXIoKVwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjbGVhclZhbHVlcygpXCI+XG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG4iXX0=