@fundamental-ngx/platform 0.43.22 → 0.43.23

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.
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/member-ordering */
1
2
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject } from '@angular/core';
2
3
  import { VhdBaseTab } from '../base-tab/vhd-base-tab.component';
3
4
  import { InfiniteScrollDirective } from '@fundamental-ngx/core/infinite-scroll';
@@ -44,6 +45,8 @@ export class SelectTabComponent extends VhdBaseTab {
44
45
  this.defaultMobileHeaders = 2;
45
46
  /** Displayed data for search table */
46
47
  this.displayedData = [];
48
+ /** Whether to allow users to select all table entries with one checkbox. */
49
+ this.allowSelectAll = true;
47
50
  /** Event emitted when row was selected. */
48
51
  // eslint-disable-next-line @angular-eslint/no-output-native
49
52
  this.select = new EventEmitter();
@@ -248,10 +251,10 @@ export class SelectTabComponent extends VhdBaseTab {
248
251
  }
249
252
  }
250
253
  SelectTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SelectTabComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
251
- SelectTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SelectTabComponent, selector: "fdp-select-tab", inputs: { selectTabTitleId: "selectTabTitleId", selectTabCountId: "selectTabCountId", selected: "selected", loading: "loading", filters: "filters", selection: "selection", emptyTableMessage: "emptyTableMessage", uniqueKey: "uniqueKey", pageSize: "pageSize", defaultMobileHeaders: "defaultMobileHeaders", displayedData: "displayedData" }, outputs: { select: "select" }, providers: [DestroyedService], viewQueries: [{ propertyName: "infiniteScrollTable", first: true, predicate: InfiniteScrollDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"table-header\">\n <h5 fd-title role=\"heading\" aria-level=\"5\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </h5>\n</div>\n<div\n class=\"fdp-value-help-dialog__table-holder table-content\"\n fd-scrollbar\n fdInfiniteScroll\n (onScrollAction)=\"_showMoreElements()\"\n [scrollPercent]=\"80\"\n role=\"table\"\n>\n <table\n fd-table\n [popIn]=\"mobile\"\n [noBorderX]=\"mobile\"\n [noBorderY]=\"false\"\n [attr.aria-colcount]=\"_tableFilters.main.length\"\n [attr.aria-rowcount]=\"displayedData.length\"\n role=\"grid\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"selectTabTitleId + ' ' + selectTabCountId\"\n >\n <label [id]=\"selectTabCountId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{\n 'platformVHD.selectTabCountHiddenA11yLabel'\n | fdTranslate : { rowCount: displayedData.length, colCount: _tableFilters.main.length }\n }}\n </label>\n <label [id]=\"selectTabTitleId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </label>\n <thead fd-table-header>\n <tr fd-table-row *ngIf=\"displayedData.length && _tableFilters\">\n <th fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-all'\"\n [tristate]=\"true\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"_selectedAll\"\n (ngModelChange)=\"_toggleAllRows()\"\n ></fd-checkbox>\n </th>\n <th\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; trackBy: _trackByFilterFn; let colindex = index\"\n [attr.aria-colindex]=\"colindex\"\n >\n {{ filter.label }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container\n *ngFor=\"\n let row of displayedData | slice : _shownFrom : _shownCount;\n trackBy: _trackByTableRowFn;\n index as i\n \"\n >\n <tr\n fd-table-row\n [hoverable]=\"!mobile\"\n [main]=\"mobile\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n [activable]=\"!isMultiSelection\"\n (click)=\"!isMultiSelection && _toggleSelectRow(row)\"\n >\n <td fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-' + i\"\n [ngModel]=\"_selectedMap[row[uniqueKey]]\"\n (change)=\"_toggleSelectRow(row)\"\n ></fd-checkbox>\n </td>\n <td\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; let rowIndex = index\"\n [attr.aria-rowindex]=\"rowIndex\"\n >\n <ng-container *ngIf=\"_columnDefMap.get(filter.key) as columnDef; else defaultColumnRenderer\">\n <ng-template\n [ngTemplateOutlet]=\"columnDef.templateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n key: filter.key,\n value: row[filter.key] || ''\n }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultColumnRenderer>\n {{ row[filter.key] || '' }}\n </ng-template>\n </td>\n </tr>\n\n <tr\n fd-table-row\n *ngIf=\"mobile && _tableFilters.secondary.length\"\n [secondary]=\"true\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n >\n <td fd-table-cell></td>\n <td colspan=\"100%\" fd-table-cell [fitContent]=\"true\">\n <p fd-table-text *ngFor=\"let filter of _tableFilters.secondary\">\n <label>{{ filter.label }}:</label>\n {{ row[filter.key] || '' }}\n </p>\n </td>\n </tr>\n </ng-container>\n <tr\n fd-table-row\n *ngIf=\"displayedData.length && mobile && _shownCount && _shownCount !== displayedData.length\"\n >\n <td colspan=\"100%\">\n <div fd-bar barDesign=\"header-with-subheader\">\n <div fd-bar-middle>\n <fd-bar-element>\n <button\n fd-button\n fdType=\"transparent\"\n [label]=\"'platformVHD.selectTabMoreBtnLabel' | fdTranslate\"\n (click)=\"_showMoreElements()\"\n ></button>\n </fd-bar-element>\n </div>\n </div>\n </td>\n </tr>\n <ng-container *ngIf=\"loading && !displayedData.length\">\n <tr fd-table-row *fdkRepeat=\"3\">\n <td fd-table-cell *fdkRepeat=\"3\">\n <fd-skeleton style=\"margin: auto 0\" type=\"text\" textLines=\"1\" width=\"60%\"></fd-skeleton>\n </td>\n </tr>\n </ng-container>\n <tr fd-table-row *ngIf=\"!loading && !displayedData.length\">\n <td fd-table-cell colspan=\"100%\">\n <div class=\"fdp-value-help-dialog__empty-message\">\n {{ emptyTableMessage || ('platformVHD.searchTableEmptyMessage' | fdTranslate) }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".fdp-value-help-dialog__advanced-filters .fd-col{padding-top:0}.fdp-value-help-dialog__content-holder fdp-select-tab{display:flex;flex-direction:column;overflow:hidden;height:100%}.fdp-value-help-dialog__content-holder .table-header{flex:0 0 auto}.fdp-value-help-dialog__content-holder .table-content{flex:1 1 auto;overflow:auto;min-height:5rem}.fdp-value-help-dialog__table-holder{padding-top:0;padding-bottom:0}.fdp-value-help-dialog__empty-message{padding:1rem 2rem}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i3.BarMiddleDirective, selector: "[fd-bar-middle]" }, { kind: "directive", type: i3.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i4.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.FormLabelComponent, selector: "[fd-form-label]", inputs: ["required", "colon", "checkbox", "radio", "alignLabelEnd", "inlineHelpTitle", "inlineHelpContent", "inlineHelpGlyph", "inlineHelpTriggers", "inlineHelpBodyPlacement", "inlineHelpPlacement", "inlineHelpLabel", "id"] }, { kind: "component", type: i7.TableComponent, selector: "table[fd-table]", inputs: ["noBorderX", "noBorderY", "noOuterBorder", "topBorder", "popIn", "responsive", "keys", "allCellsFocusable"], exportAs: ["fd-table"] }, { kind: "directive", type: i7.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i7.TableBodyDirective, selector: "[fdTableBody], [fd-table-body]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i7.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i7.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "directive", type: i7.TableTextDirective, selector: "[fdTableText], [fd-table-text]", inputs: ["fdTableTextClass", "noWrap", "title", "maxWidth"] }, { kind: "component", type: i8.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "values", "standalone"], outputs: ["focusChange"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[fdInfiniteScroll]", inputs: ["scrollPercent", "scrollOffset"], outputs: ["onScrollAction"] }, { kind: "directive", type: i10.ScrollbarDirective, selector: "[fdScrollbar], [fd-scrollbar]", inputs: ["noHorizontalScroll", "noVerticalScroll", "alwaysVisible", "overrideTabindex"] }, { kind: "component", type: i11.SkeletonComponent, selector: "fd-skeleton", inputs: ["animated", "type", "textLines", "width", "height"] }, { kind: "directive", type: i12.RepeatDirective, selector: "[fdkRepeat], [fdRepeat]", inputs: ["fdkRepeat", "fdRepeat"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
254
+ SelectTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SelectTabComponent, selector: "fdp-select-tab", inputs: { selectTabTitleId: "selectTabTitleId", selectTabCountId: "selectTabCountId", selected: "selected", loading: "loading", filters: "filters", selection: "selection", emptyTableMessage: "emptyTableMessage", uniqueKey: "uniqueKey", pageSize: "pageSize", defaultMobileHeaders: "defaultMobileHeaders", displayedData: "displayedData", allowSelectAll: "allowSelectAll" }, outputs: { select: "select" }, providers: [DestroyedService], viewQueries: [{ propertyName: "infiniteScrollTable", first: true, predicate: InfiniteScrollDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"table-header\">\n <h5 fd-title role=\"heading\" aria-level=\"5\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </h5>\n</div>\n<div\n class=\"fdp-value-help-dialog__table-holder table-content\"\n fd-scrollbar\n fdInfiniteScroll\n (onScrollAction)=\"_showMoreElements()\"\n [scrollPercent]=\"80\"\n role=\"table\"\n>\n <table\n fd-table\n [popIn]=\"mobile\"\n [noBorderX]=\"mobile\"\n [noBorderY]=\"false\"\n [attr.aria-colcount]=\"_tableFilters.main.length\"\n [attr.aria-rowcount]=\"displayedData.length\"\n role=\"grid\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"selectTabTitleId + ' ' + selectTabCountId\"\n >\n <label [id]=\"selectTabCountId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{\n 'platformVHD.selectTabCountHiddenA11yLabel'\n | fdTranslate : { rowCount: displayedData.length, colCount: _tableFilters.main.length }\n }}\n </label>\n <label [id]=\"selectTabTitleId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </label>\n <thead fd-table-header>\n <tr fd-table-row *ngIf=\"displayedData.length && _tableFilters\">\n <th fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection && allowSelectAll\"\n [name]=\"uid + '-row-all'\"\n [tristate]=\"true\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"_selectedAll\"\n (ngModelChange)=\"_toggleAllRows()\"\n ></fd-checkbox>\n </th>\n <th\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; trackBy: _trackByFilterFn; let colindex = index\"\n [attr.aria-colindex]=\"colindex\"\n >\n {{ filter.label }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container\n *ngFor=\"\n let row of displayedData | slice : _shownFrom : _shownCount;\n trackBy: _trackByTableRowFn;\n index as i\n \"\n >\n <tr\n fd-table-row\n [hoverable]=\"!mobile\"\n [main]=\"mobile\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n [activable]=\"!isMultiSelection\"\n (click)=\"!isMultiSelection && _toggleSelectRow(row)\"\n >\n <td fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-' + i\"\n [ngModel]=\"_selectedMap[row[uniqueKey]]\"\n (change)=\"_toggleSelectRow(row)\"\n ></fd-checkbox>\n </td>\n <td\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; let rowIndex = index\"\n [attr.aria-rowindex]=\"rowIndex\"\n >\n <ng-container *ngIf=\"_columnDefMap.get(filter.key) as columnDef; else defaultColumnRenderer\">\n <ng-template\n [ngTemplateOutlet]=\"columnDef.templateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n key: filter.key,\n value: row[filter.key] || ''\n }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultColumnRenderer>\n {{ row[filter.key] || '' }}\n </ng-template>\n </td>\n </tr>\n\n <tr\n fd-table-row\n *ngIf=\"mobile && _tableFilters.secondary.length\"\n [secondary]=\"true\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n >\n <td fd-table-cell></td>\n <td colspan=\"100%\" fd-table-cell [fitContent]=\"true\">\n <p fd-table-text *ngFor=\"let filter of _tableFilters.secondary\">\n <label>{{ filter.label }}:</label>\n {{ row[filter.key] || '' }}\n </p>\n </td>\n </tr>\n </ng-container>\n <tr\n fd-table-row\n *ngIf=\"displayedData.length && mobile && _shownCount && _shownCount !== displayedData.length\"\n >\n <td colspan=\"100%\">\n <div fd-bar barDesign=\"header-with-subheader\">\n <div fd-bar-middle>\n <fd-bar-element>\n <button\n fd-button\n fdType=\"transparent\"\n [label]=\"'platformVHD.selectTabMoreBtnLabel' | fdTranslate\"\n (click)=\"_showMoreElements()\"\n ></button>\n </fd-bar-element>\n </div>\n </div>\n </td>\n </tr>\n <ng-container *ngIf=\"loading && !displayedData.length\">\n <tr fd-table-row *fdkRepeat=\"3\">\n <td fd-table-cell *fdkRepeat=\"3\">\n <fd-skeleton style=\"margin: auto 0\" type=\"text\" textLines=\"1\" width=\"60%\"></fd-skeleton>\n </td>\n </tr>\n </ng-container>\n <tr fd-table-row *ngIf=\"!loading && !displayedData.length\">\n <td fd-table-cell colspan=\"100%\">\n <div class=\"fdp-value-help-dialog__empty-message\">\n {{ emptyTableMessage || ('platformVHD.searchTableEmptyMessage' | fdTranslate) }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".fdp-value-help-dialog__advanced-filters .fd-col{padding-top:0}.fdp-value-help-dialog__content-holder fdp-select-tab{display:flex;flex-direction:column;overflow:hidden;height:100%}.fdp-value-help-dialog__content-holder .table-header{flex:0 0 auto}.fdp-value-help-dialog__content-holder .table-content{flex:1 1 auto;overflow:auto;min-height:5rem}.fdp-value-help-dialog__table-holder{padding-top:0;padding-bottom:0}.fdp-value-help-dialog__empty-message{padding:1rem 2rem}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i3.BarMiddleDirective, selector: "[fd-bar-middle]" }, { kind: "directive", type: i3.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i4.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.FormLabelComponent, selector: "[fd-form-label]", inputs: ["required", "colon", "checkbox", "radio", "alignLabelEnd", "inlineHelpTitle", "inlineHelpContent", "inlineHelpGlyph", "inlineHelpTriggers", "inlineHelpBodyPlacement", "inlineHelpPlacement", "inlineHelpLabel", "id"] }, { kind: "component", type: i7.TableComponent, selector: "table[fd-table]", inputs: ["noBorderX", "noBorderY", "noOuterBorder", "topBorder", "popIn", "responsive", "keys", "allCellsFocusable"], exportAs: ["fd-table"] }, { kind: "directive", type: i7.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i7.TableBodyDirective, selector: "[fdTableBody], [fd-table-body]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i7.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i7.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "directive", type: i7.TableTextDirective, selector: "[fdTableText], [fd-table-text]", inputs: ["fdTableTextClass", "noWrap", "title", "maxWidth"] }, { kind: "component", type: i8.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "values", "standalone"], outputs: ["focusChange"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[fdInfiniteScroll]", inputs: ["scrollPercent", "scrollOffset"], outputs: ["onScrollAction"] }, { kind: "directive", type: i10.ScrollbarDirective, selector: "[fdScrollbar], [fd-scrollbar]", inputs: ["noHorizontalScroll", "noVerticalScroll", "alwaysVisible", "overrideTabindex"] }, { kind: "component", type: i11.SkeletonComponent, selector: "fd-skeleton", inputs: ["animated", "type", "textLines", "width", "height"] }, { kind: "directive", type: i12.RepeatDirective, selector: "[fdkRepeat], [fdRepeat]", inputs: ["fdkRepeat", "fdRepeat"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
252
255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SelectTabComponent, decorators: [{
253
256
  type: Component,
254
- args: [{ selector: 'fdp-select-tab', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [DestroyedService], template: "<div class=\"table-header\">\n <h5 fd-title role=\"heading\" aria-level=\"5\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </h5>\n</div>\n<div\n class=\"fdp-value-help-dialog__table-holder table-content\"\n fd-scrollbar\n fdInfiniteScroll\n (onScrollAction)=\"_showMoreElements()\"\n [scrollPercent]=\"80\"\n role=\"table\"\n>\n <table\n fd-table\n [popIn]=\"mobile\"\n [noBorderX]=\"mobile\"\n [noBorderY]=\"false\"\n [attr.aria-colcount]=\"_tableFilters.main.length\"\n [attr.aria-rowcount]=\"displayedData.length\"\n role=\"grid\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"selectTabTitleId + ' ' + selectTabCountId\"\n >\n <label [id]=\"selectTabCountId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{\n 'platformVHD.selectTabCountHiddenA11yLabel'\n | fdTranslate : { rowCount: displayedData.length, colCount: _tableFilters.main.length }\n }}\n </label>\n <label [id]=\"selectTabTitleId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </label>\n <thead fd-table-header>\n <tr fd-table-row *ngIf=\"displayedData.length && _tableFilters\">\n <th fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-all'\"\n [tristate]=\"true\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"_selectedAll\"\n (ngModelChange)=\"_toggleAllRows()\"\n ></fd-checkbox>\n </th>\n <th\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; trackBy: _trackByFilterFn; let colindex = index\"\n [attr.aria-colindex]=\"colindex\"\n >\n {{ filter.label }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container\n *ngFor=\"\n let row of displayedData | slice : _shownFrom : _shownCount;\n trackBy: _trackByTableRowFn;\n index as i\n \"\n >\n <tr\n fd-table-row\n [hoverable]=\"!mobile\"\n [main]=\"mobile\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n [activable]=\"!isMultiSelection\"\n (click)=\"!isMultiSelection && _toggleSelectRow(row)\"\n >\n <td fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-' + i\"\n [ngModel]=\"_selectedMap[row[uniqueKey]]\"\n (change)=\"_toggleSelectRow(row)\"\n ></fd-checkbox>\n </td>\n <td\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; let rowIndex = index\"\n [attr.aria-rowindex]=\"rowIndex\"\n >\n <ng-container *ngIf=\"_columnDefMap.get(filter.key) as columnDef; else defaultColumnRenderer\">\n <ng-template\n [ngTemplateOutlet]=\"columnDef.templateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n key: filter.key,\n value: row[filter.key] || ''\n }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultColumnRenderer>\n {{ row[filter.key] || '' }}\n </ng-template>\n </td>\n </tr>\n\n <tr\n fd-table-row\n *ngIf=\"mobile && _tableFilters.secondary.length\"\n [secondary]=\"true\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n >\n <td fd-table-cell></td>\n <td colspan=\"100%\" fd-table-cell [fitContent]=\"true\">\n <p fd-table-text *ngFor=\"let filter of _tableFilters.secondary\">\n <label>{{ filter.label }}:</label>\n {{ row[filter.key] || '' }}\n </p>\n </td>\n </tr>\n </ng-container>\n <tr\n fd-table-row\n *ngIf=\"displayedData.length && mobile && _shownCount && _shownCount !== displayedData.length\"\n >\n <td colspan=\"100%\">\n <div fd-bar barDesign=\"header-with-subheader\">\n <div fd-bar-middle>\n <fd-bar-element>\n <button\n fd-button\n fdType=\"transparent\"\n [label]=\"'platformVHD.selectTabMoreBtnLabel' | fdTranslate\"\n (click)=\"_showMoreElements()\"\n ></button>\n </fd-bar-element>\n </div>\n </div>\n </td>\n </tr>\n <ng-container *ngIf=\"loading && !displayedData.length\">\n <tr fd-table-row *fdkRepeat=\"3\">\n <td fd-table-cell *fdkRepeat=\"3\">\n <fd-skeleton style=\"margin: auto 0\" type=\"text\" textLines=\"1\" width=\"60%\"></fd-skeleton>\n </td>\n </tr>\n </ng-container>\n <tr fd-table-row *ngIf=\"!loading && !displayedData.length\">\n <td fd-table-cell colspan=\"100%\">\n <div class=\"fdp-value-help-dialog__empty-message\">\n {{ emptyTableMessage || ('platformVHD.searchTableEmptyMessage' | fdTranslate) }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".fdp-value-help-dialog__advanced-filters .fd-col{padding-top:0}.fdp-value-help-dialog__content-holder fdp-select-tab{display:flex;flex-direction:column;overflow:hidden;height:100%}.fdp-value-help-dialog__content-holder .table-header{flex:0 0 auto}.fdp-value-help-dialog__content-holder .table-content{flex:1 1 auto;overflow:auto;min-height:5rem}.fdp-value-help-dialog__table-holder{padding-top:0;padding-bottom:0}.fdp-value-help-dialog__empty-message{padding:1rem 2rem}\n"] }]
257
+ args: [{ selector: 'fdp-select-tab', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [DestroyedService], template: "<div class=\"table-header\">\n <h5 fd-title role=\"heading\" aria-level=\"5\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </h5>\n</div>\n<div\n class=\"fdp-value-help-dialog__table-holder table-content\"\n fd-scrollbar\n fdInfiniteScroll\n (onScrollAction)=\"_showMoreElements()\"\n [scrollPercent]=\"80\"\n role=\"table\"\n>\n <table\n fd-table\n [popIn]=\"mobile\"\n [noBorderX]=\"mobile\"\n [noBorderY]=\"false\"\n [attr.aria-colcount]=\"_tableFilters.main.length\"\n [attr.aria-rowcount]=\"displayedData.length\"\n role=\"grid\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"selectTabTitleId + ' ' + selectTabCountId\"\n >\n <label [id]=\"selectTabCountId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{\n 'platformVHD.selectTabCountHiddenA11yLabel'\n | fdTranslate : { rowCount: displayedData.length, colCount: _tableFilters.main.length }\n }}\n </label>\n <label [id]=\"selectTabTitleId\" fd-form-label class=\"fdp-value-help-dialog__hidden_label\">\n {{ 'platformVHD.selectTabDisplayCountLabel' | fdTranslate : { count: displayedData.length } }}\n </label>\n <thead fd-table-header>\n <tr fd-table-row *ngIf=\"displayedData.length && _tableFilters\">\n <th fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection && allowSelectAll\"\n [name]=\"uid + '-row-all'\"\n [tristate]=\"true\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"_selectedAll\"\n (ngModelChange)=\"_toggleAllRows()\"\n ></fd-checkbox>\n </th>\n <th\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; trackBy: _trackByFilterFn; let colindex = index\"\n [attr.aria-colindex]=\"colindex\"\n >\n {{ filter.label }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container\n *ngFor=\"\n let row of displayedData | slice : _shownFrom : _shownCount;\n trackBy: _trackByTableRowFn;\n index as i\n \"\n >\n <tr\n fd-table-row\n [hoverable]=\"!mobile\"\n [main]=\"mobile\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n [activable]=\"!isMultiSelection\"\n (click)=\"!isMultiSelection && _toggleSelectRow(row)\"\n >\n <td fd-table-cell [fitContent]=\"mobile\">\n <fd-checkbox\n *ngIf=\"isMultiSelection\"\n [name]=\"uid + '-row-' + i\"\n [ngModel]=\"_selectedMap[row[uniqueKey]]\"\n (change)=\"_toggleSelectRow(row)\"\n ></fd-checkbox>\n </td>\n <td\n fd-table-cell\n *ngFor=\"let filter of _tableFilters.main; let rowIndex = index\"\n [attr.aria-rowindex]=\"rowIndex\"\n >\n <ng-container *ngIf=\"_columnDefMap.get(filter.key) as columnDef; else defaultColumnRenderer\">\n <ng-template\n [ngTemplateOutlet]=\"columnDef.templateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n key: filter.key,\n value: row[filter.key] || ''\n }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultColumnRenderer>\n {{ row[filter.key] || '' }}\n </ng-template>\n </td>\n </tr>\n\n <tr\n fd-table-row\n *ngIf=\"mobile && _tableFilters.secondary.length\"\n [secondary]=\"true\"\n [attr.aria-selected]=\"_selectedMap[row[uniqueKey]]\"\n >\n <td fd-table-cell></td>\n <td colspan=\"100%\" fd-table-cell [fitContent]=\"true\">\n <p fd-table-text *ngFor=\"let filter of _tableFilters.secondary\">\n <label>{{ filter.label }}:</label>\n {{ row[filter.key] || '' }}\n </p>\n </td>\n </tr>\n </ng-container>\n <tr\n fd-table-row\n *ngIf=\"displayedData.length && mobile && _shownCount && _shownCount !== displayedData.length\"\n >\n <td colspan=\"100%\">\n <div fd-bar barDesign=\"header-with-subheader\">\n <div fd-bar-middle>\n <fd-bar-element>\n <button\n fd-button\n fdType=\"transparent\"\n [label]=\"'platformVHD.selectTabMoreBtnLabel' | fdTranslate\"\n (click)=\"_showMoreElements()\"\n ></button>\n </fd-bar-element>\n </div>\n </div>\n </td>\n </tr>\n <ng-container *ngIf=\"loading && !displayedData.length\">\n <tr fd-table-row *fdkRepeat=\"3\">\n <td fd-table-cell *fdkRepeat=\"3\">\n <fd-skeleton style=\"margin: auto 0\" type=\"text\" textLines=\"1\" width=\"60%\"></fd-skeleton>\n </td>\n </tr>\n </ng-container>\n <tr fd-table-row *ngIf=\"!loading && !displayedData.length\">\n <td fd-table-cell colspan=\"100%\">\n <div class=\"fdp-value-help-dialog__empty-message\">\n {{ emptyTableMessage || ('platformVHD.searchTableEmptyMessage' | fdTranslate) }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".fdp-value-help-dialog__advanced-filters .fd-col{padding-top:0}.fdp-value-help-dialog__content-holder fdp-select-tab{display:flex;flex-direction:column;overflow:hidden;height:100%}.fdp-value-help-dialog__content-holder .table-header{flex:0 0 auto}.fdp-value-help-dialog__content-holder .table-content{flex:1 1 auto;overflow:auto;min-height:5rem}.fdp-value-help-dialog__table-holder{padding-top:0;padding-bottom:0}.fdp-value-help-dialog__empty-message{padding:1rem 2rem}\n"] }]
255
258
  }], propDecorators: { selectTabTitleId: [{
256
259
  type: Input
257
260
  }], selectTabCountId: [{
@@ -274,6 +277,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
274
277
  type: Input
275
278
  }], displayedData: [{
276
279
  type: Input
280
+ }], allowSelectAll: [{
281
+ type: Input
277
282
  }],
278
283
  // eslint-disable-next-line @angular-eslint/no-output-native
279
284
  select: [{
@@ -282,4 +287,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
282
287
  type: ViewChild,
283
288
  args: [InfiniteScrollDirective]
284
289
  }] } });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvdmFsdWUtaGVscC1kaWFsb2cvY29tcG9uZW50cy9zZWxlY3QtdGFiL3NlbGVjdC10YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3ZhbHVlLWhlbHAtZGlhbG9nL2NvbXBvbmVudHMvc2VsZWN0LXRhYi9zZWxlY3QtdGFiLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQUU5RCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFVdEIsTUFBTSxPQUFPLGtCQUFzQixTQUFRLFVBQVU7SUFSckQ7O1FBU0ksY0FBYztRQUNKLG1CQUFjLEdBQUcsMEJBQTBCLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFDdkUsY0FBYztRQUNKLG1CQUFjLEdBQUcsZ0NBQWdDLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFFN0Usa0NBQWtDO1FBRWxDLHFCQUFnQixHQUFXLElBQUksQ0FBQyxjQUFjLENB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WkFGaEIsQ0FBQyxnQkFBZ0IsQ0FBQywrRUE2RGxCLHVCQUF1Qiw0RkMzRnRDLHFvTkFzSkE7MkZEdEhhLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDSSxnQkFBZ0IsaUJBR1gsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGdCQUFnQixDQUFDOzhCQVU3QixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUtOLE9BQU87c0JBRE4sS0FBSztnQkFLTixTQUFTO3NCQURSLEtBQUs7Z0JBUU4saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLFNBQVM7c0JBRFIsS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04sb0JBQW9CO3NCQURuQixLQUFLO2dCQUtOLGFBQWE7c0JBRFosS0FBSzs7UUFLTiw0REFBNEQ7UUFDNUQsTUFBTTtzQkFGTCxNQUFNO2dCQUs2QixtQkFBbUI7c0JBQXRELFNBQVM7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWaGRCYXNlVGFiIH0gZnJvbSAnLi4vYmFzZS10YWIvdmhkLWJhc2UtdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaGRGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmhkLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBWZGhUYWJsZVNlbGVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy92aGQtdGFibGUtc2VsZWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5maW5pdGUtc2Nyb2xsJztcbmltcG9ydCB7IFZhbHVlSGVscENvbHVtbkRlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdmFsdWUtaGVscC1jb2x1bW4tZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBWaGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmhkLWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVzdHJveWVkU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcblxubGV0IHRpdGxlVW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1zZWxlY3QtdGFiJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LXRhYi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LXRhYi5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbRGVzdHJveWVkU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0VGFiQ29tcG9uZW50PFQ+IGV4dGVuZHMgVmhkQmFzZVRhYiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZGVmYXVsdFRpdGxlSWQgPSBgZmQtc2VsZWN0LXRhYi10aXRsZS1pZC0ke3RpdGxlVW5pcXVlSWQrK31gO1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb3VudElkID0gYGZkLXNlbGVjdC10YWItdGl0bGUtY291bnQtaWQtJHt0aXRsZVVuaXF1ZUlkKyt9YDtcblxuICAgIC8qKiBTZWxlY3QgdGFiIHRpdGxlIGVsZW1lbnQgSUQgKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdFRhYlRpdGxlSWQ6IHN0cmluZyA9IHRoaXMuZGVmYXVsdFRpdGxlSWQ7XG5cbiAgICAvKiogU2VsZWN0IHRhYiBjb3VudCBlbGVtZW50IElEICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RUYWJDb3VudElkOiBzdHJpbmcgPSB0aGlzLmRlZmF1bHRDb3VudElkO1xuXG4gICAgLyoqIFNlbGVjdGVkIGl0ZW1zICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZDogVFtdID0gW107XG5cbiAgICAvKiogTG9hZGluZyBzdGF0ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIEFjdHVhbCBmaWx0ZXJzICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJzOiBWaGRGaWx0ZXJbXSA9IFtdO1xuXG4gICAgLyoqIENsb3NlIGRpYWxvZyBpbW1lZGlhdGVseSBhZnRlciBzZWxlY3QgYW55IHJvdyBmcm9tIHNlYXJjaCB0YWJsZS4gSXQnbGwgYmUgc2tpcHBlZCBpZiBtdWx0aSBvcHRpb24gaXMgdHJ1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2VsZWN0aW9uOiBWZGhUYWJsZVNlbGVjdGlvbiA9ICdzaW5nbGUnO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIDE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIFRleHQgZGlzcGxheWVkIHdoZW4gdGFibGUgaGFzIG5vIGl0ZW1zLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW1wdHlUYWJsZU1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBVbmlxIGZpZWxkIGZyb20gZGF0YSBzb3VyY2UgKi9cbiAgICBASW5wdXQoKVxuICAgIHVuaXF1ZUtleSA9ICdpZCc7XG5cbiAgICAvKiogSXRlbXMgcGVyIHBhZ2UgZm9yIHBhZ2luYXRpb24gYmVsb3cgc2VhcmNoIHRhYmxlICovXG4gICAgQElucHV0KClcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqIENvdW50IG9mIGRlZmF1bHQgbW9iaWxlIGhlYWRlciBmcm9tIHNlYXJjaCB0YWJsZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGVmYXVsdE1vYmlsZUhlYWRlcnMgPSAyO1xuXG4gICAgLyoqIERpc3BsYXllZCBkYXRhIGZvciBzZWFyY2ggdGFibGUgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXllZERhdGE6IFRbXSA9IFtdO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiByb3cgd2FzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlKSBpbmZpbml0ZVNjcm9sbFRhYmxlOiBJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIGluZGV0ZXJtaW5hdGUgZmxhZyBmb3IgYHNlbGVjdCBhbGxgIGNoZWNrYm94ICovXG4gICAgX3NlbGVjdGVkQWxsOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gU2hvd24gaXRlbXMgY291bnQgaW4gbW9iaWxlIHZpZXcgKi9cbiAgICBfc2hvd25Gcm9tID0gMDtcblxuICAgIC8qKiBAaGlkZGVuIFNob3duIGl0ZW1zIGNvdW50IGluIG1vYmlsZSB2aWV3ICovXG4gICAgX3Nob3duQ291bnQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gQ3VycmVudCBwYWdlIGluIGRlc2t0b3AgdmlldyAqL1xuICAgIF9jdXJyZW50UGFnZSA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiBIZWFkZXJzIGFuZCBib2R5IGZvciBzZWFyY2ggdGFibGUgKi9cbiAgICBfdGFibGVGaWx0ZXJzOiB7XG4gICAgICAgIG1haW46IFZoZEZpbHRlcltdO1xuICAgICAgICBzZWNvbmRhcnk6IFZoZEZpbHRlcltdO1xuICAgIH0gPSB7XG4gICAgICAgIG1haW46IFtdLFxuICAgICAgICBzZWNvbmRhcnk6IFtdXG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlbGVjdGVkTWFwOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHNlbGVjdGVkSXRlbXM6IFRbXSA9IFtdO1xuXG4gICAgLyoqIFNlbGVjdGlvbiB0eXBlIGdldHRlcnMgKi9cbiAgICBnZXQgaXNTaW5nbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA9PT0gJ3NpbmdsZSc7XG4gICAgfVxuICAgIC8qKiBTZWxlY3Rpb24gdHlwZSBnZXR0ZXJzICovXG4gICAgZ2V0IGlzT25jZVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uID09PSAnb25jZSc7XG4gICAgfVxuICAgIC8qKiBTZWxlY3Rpb24gdHlwZSBnZXR0ZXJzICovXG4gICAgZ2V0IGlzTXVsdGlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA9PT0gJ211bHRpJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jb2x1bW5EZWZNYXAgPSBuZXcgTWFwPHN0cmluZywgVmFsdWVIZWxwQ29sdW1uRGVmRGlyZWN0aXZlPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aGQgPSBpbmplY3QoVmhkQ29tcG9uZW50LCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGluamVjdChEZXN0cm95ZWRTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodHJ1ZSkudGhlbigoKSA9PiB0aGlzLl9jaGVja1Njcm9sbEFuZFNob3dNb3JlKCkpO1xuXG4gICAgICAgIHRoaXMuX3ZoZD8uY29sdW1uRGVmLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5EZWZNYXAuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuX3ZoZD8uY29sdW1uRGVmLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5EZWZNYXAuc2V0KGl0ZW0uY29sdW1uLCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICgnZmlsdGVycycgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUZpbHRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Rpc3BsYXllZERhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hEaXNwbGF5ZWREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdzZWxlY3RlZCcgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZCB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTZWxlY3RlZE1hcCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFRyaXN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBUcmFjayBmdW5jdGlvbiBmb3IgbWFpbiBkYXRhICovXG4gICAgX3RyYWNrQnlUYWJsZVJvd0ZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBUKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtW3RoaXMudW5pcXVlS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gVHJhY2sgZnVuY3Rpb24gZm9yIGZpbHRlcnMgKi9cbiAgICBfdHJhY2tCeUZpbHRlckZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBWaGRGaWx0ZXIpOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gaXRlbSAmJiBpdGVtLmtleSA/IGl0ZW0ua2V5IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNob3cgbW9yZSBlbGVtZW50cyAqL1xuICAgIF9zaG93TW9yZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWdlU2l6ZSAmJiB0aGlzLl9zaG93bkNvdW50ICE9PSB0aGlzLmRpc3BsYXllZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ICs9IHRoaXMucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ID0gTWF0aC5taW4odGhpcy5fc2hvd25Db3VudCwgdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ID0gdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIHBhZ2UgaW4gZGVza3RvcCB2aWV3ICovXG4gICAgX3VwZGF0ZVBhZ2UocGFnZU51bWJlciA9IDEpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuX3Nob3duRnJvbSA9IChwYWdlTnVtYmVyIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCA9IE1hdGgubWluKHRoaXMuX3Nob3duRnJvbSArIHRoaXMucGFnZVNpemUsIHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCA9IHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBNZXRob2QgdG9nZ2xlIHNlbGVjdGVkIHN0YXRlIGZvciBhbGwgaXRlbXMgICovXG4gICAgX3RvZ2dsZUFsbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEFsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLmRpc3BsYXllZERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoU2VsZWN0ZWRNYXAoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaFRyaXN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHRvZ2dsZSBzZWxlY3RlZCBzdGF0ZSBmb3Igb25lIGl0ZW1zICAqL1xuICAgIF90b2dnbGVTZWxlY3RSb3coaXRlbTogVCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWRNYXBbaXRlbVt0aGlzLnVuaXF1ZUtleV1dO1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChzOiBUKSA9PiBzW3RoaXMudW5pcXVlS2V5XSAhPT0gaXRlbVt0aGlzLnVuaXF1ZUtleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW2l0ZW1bdGhpcy51bmlxdWVLZXldXSA9ICF0aGlzLl9zZWxlY3RlZE1hcFtpdGVtW3RoaXMudW5pcXVlS2V5XV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtpdGVtXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hUcmlzdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2hlY2tTY3JvbGxBbmRTaG93TW9yZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCAhPT0gdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFRhYmxlPy5zaG91bGRUcmlnZ2VyQWN0aW9uKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93TW9yZUVsZW1lbnRzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Njcm9sbEFuZFNob3dNb3JlKCk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFNob3duKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dNb3JlRWxlbWVudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsQW5kU2hvd01vcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIE1hbnVhbGx5IGNsZWFyIHNlbGVjdGVkIGl0ZW1zICovXG4gICAgcHJpdmF0ZSBfY2xlYXJTZWxlY3RlZEl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZE1hcCA9IHt9O1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIGluZGV0ZXJtaW5hdGUgYXR0cmlidXRlIG9uIGBzZWxlY3QgYWxsYCBjaGVja2JveCAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hUcmlzdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3NlbGVjdGVkTWFwKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgICBpZiAoc2VsZWN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgPT09IHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNldCB1cCBmaWx0ZXJzICovXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZUZpbHRlcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgbGV0IF9tb2JpbGVUYWJsZUhlYWRlcnMgPSB0aGlzLmZpbHRlcnMuZmlsdGVyKChmKSA9PiBmLm1haW4pLm1hcCgoZikgPT4gZi5rZXkpO1xuICAgICAgICAgICAgaWYgKCFfbW9iaWxlVGFibGVIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF9tb2JpbGVUYWJsZUhlYWRlcnMgPSB0aGlzLmZpbHRlcnMuc2xpY2UoMCwgdGhpcy5kZWZhdWx0TW9iaWxlSGVhZGVycykubWFwKChmKSA9PiBmLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90YWJsZUZpbHRlcnMgPSB7XG4gICAgICAgICAgICAgICAgbWFpbjogdGhpcy5maWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBfbW9iaWxlVGFibGVIZWFkZXJzLnNvbWUoKGtleSkgPT4ga2V5ID09PSBmaWx0ZXIua2V5KSksXG4gICAgICAgICAgICAgICAgc2Vjb25kYXJ5OiB0aGlzLmZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+ICFfbW9iaWxlVGFibGVIZWFkZXJzLnNvbWUoKGtleSkgPT4ga2V5ID09PSBmaWx0ZXIua2V5KSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90YWJsZUZpbHRlcnMgPSB7XG4gICAgICAgICAgICAgICAgbWFpbjogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHNlY29uZGFyeTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIGRpc3BsYXkgZGF0YSAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hEaXNwbGF5ZWREYXRhKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZXNldFNob3duKCk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hUcmlzdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJlZnJlc2ggc2VsZWN0ZWQgbWFwIGZvciBkaXNwbGF5IGRhdGEgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2VsZWN0ZWRNYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRpc3BsYXllZERhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW2l0ZW1bdGhpcy51bmlxdWVLZXldXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW3NbdGhpcy51bmlxdWVLZXldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgPGg1IGZkLXRpdGxlIHJvbGU9XCJoZWFkaW5nXCIgYXJpYS1sZXZlbD1cIjVcIj5cbiAgICAgICAge3sgJ3BsYXRmb3JtVkhELnNlbGVjdFRhYkRpc3BsYXlDb3VudExhYmVsJyB8IGZkVHJhbnNsYXRlIDogeyBjb3VudDogZGlzcGxheWVkRGF0YS5sZW5ndGggfSB9fVxuICAgIDwvaDU+XG48L2Rpdj5cbjxkaXZcbiAgICBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19fdGFibGUtaG9sZGVyIHRhYmxlLWNvbnRlbnRcIlxuICAgIGZkLXNjcm9sbGJhclxuICAgIGZkSW5maW5pdGVTY3JvbGxcbiAgICAob25TY3JvbGxBY3Rpb24pPVwiX3Nob3dNb3JlRWxlbWVudHMoKVwiXG4gICAgW3Njcm9sbFBlcmNlbnRdPVwiODBcIlxuICAgIHJvbGU9XCJ0YWJsZVwiXG4+XG4gICAgPHRhYmxlXG4gICAgICAgIGZkLXRhYmxlXG4gICAgICAgIFtwb3BJbl09XCJtb2JpbGVcIlxuICAgICAgICBbbm9Cb3JkZXJYXT1cIm1vYmlsZVwiXG4gICAgICAgIFtub0JvcmRlclldPVwiZmFsc2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbGNvdW50XT1cIl90YWJsZUZpbHRlcnMubWFpbi5sZW5ndGhcIlxuICAgICAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cImRpc3BsYXllZERhdGEubGVuZ3RoXCJcbiAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICBhcmlhLW11bHRpc2VsZWN0YWJsZT1cInRydWVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwic2VsZWN0VGFiVGl0bGVJZCArICcgJyArIHNlbGVjdFRhYkNvdW50SWRcIlxuICAgID5cbiAgICAgICAgPGxhYmVsIFtpZF09XCJzZWxlY3RUYWJDb3VudElkXCIgZmQtZm9ybS1sYWJlbCBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19faGlkZGVuX2xhYmVsXCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdwbGF0Zm9ybVZIRC5zZWxlY3RUYWJDb3VudEhpZGRlbkExMXlMYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgcm93Q291bnQ6IGRpc3BsYXllZERhdGEubGVuZ3RoLCBjb2xDb3VudDogX3RhYmxlRmlsdGVycy5tYWluLmxlbmd0aCB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgW2lkXT1cInNlbGVjdFRhYlRpdGxlSWRcIiBmZC1mb3JtLWxhYmVsIGNsYXNzPVwiZmRwLXZhbHVlLWhlbHAtZGlhbG9nX19oaWRkZW5fbGFiZWxcIj5cbiAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVZIRC5zZWxlY3RUYWJEaXNwbGF5Q291bnRMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IGRpc3BsYXllZERhdGEubGVuZ3RoIH0gfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHRoZWFkIGZkLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3cgKm5nSWY9XCJkaXNwbGF5ZWREYXRhLmxlbmd0aCAmJiBfdGFibGVGaWx0ZXJzXCI+XG4gICAgICAgICAgICAgICAgPHRoIGZkLXRhYmxlLWNlbGwgW2ZpdENvbnRlbnRdPVwibW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInVpZCArICctcm93LWFsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlU2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfc2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZUFsbFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBfdGFibGVGaWx0ZXJzLm1haW47IHRyYWNrQnk6IF90cmFja0J5RmlsdGVyRm47IGxldCBjb2xpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJjb2xpbmRleFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXIubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5IGZkLXRhYmxlLWJvZHk+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZGlzcGxheWVkRGF0YSB8IHNsaWNlIDogX3Nob3duRnJvbSA6IF9zaG93bkNvdW50O1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiBfdHJhY2tCeVRhYmxlUm93Rm47XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IGFzIGlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICBmZC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAgICAgW2hvdmVyYWJsZV09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW21haW5dPVwibW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJfc2VsZWN0ZWRNYXBbcm93W3VuaXF1ZUtleV1dXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2YWJsZV09XCIhaXNNdWx0aVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNNdWx0aVNlbGVjdGlvbiAmJiBfdG9nZ2xlU2VsZWN0Um93KHJvdylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgW2ZpdENvbnRlbnRdPVwibW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInVpZCArICctcm93LScgKyBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfc2VsZWN0ZWRNYXBbcm93W3VuaXF1ZUtleV1dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl90b2dnbGVTZWxlY3RSb3cocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9mZC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIF90YWJsZUZpbHRlcnMubWFpbjsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfY29sdW1uRGVmTWFwLmdldChmaWx0ZXIua2V5KSBhcyBjb2x1bW5EZWY7IGVsc2UgZGVmYXVsdENvbHVtblJlbmRlcmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbkRlZi50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmlsdGVyLmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3dbZmlsdGVyLmtleV0gfHwgJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbHVtblJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd1tmaWx0ZXIua2V5XSB8fCAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIGZkLXRhYmxlLXJvd1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZSAmJiBfdGFibGVGaWx0ZXJzLnNlY29uZGFyeS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbc2Vjb25kYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIl9zZWxlY3RlZE1hcFtyb3dbdW5pcXVlS2V5XV1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGw+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDAlXCIgZmQtdGFibGUtY2VsbCBbZml0Q29udGVudF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBmZC10YWJsZS10ZXh0ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgX3RhYmxlRmlsdGVycy5zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZmlsdGVyLmxhYmVsIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93W2ZpbHRlci5rZXldIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgZmQtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWREYXRhLmxlbmd0aCAmJiBtb2JpbGUgJiYgX3Nob3duQ291bnQgJiYgX3Nob3duQ291bnQgIT09IGRpc3BsYXllZERhdGEubGVuZ3RoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmZC1iYXIgYmFyRGVzaWduPVwiaGVhZGVyLXdpdGgtc3ViaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1taWRkbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm1WSEQuc2VsZWN0VGFiTW9yZUJ0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfc2hvd01vcmVFbGVtZW50cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyAmJiAhZGlzcGxheWVkRGF0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93ICpmZGtSZXBlYXQ9XCIzXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBmZC10YWJsZS1jZWxsICpmZGtSZXBlYXQ9XCIzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtc2tlbGV0b24gc3R5bGU9XCJtYXJnaW46IGF1dG8gMFwiIHR5cGU9XCJ0ZXh0XCIgdGV4dExpbmVzPVwiMVwiIHdpZHRoPVwiNjAlXCI+PC9mZC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIWRpc3BsYXllZERhdGEubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19fZW1wdHktbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZW1wdHlUYWJsZU1lc3NhZ2UgfHwgKCdwbGF0Zm9ybVZIRC5zZWFyY2hUYWJsZUVtcHR5TWVzc2FnZScgfCBmZFRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbjwvZGl2PlxuIl19
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvdmFsdWUtaGVscC1kaWFsb2cvY29tcG9uZW50cy9zZWxlY3QtdGFiL3NlbGVjdC10YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3ZhbHVlLWhlbHAtZGlhbG9nL2NvbXBvbmVudHMvc2VsZWN0LXRhYi9zZWxlY3QtdGFiLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFFOUQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBVXRCLE1BQU0sT0FBTyxrQkFBc0IsU0FBUSxVQUFVO0lBUnJEOztRQVNJLGNBQWM7UUFDSixtQkFBYyxHQUFHLDBCQUEwQixhQUFhLEVBQUUsRUFBRSxDQUFDO1FBQ3ZFLGNBQWM7UUFDSixtQkFBYyxHQUFHLGdDQUFnQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1FBRTdFLGtDQUFrQztRQUVsQyxxQkFBZ0IsR0FBVyxJQUFJ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SSxDQUFDO1NBQy9DO0lBQ0wsQ0FBQzs7K0dBN1JRLGtCQUFrQjttR0FBbEIsa0JBQWtCLDRiQUZoQixDQUFDLGdCQUFnQixDQUFDLCtFQWlFbEIsdUJBQXVCLDRGQ2hHdEMsdXBOQXNKQTsyRkRySGEsa0JBQWtCO2tCQVI5QixTQUFTOytCQUNJLGdCQUFnQixpQkFHWCxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsZ0JBQWdCLENBQUM7OEJBVTdCLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUtOLFNBQVM7c0JBRFIsS0FBSztnQkFRTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFLTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSzs7UUFLTiw0REFBNEQ7UUFDNUQsTUFBTTtzQkFGTCxNQUFNO2dCQUs2QixtQkFBbUI7c0JBQXRELFNBQVM7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAqL1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWaGRCYXNlVGFiIH0gZnJvbSAnLi4vYmFzZS10YWIvdmhkLWJhc2UtdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaGRGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmhkLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBWZGhUYWJsZVNlbGVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy92aGQtdGFibGUtc2VsZWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5maW5pdGUtc2Nyb2xsJztcbmltcG9ydCB7IFZhbHVlSGVscENvbHVtbkRlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdmFsdWUtaGVscC1jb2x1bW4tZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBWaGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmhkLWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVzdHJveWVkU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcblxubGV0IHRpdGxlVW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1zZWxlY3QtdGFiJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LXRhYi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LXRhYi5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbRGVzdHJveWVkU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0VGFiQ29tcG9uZW50PFQ+IGV4dGVuZHMgVmhkQmFzZVRhYiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZGVmYXVsdFRpdGxlSWQgPSBgZmQtc2VsZWN0LXRhYi10aXRsZS1pZC0ke3RpdGxlVW5pcXVlSWQrK31gO1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb3VudElkID0gYGZkLXNlbGVjdC10YWItdGl0bGUtY291bnQtaWQtJHt0aXRsZVVuaXF1ZUlkKyt9YDtcblxuICAgIC8qKiBTZWxlY3QgdGFiIHRpdGxlIGVsZW1lbnQgSUQgKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdFRhYlRpdGxlSWQ6IHN0cmluZyA9IHRoaXMuZGVmYXVsdFRpdGxlSWQ7XG5cbiAgICAvKiogU2VsZWN0IHRhYiBjb3VudCBlbGVtZW50IElEICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RUYWJDb3VudElkOiBzdHJpbmcgPSB0aGlzLmRlZmF1bHRDb3VudElkO1xuXG4gICAgLyoqIFNlbGVjdGVkIGl0ZW1zICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZDogVFtdID0gW107XG5cbiAgICAvKiogTG9hZGluZyBzdGF0ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIEFjdHVhbCBmaWx0ZXJzICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJzOiBWaGRGaWx0ZXJbXSA9IFtdO1xuXG4gICAgLyoqIENsb3NlIGRpYWxvZyBpbW1lZGlhdGVseSBhZnRlciBzZWxlY3QgYW55IHJvdyBmcm9tIHNlYXJjaCB0YWJsZS4gSXQnbGwgYmUgc2tpcHBlZCBpZiBtdWx0aSBvcHRpb24gaXMgdHJ1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2VsZWN0aW9uOiBWZGhUYWJsZVNlbGVjdGlvbiA9ICdzaW5nbGUnO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIDE4biBjYXBhYmlsaXRpZXMgaW5zdGVhZFxuICAgICAqIFRleHQgZGlzcGxheWVkIHdoZW4gdGFibGUgaGFzIG5vIGl0ZW1zLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW1wdHlUYWJsZU1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBVbmlxIGZpZWxkIGZyb20gZGF0YSBzb3VyY2UgKi9cbiAgICBASW5wdXQoKVxuICAgIHVuaXF1ZUtleSA9ICdpZCc7XG5cbiAgICAvKiogSXRlbXMgcGVyIHBhZ2UgZm9yIHBhZ2luYXRpb24gYmVsb3cgc2VhcmNoIHRhYmxlICovXG4gICAgQElucHV0KClcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqIENvdW50IG9mIGRlZmF1bHQgbW9iaWxlIGhlYWRlciBmcm9tIHNlYXJjaCB0YWJsZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGVmYXVsdE1vYmlsZUhlYWRlcnMgPSAyO1xuXG4gICAgLyoqIERpc3BsYXllZCBkYXRhIGZvciBzZWFyY2ggdGFibGUgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXllZERhdGE6IFRbXSA9IFtdO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gYWxsb3cgdXNlcnMgdG8gc2VsZWN0IGFsbCB0YWJsZSBlbnRyaWVzIHdpdGggb25lIGNoZWNrYm94LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dTZWxlY3RBbGwgPSB0cnVlO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiByb3cgd2FzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlKSBpbmZpbml0ZVNjcm9sbFRhYmxlOiBJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIGluZGV0ZXJtaW5hdGUgZmxhZyBmb3IgYHNlbGVjdCBhbGxgIGNoZWNrYm94ICovXG4gICAgX3NlbGVjdGVkQWxsOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gU2hvd24gaXRlbXMgY291bnQgaW4gbW9iaWxlIHZpZXcgKi9cbiAgICBfc2hvd25Gcm9tID0gMDtcblxuICAgIC8qKiBAaGlkZGVuIFNob3duIGl0ZW1zIGNvdW50IGluIG1vYmlsZSB2aWV3ICovXG4gICAgX3Nob3duQ291bnQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gQ3VycmVudCBwYWdlIGluIGRlc2t0b3AgdmlldyAqL1xuICAgIF9jdXJyZW50UGFnZSA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiBIZWFkZXJzIGFuZCBib2R5IGZvciBzZWFyY2ggdGFibGUgKi9cbiAgICBfdGFibGVGaWx0ZXJzOiB7XG4gICAgICAgIG1haW46IFZoZEZpbHRlcltdO1xuICAgICAgICBzZWNvbmRhcnk6IFZoZEZpbHRlcltdO1xuICAgIH0gPSB7XG4gICAgICAgIG1haW46IFtdLFxuICAgICAgICBzZWNvbmRhcnk6IFtdXG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlbGVjdGVkTWFwOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHNlbGVjdGVkSXRlbXM6IFRbXSA9IFtdO1xuXG4gICAgLyoqIFNlbGVjdGlvbiB0eXBlIGdldHRlcnMgKi9cbiAgICBnZXQgaXNTaW5nbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA9PT0gJ3NpbmdsZSc7XG4gICAgfVxuICAgIC8qKiBTZWxlY3Rpb24gdHlwZSBnZXR0ZXJzICovXG4gICAgZ2V0IGlzT25jZVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uID09PSAnb25jZSc7XG4gICAgfVxuICAgIC8qKiBTZWxlY3Rpb24gdHlwZSBnZXR0ZXJzICovXG4gICAgZ2V0IGlzTXVsdGlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA9PT0gJ211bHRpJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jb2x1bW5EZWZNYXAgPSBuZXcgTWFwPHN0cmluZywgVmFsdWVIZWxwQ29sdW1uRGVmRGlyZWN0aXZlPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aGQgPSBpbmplY3QoVmhkQ29tcG9uZW50LCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGluamVjdChEZXN0cm95ZWRTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodHJ1ZSkudGhlbigoKSA9PiB0aGlzLl9jaGVja1Njcm9sbEFuZFNob3dNb3JlKCkpO1xuXG4gICAgICAgIHRoaXMuX3ZoZD8uY29sdW1uRGVmLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5EZWZNYXAuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuX3ZoZD8uY29sdW1uRGVmLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5EZWZNYXAuc2V0KGl0ZW0uY29sdW1uLCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICgnZmlsdGVycycgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUZpbHRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Rpc3BsYXllZERhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hEaXNwbGF5ZWREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdzZWxlY3RlZCcgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZCB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTZWxlY3RlZE1hcCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFRyaXN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBUcmFjayBmdW5jdGlvbiBmb3IgbWFpbiBkYXRhICovXG4gICAgX3RyYWNrQnlUYWJsZVJvd0ZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBUKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtW3RoaXMudW5pcXVlS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gVHJhY2sgZnVuY3Rpb24gZm9yIGZpbHRlcnMgKi9cbiAgICBfdHJhY2tCeUZpbHRlckZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBWaGRGaWx0ZXIpOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gaXRlbSAmJiBpdGVtLmtleSA/IGl0ZW0ua2V5IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNob3cgbW9yZSBlbGVtZW50cyAqL1xuICAgIF9zaG93TW9yZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWdlU2l6ZSAmJiB0aGlzLl9zaG93bkNvdW50ICE9PSB0aGlzLmRpc3BsYXllZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ICs9IHRoaXMucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ID0gTWF0aC5taW4odGhpcy5fc2hvd25Db3VudCwgdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93bkNvdW50ID0gdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIHBhZ2UgaW4gZGVza3RvcCB2aWV3ICovXG4gICAgX3VwZGF0ZVBhZ2UocGFnZU51bWJlciA9IDEpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuX3Nob3duRnJvbSA9IChwYWdlTnVtYmVyIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCA9IE1hdGgubWluKHRoaXMuX3Nob3duRnJvbSArIHRoaXMucGFnZVNpemUsIHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCA9IHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBNZXRob2QgdG9nZ2xlIHNlbGVjdGVkIHN0YXRlIGZvciBhbGwgaXRlbXMgICovXG4gICAgX3RvZ2dsZUFsbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEFsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLmRpc3BsYXllZERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoU2VsZWN0ZWRNYXAoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaFRyaXN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHRvZ2dsZSBzZWxlY3RlZCBzdGF0ZSBmb3Igb25lIGl0ZW1zICAqL1xuICAgIF90b2dnbGVTZWxlY3RSb3coaXRlbTogVCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWRNYXBbaXRlbVt0aGlzLnVuaXF1ZUtleV1dO1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChzOiBUKSA9PiBzW3RoaXMudW5pcXVlS2V5XSAhPT0gaXRlbVt0aGlzLnVuaXF1ZUtleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW2l0ZW1bdGhpcy51bmlxdWVLZXldXSA9ICF0aGlzLl9zZWxlY3RlZE1hcFtpdGVtW3RoaXMudW5pcXVlS2V5XV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtpdGVtXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hUcmlzdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2hlY2tTY3JvbGxBbmRTaG93TW9yZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5fc2hvd25Db3VudCAhPT0gdGhpcy5kaXNwbGF5ZWREYXRhLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFRhYmxlPy5zaG91bGRUcmlnZ2VyQWN0aW9uKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93TW9yZUVsZW1lbnRzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Njcm9sbEFuZFNob3dNb3JlKCk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFNob3duKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dNb3JlRWxlbWVudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsQW5kU2hvd01vcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIE1hbnVhbGx5IGNsZWFyIHNlbGVjdGVkIGl0ZW1zICovXG4gICAgcHJpdmF0ZSBfY2xlYXJTZWxlY3RlZEl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZE1hcCA9IHt9O1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIGluZGV0ZXJtaW5hdGUgYXR0cmlidXRlIG9uIGBzZWxlY3QgYWxsYCBjaGVja2JveCAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hUcmlzdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3NlbGVjdGVkTWFwKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgICBpZiAoc2VsZWN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgPT09IHRoaXMuZGlzcGxheWVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNldCB1cCBmaWx0ZXJzICovXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZUZpbHRlcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgbGV0IF9tb2JpbGVUYWJsZUhlYWRlcnMgPSB0aGlzLmZpbHRlcnMuZmlsdGVyKChmKSA9PiBmLm1haW4pLm1hcCgoZikgPT4gZi5rZXkpO1xuICAgICAgICAgICAgaWYgKCFfbW9iaWxlVGFibGVIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF9tb2JpbGVUYWJsZUhlYWRlcnMgPSB0aGlzLmZpbHRlcnMuc2xpY2UoMCwgdGhpcy5kZWZhdWx0TW9iaWxlSGVhZGVycykubWFwKChmKSA9PiBmLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90YWJsZUZpbHRlcnMgPSB7XG4gICAgICAgICAgICAgICAgbWFpbjogdGhpcy5maWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBfbW9iaWxlVGFibGVIZWFkZXJzLnNvbWUoKGtleSkgPT4ga2V5ID09PSBmaWx0ZXIua2V5KSksXG4gICAgICAgICAgICAgICAgc2Vjb25kYXJ5OiB0aGlzLmZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+ICFfbW9iaWxlVGFibGVIZWFkZXJzLnNvbWUoKGtleSkgPT4ga2V5ID09PSBmaWx0ZXIua2V5KSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90YWJsZUZpbHRlcnMgPSB7XG4gICAgICAgICAgICAgICAgbWFpbjogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHNlY29uZGFyeTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZWZyZXNoIGRpc3BsYXkgZGF0YSAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hEaXNwbGF5ZWREYXRhKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZXNldFNob3duKCk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hUcmlzdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJlZnJlc2ggc2VsZWN0ZWQgbWFwIGZvciBkaXNwbGF5IGRhdGEgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2VsZWN0ZWRNYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRpc3BsYXllZERhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW2l0ZW1bdGhpcy51bmlxdWVLZXldXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkTWFwW3NbdGhpcy51bmlxdWVLZXldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgPGg1IGZkLXRpdGxlIHJvbGU9XCJoZWFkaW5nXCIgYXJpYS1sZXZlbD1cIjVcIj5cbiAgICAgICAge3sgJ3BsYXRmb3JtVkhELnNlbGVjdFRhYkRpc3BsYXlDb3VudExhYmVsJyB8IGZkVHJhbnNsYXRlIDogeyBjb3VudDogZGlzcGxheWVkRGF0YS5sZW5ndGggfSB9fVxuICAgIDwvaDU+XG48L2Rpdj5cbjxkaXZcbiAgICBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19fdGFibGUtaG9sZGVyIHRhYmxlLWNvbnRlbnRcIlxuICAgIGZkLXNjcm9sbGJhclxuICAgIGZkSW5maW5pdGVTY3JvbGxcbiAgICAob25TY3JvbGxBY3Rpb24pPVwiX3Nob3dNb3JlRWxlbWVudHMoKVwiXG4gICAgW3Njcm9sbFBlcmNlbnRdPVwiODBcIlxuICAgIHJvbGU9XCJ0YWJsZVwiXG4+XG4gICAgPHRhYmxlXG4gICAgICAgIGZkLXRhYmxlXG4gICAgICAgIFtwb3BJbl09XCJtb2JpbGVcIlxuICAgICAgICBbbm9Cb3JkZXJYXT1cIm1vYmlsZVwiXG4gICAgICAgIFtub0JvcmRlclldPVwiZmFsc2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbGNvdW50XT1cIl90YWJsZUZpbHRlcnMubWFpbi5sZW5ndGhcIlxuICAgICAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cImRpc3BsYXllZERhdGEubGVuZ3RoXCJcbiAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICBhcmlhLW11bHRpc2VsZWN0YWJsZT1cInRydWVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwic2VsZWN0VGFiVGl0bGVJZCArICcgJyArIHNlbGVjdFRhYkNvdW50SWRcIlxuICAgID5cbiAgICAgICAgPGxhYmVsIFtpZF09XCJzZWxlY3RUYWJDb3VudElkXCIgZmQtZm9ybS1sYWJlbCBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19faGlkZGVuX2xhYmVsXCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdwbGF0Zm9ybVZIRC5zZWxlY3RUYWJDb3VudEhpZGRlbkExMXlMYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgcm93Q291bnQ6IGRpc3BsYXllZERhdGEubGVuZ3RoLCBjb2xDb3VudDogX3RhYmxlRmlsdGVycy5tYWluLmxlbmd0aCB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgW2lkXT1cInNlbGVjdFRhYlRpdGxlSWRcIiBmZC1mb3JtLWxhYmVsIGNsYXNzPVwiZmRwLXZhbHVlLWhlbHAtZGlhbG9nX19oaWRkZW5fbGFiZWxcIj5cbiAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVZIRC5zZWxlY3RUYWJEaXNwbGF5Q291bnRMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IGRpc3BsYXllZERhdGEubGVuZ3RoIH0gfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHRoZWFkIGZkLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3cgKm5nSWY9XCJkaXNwbGF5ZWREYXRhLmxlbmd0aCAmJiBfdGFibGVGaWx0ZXJzXCI+XG4gICAgICAgICAgICAgICAgPHRoIGZkLXRhYmxlLWNlbGwgW2ZpdENvbnRlbnRdPVwibW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpU2VsZWN0aW9uICYmIGFsbG93U2VsZWN0QWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInVpZCArICctcm93LWFsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlU2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfc2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZUFsbFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBfdGFibGVGaWx0ZXJzLm1haW47IHRyYWNrQnk6IF90cmFja0J5RmlsdGVyRm47IGxldCBjb2xpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJjb2xpbmRleFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXIubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5IGZkLXRhYmxlLWJvZHk+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZGlzcGxheWVkRGF0YSB8IHNsaWNlIDogX3Nob3duRnJvbSA6IF9zaG93bkNvdW50O1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiBfdHJhY2tCeVRhYmxlUm93Rm47XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IGFzIGlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICBmZC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAgICAgW2hvdmVyYWJsZV09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW21haW5dPVwibW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJfc2VsZWN0ZWRNYXBbcm93W3VuaXF1ZUtleV1dXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2YWJsZV09XCIhaXNNdWx0aVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNNdWx0aVNlbGVjdGlvbiAmJiBfdG9nZ2xlU2VsZWN0Um93KHJvdylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgW2ZpdENvbnRlbnRdPVwibW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInVpZCArICctcm93LScgKyBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfc2VsZWN0ZWRNYXBbcm93W3VuaXF1ZUtleV1dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl90b2dnbGVTZWxlY3RSb3cocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9mZC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIF90YWJsZUZpbHRlcnMubWFpbjsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfY29sdW1uRGVmTWFwLmdldChmaWx0ZXIua2V5KSBhcyBjb2x1bW5EZWY7IGVsc2UgZGVmYXVsdENvbHVtblJlbmRlcmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbkRlZi50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmlsdGVyLmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3dbZmlsdGVyLmtleV0gfHwgJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbHVtblJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd1tmaWx0ZXIua2V5XSB8fCAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIGZkLXRhYmxlLXJvd1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZSAmJiBfdGFibGVGaWx0ZXJzLnNlY29uZGFyeS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbc2Vjb25kYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIl9zZWxlY3RlZE1hcFtyb3dbdW5pcXVlS2V5XV1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGw+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDAlXCIgZmQtdGFibGUtY2VsbCBbZml0Q29udGVudF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBmZC10YWJsZS10ZXh0ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgX3RhYmxlRmlsdGVycy5zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZmlsdGVyLmxhYmVsIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93W2ZpbHRlci5rZXldIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgZmQtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWREYXRhLmxlbmd0aCAmJiBtb2JpbGUgJiYgX3Nob3duQ291bnQgJiYgX3Nob3duQ291bnQgIT09IGRpc3BsYXllZERhdGEubGVuZ3RoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmZC1iYXIgYmFyRGVzaWduPVwiaGVhZGVyLXdpdGgtc3ViaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1taWRkbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm1WSEQuc2VsZWN0VGFiTW9yZUJ0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfc2hvd01vcmVFbGVtZW50cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyAmJiAhZGlzcGxheWVkRGF0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93ICpmZGtSZXBlYXQ9XCIzXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBmZC10YWJsZS1jZWxsICpmZGtSZXBlYXQ9XCIzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtc2tlbGV0b24gc3R5bGU9XCJtYXJnaW46IGF1dG8gMFwiIHR5cGU9XCJ0ZXh0XCIgdGV4dExpbmVzPVwiMVwiIHdpZHRoPVwiNjAlXCI+PC9mZC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIWRpc3BsYXllZERhdGEubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZkcC12YWx1ZS1oZWxwLWRpYWxvZ19fZW1wdHktbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZW1wdHlUYWJsZU1lc3NhZ2UgfHwgKCdwbGF0Zm9ybVZIRC5zZWFyY2hUYWJsZUVtcHR5TWVzc2FnZScgfCBmZFRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbjwvZGl2PlxuIl19