igniteui-angular 15.1.27 → 15.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/grids/columns/column-group.component.mjs +5 -1
- package/esm2020/lib/grids/columns/column.component.mjs +10 -2
- package/esm2020/lib/grids/common/grid.interface.mjs +1 -1
- package/esm2020/lib/grids/grid/grid-row.component.mjs +3 -3
- package/esm2020/lib/grids/grid-base.directive.mjs +3 -2
- package/esm2020/lib/grids/headers/grid-header-row.component.mjs +3 -3
- package/esm2020/lib/grids/headers/pipes.mjs +2 -3
- package/esm2020/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +18 -10
- package/esm2020/lib/grids/hierarchical-grid/hierarchical-row.component.mjs +3 -3
- package/esm2020/lib/grids/pivot-grid/pivot-header-row.component.mjs +3 -3
- package/esm2020/lib/grids/pivot-grid/pivot-row.component.mjs +3 -3
- package/esm2020/lib/grids/summaries/summary-row.component.mjs +3 -3
- package/esm2020/lib/grids/tree-grid/tree-grid-row.component.mjs +3 -3
- package/fesm2015/igniteui-angular.mjs +47 -27
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +47 -27
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/lib/grids/columns/column-group.component.d.ts +2 -0
- package/lib/grids/columns/column.component.d.ts +2 -0
- package/lib/grids/common/grid.interface.d.ts +5 -0
- package/lib/grids/grid-base.directive.d.ts +0 -1
- package/lib/grids/hierarchical-grid/hierarchical-grid.component.d.ts +3 -1
- package/package.json +2 -2
|
@@ -440,10 +440,10 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
|
|
|
440
440
|
}
|
|
441
441
|
}
|
|
442
442
|
IgxPivotHeaderRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: IgxPivotHeaderRowComponent, deps: [{ token: IGX_GRID_BASE }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
443
|
-
IgxPivotHeaderRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: IgxPivotHeaderRowComponent, selector: "igx-pivot-header-row", viewQueries: [{ propertyName: "esf", first: true, predicate: ["esf"], descendants: true }, { propertyName: "filterArea", first: true, predicate: ["filterAreaHidden"], descendants: true }, { propertyName: "filtersButton", first: true, predicate: ["filterIcon"], descendants: true }, { propertyName: "dropdownChips", first: true, predicate: ["dropdownChips"], descendants: true }, { propertyName: "pivotFilterContainer", first: true, predicate: ["pivotFilterContainer"], descendants: true }, { propertyName: "notificationChips", predicate: ["notifyChip"], descendants: true }, { propertyName: "headerContainers", predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"igx-grid-thead__wrapper igx-grid-thead__wrapper--pivot\" role=\"row\" [style.width.px]=\"width\">\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div class='igx-grid__tr-pivot--filter-container'>\n <div #pivotFilterContainer *ngIf=\"grid.showPivotConfigurationUI\"\n class=\"igx-grid__tr-pivot igx-grid__tr-pivot--filter\" [style.min-width.px]=\"grid.pivotRowWidths - 1\"\n [style.max-width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, filterArea)\"\n igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Filter area -->\n <igx-chips-area #filterArea droppable='true'>\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\"\n *ngIf=\"grid.filterDimensions.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_filter_drop_area}}</span>\n <ng-container *ngFor=\"let filter of this.filterAreaDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n <igx-chip [id]=\"filter.memberName\" [draggable]=\"true\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'filter' }\"\n [removable]=\"true\" (remove)=\"filterRemoved($event)\" (dragOver)=\"onDimDragOver($event, 2)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, filterArea, 2)\"\n (moveStart)='onDimDragStart($event, filterArea)' (moveEnd)='onDimDragEnd()'>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, filter)'>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, filterArea, 2)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_filter_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n <div class=\"igx-grid__pivot-filter-toggle\" *ngIf=\"isFiltersButton && grid.filterDimensions.length !== 0\">\n <igx-icon #filterIcon (pointerdown)='onFilteringIconPointerDown($event)' (click)='onFiltersAreaDropdownClick($event)'>filter_list</igx-icon>\n <igx-badge value=\"{{this.filterDropdownDimensions.size}}\"></igx-badge>\n </div>\n </div>\n <div class='igx-grid__tr-pivot--drop-row-area' (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\">\n </div>\n </div>\n\n <div class=\"igx-grid__tr-pivot-group\">\n <div #pivotColumnContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop (igxDragLeave)=\"onAreaDragLeave($event, colArea)\">\n <!-- Columns area -->\n <igx-chips-area #colArea droppable='true'>\n <span id='empty' (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop\n *ngIf=\"grid.columnDimensions.length === 0\" class='igx-grid__pivot-empty-chip-area'>\n {{grid.resourceStrings.igx_grid_pivot_empty_column_drop_area}}</span>\n <ng-container *ngFor=\"let col of grid.columnDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"col.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'column' }\"\n [removable]=\"true\" (remove)=\"columnRemoved($event)\" (dragOver)=\"onDimDragOver($event, 1)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, colArea, 1)\"\n (moveStart)='onDimDragStart($event, colArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, col)\">\n <igx-icon igxPrefix>view_column</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, col)'>filter_list</igx-icon>\n {{col.memberName}}\n <igx-icon *ngIf=\"col.sortDirection\" igxSuffix> {{ col.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, colArea, 1)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_column_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n\n <div #pivotValueContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (pointerdown)=\"$event.preventDefault()\" (dropped)=\"onValueDrop($event, valueArea)\" igxDrop\n (igxDragLeave)=\"onAreaDragLeave($event, valueArea)\">\n <!-- Value area -->\n <igx-chips-area #valueArea droppable='true'>\n <span id='empty' (dropped)=\"onValueDrop($event, valueArea)\" igxDrop *ngIf=\"grid.values.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_value_drop_area}}</span>\n <ng-container *ngFor=\"let value of grid.values; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n <igx-chip #currChip [draggable]=\"true\" [id]=\"value.displayName || value.member\" [data]=\"{ pivotArea: 'value' }\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"valueRemoved($event)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragOver)=\"onDimDragOver($event)\"\n (dragDrop)=\"onValueDrop($event, valueArea)\">\n <div class=\"igx-grid__tr-pivot-toggle-icons\" igxPrefix\n (click)='onSummaryClick($event, value, dropdown, currChip)'\n (pointerdown)='$event.stopPropagation()' [igxDropDownItemNavigation]=\"dropdown\">\n <igx-icon>functions</igx-icon>\n <igx-icon>arrow_drop_down</igx-icon>\n </div>\n <ng-container *ngTemplateOutlet=\"grid.valueChipTemplate ? grid.valueChipTemplate : valueChipDefaultTemplate; context: { $implicit: value }\"></ng-container>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onValueDrop($event, valueArea)\" #notifyValueChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_value_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [attr.aria-activedescendant]=\"activeDescendant\" [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div #pivotContainer class=\"igx-grid__tr-pivot igx-grid__tr-pivot--row-area\"\n [style.width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Row area -->\n <igx-chips-area #rowArea droppable='true'>\n <ng-container *ngIf=\"grid.showPivotConfigurationUI\">\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, rowArea, 0)\"\n *ngIf=\"grid.rowDimensions.length === 0 && grid.showPivotConfigurationUI\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_row_drop_area}}</span>\n <ng-container *ngFor=\"let row of grid.rowDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"row.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'row' }\"\n [removable]=\"true\" (remove)=\"rowRemoved($event)\" (dragLeave)=\"onDimDragLeave($event)\"\n (dragDrop)=\"onDimDrop($event, rowArea, 0)\" (dragOver)=\"onDimDragOver($event, 0)\"\n (moveStart)='onDimDragStart($event, rowArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, row)\">\n <igx-icon igxPrefix>table_rows</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, row)'>filter_list</igx-icon>\n {{ row.memberName}}\n <igx-icon *ngIf=\"row.sortDirection\" igxSuffix> {{ row.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, rowArea, 0)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_row_drop_chip}}\n </igx-chip>\n </ng-container>\n </igx-chips-area>\n </div>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n <div class=\"igx-grid-thead--virtualizationWrapper\" [style.max-height.px]='maxContainerHeight'>\n <div class=\"igx-grid-thead__group igx-grid-thead--virtualizationContainer\" [style.height.px]='totalDepth > 1 ? grid.rowHeight : undefined' *ngFor='let dimLevelColumns of columnDimensionsByLevel; let i = index' [style.width.px]='grid.unpinnedWidth'>\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"dimLevelColumns\" [igxGridForOfUniqueSizeCache] = 'true' [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\" [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\" [igxForScrollOrientation]=\"'horizontal'\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [style.height.px]='totalDepth > 1 ? calcHeight(column, i) : undefined'\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [class.igx-grid__tr-pivot--columnDimensionLeaf] = 'isDuplicateOfExistingParent(column, i)'\n [class.igx-grid__tr-pivot--columnMultiRowSpan] = 'isMultiRow(column, i)'\n >\n </igx-grid-header-group>\n </ng-template>\n </div>\n </div>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\" (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\">\n</div>\n\n<igx-drop-down #dropdown (selectionChanging)='onAggregationChange($event)'>\n <igx-drop-down-item *ngFor=\"let item of aggregateList\" [selected]='isSelected(item)' [value]='item'>\n {{ item.label }}\n </igx-drop-down-item>\n</igx-drop-down>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='grid.excelStyleFilterMaxHeight' [minHeight]='grid.excelStyleFilterMinHeight' #esf>\n <div igxExcelStyleColumnOperations>\n <igx-chips-area #dropdownChips>\n <igx-chip *ngFor=\"let filter of this.filterDropdownDimensions\" [id]=\"filter.memberName\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\"\n (chipClick)='onFiltersSelectionChanged($event)' [selectable]='true' [selected]='filter === this.filterDropdownDimensions.values().next().value'>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n </div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n\n<div style=\"visibility: hidden; position: absolute; top: -10000px\">\n <igx-chips-area #filterAreaHidden droppable='true'>\n <igx-chip *ngFor=\"let filter of grid.filterDimensions\" [id]=\"filter.memberName\" [draggable]=\"true\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\">\n <igx-icon igxPrefix>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n</div>\n\n<ng-template #valueChipDefaultTemplate let-value>\n {{value.aggregate.key}}({{value.displayName || value.member}})\n</ng-template>\n", dependencies: [{ kind: "component", type: i1.IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "component", type: i2.IgxGridExcelStyleFilteringComponent, selector: "igx-grid-excel-style-filtering", inputs: ["column", "minHeight", "maxHeight"], outputs: ["loadingStart", "loadingEnd", "initialized", "sortingChanged", "columnChange", "listDataLoaded"] }, { kind: "directive", type: i2.IgxExcelStyleColumnOperationsTemplateDirective, selector: "igx-excel-style-column-operations,[igxExcelStyleColumnOperations]" }, { kind: "directive", type: i2.IgxExcelStyleFilterOperationsTemplateDirective, selector: "igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]" }, { kind: "component", type: i3.IgxExcelStyleSearchComponent, selector: "igx-excel-style-search" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: i6.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: i9.IgxBadgeComponent, selector: "igx-badge", inputs: ["id", "type", "value", "icon", "shape"] }, { kind: "component", type: i10.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i11.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: i12.IgxDropDirective, selector: "[igxDrop]", inputs: ["igxDrop", "dropChannel", "dropStrategy"], outputs: ["enter", "over", "leave", "dropped"], exportAs: ["drop"] }, { kind: "component", type: i13.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i14.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i15.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "pipe", type: i16.IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: i16.IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }, { kind: "pipe", type: i17.IgxGridTopLevelColumns, name: "igxTopLevel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
443
|
+
IgxPivotHeaderRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: IgxPivotHeaderRowComponent, selector: "igx-pivot-header-row", viewQueries: [{ propertyName: "esf", first: true, predicate: ["esf"], descendants: true }, { propertyName: "filterArea", first: true, predicate: ["filterAreaHidden"], descendants: true }, { propertyName: "filtersButton", first: true, predicate: ["filterIcon"], descendants: true }, { propertyName: "dropdownChips", first: true, predicate: ["dropdownChips"], descendants: true }, { propertyName: "pivotFilterContainer", first: true, predicate: ["pivotFilterContainer"], descendants: true }, { propertyName: "notificationChips", predicate: ["notifyChip"], descendants: true }, { propertyName: "headerContainers", predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"igx-grid-thead__wrapper igx-grid-thead__wrapper--pivot\" role=\"row\" [style.width.px]=\"width\">\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div class='igx-grid__tr-pivot--filter-container'>\n <div #pivotFilterContainer *ngIf=\"grid.showPivotConfigurationUI\"\n class=\"igx-grid__tr-pivot igx-grid__tr-pivot--filter\" [style.min-width.px]=\"grid.pivotRowWidths - 1\"\n [style.max-width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, filterArea)\"\n igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Filter area -->\n <igx-chips-area #filterArea droppable='true'>\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\"\n *ngIf=\"grid.filterDimensions.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_filter_drop_area}}</span>\n <ng-container *ngFor=\"let filter of this.filterAreaDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n <igx-chip [id]=\"filter.memberName\" [draggable]=\"true\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'filter' }\"\n [removable]=\"true\" (remove)=\"filterRemoved($event)\" (dragOver)=\"onDimDragOver($event, 2)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, filterArea, 2)\"\n (moveStart)='onDimDragStart($event, filterArea)' (moveEnd)='onDimDragEnd()'>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, filter)'>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, filterArea, 2)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_filter_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n <div class=\"igx-grid__pivot-filter-toggle\" *ngIf=\"isFiltersButton && grid.filterDimensions.length !== 0\">\n <igx-icon #filterIcon (pointerdown)='onFilteringIconPointerDown($event)' (click)='onFiltersAreaDropdownClick($event)'>filter_list</igx-icon>\n <igx-badge value=\"{{this.filterDropdownDimensions.size}}\"></igx-badge>\n </div>\n </div>\n <div class='igx-grid__tr-pivot--drop-row-area' (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\">\n </div>\n </div>\n\n <div class=\"igx-grid__tr-pivot-group\">\n <div #pivotColumnContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop (igxDragLeave)=\"onAreaDragLeave($event, colArea)\">\n <!-- Columns area -->\n <igx-chips-area #colArea droppable='true'>\n <span id='empty' (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop\n *ngIf=\"grid.columnDimensions.length === 0\" class='igx-grid__pivot-empty-chip-area'>\n {{grid.resourceStrings.igx_grid_pivot_empty_column_drop_area}}</span>\n <ng-container *ngFor=\"let col of grid.columnDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"col.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'column' }\"\n [removable]=\"true\" (remove)=\"columnRemoved($event)\" (dragOver)=\"onDimDragOver($event, 1)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, colArea, 1)\"\n (moveStart)='onDimDragStart($event, colArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, col)\">\n <igx-icon igxPrefix>view_column</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, col)'>filter_list</igx-icon>\n {{col.memberName}}\n <igx-icon *ngIf=\"col.sortDirection\" igxSuffix> {{ col.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, colArea, 1)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_column_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n\n <div #pivotValueContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (pointerdown)=\"$event.preventDefault()\" (dropped)=\"onValueDrop($event, valueArea)\" igxDrop\n (igxDragLeave)=\"onAreaDragLeave($event, valueArea)\">\n <!-- Value area -->\n <igx-chips-area #valueArea droppable='true'>\n <span id='empty' (dropped)=\"onValueDrop($event, valueArea)\" igxDrop *ngIf=\"grid.values.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_value_drop_area}}</span>\n <ng-container *ngFor=\"let value of grid.values; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n <igx-chip #currChip [draggable]=\"true\" [id]=\"value.displayName || value.member\" [data]=\"{ pivotArea: 'value' }\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"valueRemoved($event)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragOver)=\"onDimDragOver($event)\"\n (dragDrop)=\"onValueDrop($event, valueArea)\">\n <div class=\"igx-grid__tr-pivot-toggle-icons\" igxPrefix\n (click)='onSummaryClick($event, value, dropdown, currChip)'\n (pointerdown)='$event.stopPropagation()' [igxDropDownItemNavigation]=\"dropdown\">\n <igx-icon>functions</igx-icon>\n <igx-icon>arrow_drop_down</igx-icon>\n </div>\n <ng-container *ngTemplateOutlet=\"grid.valueChipTemplate ? grid.valueChipTemplate : valueChipDefaultTemplate; context: { $implicit: value }\"></ng-container>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onValueDrop($event, valueArea)\" #notifyValueChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_value_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [attr.aria-activedescendant]=\"activeDescendant\" [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div #pivotContainer class=\"igx-grid__tr-pivot igx-grid__tr-pivot--row-area\"\n [style.width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Row area -->\n <igx-chips-area #rowArea droppable='true'>\n <ng-container *ngIf=\"grid.showPivotConfigurationUI\">\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, rowArea, 0)\"\n *ngIf=\"grid.rowDimensions.length === 0 && grid.showPivotConfigurationUI\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_row_drop_area}}</span>\n <ng-container *ngFor=\"let row of grid.rowDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"row.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'row' }\"\n [removable]=\"true\" (remove)=\"rowRemoved($event)\" (dragLeave)=\"onDimDragLeave($event)\"\n (dragDrop)=\"onDimDrop($event, rowArea, 0)\" (dragOver)=\"onDimDragOver($event, 0)\"\n (moveStart)='onDimDragStart($event, rowArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, row)\">\n <igx-icon igxPrefix>table_rows</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, row)'>filter_list</igx-icon>\n {{ row.memberName}}\n <igx-icon *ngIf=\"row.sortDirection\" igxSuffix> {{ row.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, rowArea, 0)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_row_drop_chip}}\n </igx-chip>\n </ng-container>\n </igx-chips-area>\n </div>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n <div class=\"igx-grid-thead--virtualizationWrapper\" [style.max-height.px]='maxContainerHeight'>\n <div class=\"igx-grid-thead__group igx-grid-thead--virtualizationContainer\" [style.height.px]='totalDepth > 1 ? grid.rowHeight : undefined' *ngFor='let dimLevelColumns of columnDimensionsByLevel; let i = index' [style.width.px]='grid.unpinnedWidth'>\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"dimLevelColumns\" [igxGridForOfUniqueSizeCache] = 'true' [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\" [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\" [igxForScrollOrientation]=\"'horizontal'\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [style.height.px]='totalDepth > 1 ? calcHeight(column, i) : undefined'\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [class.igx-grid__tr-pivot--columnDimensionLeaf] = 'isDuplicateOfExistingParent(column, i)'\n [class.igx-grid__tr-pivot--columnMultiRowSpan] = 'isMultiRow(column, i)'\n >\n </igx-grid-header-group>\n </ng-template>\n </div>\n </div>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\" (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\">\n</div>\n\n<igx-drop-down #dropdown (selectionChanging)='onAggregationChange($event)'>\n <igx-drop-down-item *ngFor=\"let item of aggregateList\" [selected]='isSelected(item)' [value]='item'>\n {{ item.label }}\n </igx-drop-down-item>\n</igx-drop-down>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='grid.excelStyleFilterMaxHeight' [minHeight]='grid.excelStyleFilterMinHeight' #esf>\n <div igxExcelStyleColumnOperations>\n <igx-chips-area #dropdownChips>\n <igx-chip *ngFor=\"let filter of this.filterDropdownDimensions\" [id]=\"filter.memberName\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\"\n (chipClick)='onFiltersSelectionChanged($event)' [selectable]='true' [selected]='filter === this.filterDropdownDimensions.values().next().value'>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n </div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n\n<div style=\"visibility: hidden; position: absolute; top: -10000px\">\n <igx-chips-area #filterAreaHidden droppable='true'>\n <igx-chip *ngFor=\"let filter of grid.filterDimensions\" [id]=\"filter.memberName\" [draggable]=\"true\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\">\n <igx-icon igxPrefix>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n</div>\n\n<ng-template #valueChipDefaultTemplate let-value>\n {{value.aggregate.key}}({{value.displayName || value.member}})\n</ng-template>\n", dependencies: [{ kind: "component", type: i1.IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "component", type: i2.IgxGridExcelStyleFilteringComponent, selector: "igx-grid-excel-style-filtering", inputs: ["column", "minHeight", "maxHeight"], outputs: ["loadingStart", "loadingEnd", "initialized", "sortingChanged", "columnChange", "listDataLoaded"] }, { kind: "directive", type: i2.IgxExcelStyleColumnOperationsTemplateDirective, selector: "igx-excel-style-column-operations,[igxExcelStyleColumnOperations]" }, { kind: "directive", type: i2.IgxExcelStyleFilterOperationsTemplateDirective, selector: "igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]" }, { kind: "component", type: i3.IgxExcelStyleSearchComponent, selector: "igx-excel-style-search" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: i6.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: i9.IgxBadgeComponent, selector: "igx-badge", inputs: ["id", "type", "value", "icon", "shape"] }, { kind: "component", type: i10.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i11.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: i12.IgxDropDirective, selector: "[igxDrop]", inputs: ["igxDrop", "dropChannel", "dropStrategy"], outputs: ["enter", "over", "leave", "dropped"], exportAs: ["drop"] }, { kind: "component", type: i13.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i14.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i15.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "pipe", type: i16.IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: i16.IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }, { kind: "pipe", type: i17.IgxGridTopLevelColumns, name: "igxTopLevel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
444
444
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: IgxPivotHeaderRowComponent, decorators: [{
|
|
445
445
|
type: Component,
|
|
446
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-pivot-header-row', template: "<div>\n <div class=\"igx-grid-thead__wrapper igx-grid-thead__wrapper--pivot\" role=\"row\" [style.width.px]=\"width\">\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div class='igx-grid__tr-pivot--filter-container'>\n <div #pivotFilterContainer *ngIf=\"grid.showPivotConfigurationUI\"\n class=\"igx-grid__tr-pivot igx-grid__tr-pivot--filter\" [style.min-width.px]=\"grid.pivotRowWidths - 1\"\n [style.max-width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, filterArea)\"\n igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Filter area -->\n <igx-chips-area #filterArea droppable='true'>\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\"\n *ngIf=\"grid.filterDimensions.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_filter_drop_area}}</span>\n <ng-container *ngFor=\"let filter of this.filterAreaDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n <igx-chip [id]=\"filter.memberName\" [draggable]=\"true\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'filter' }\"\n [removable]=\"true\" (remove)=\"filterRemoved($event)\" (dragOver)=\"onDimDragOver($event, 2)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, filterArea, 2)\"\n (moveStart)='onDimDragStart($event, filterArea)' (moveEnd)='onDimDragEnd()'>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, filter)'>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, filterArea, 2)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_filter_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n <div class=\"igx-grid__pivot-filter-toggle\" *ngIf=\"isFiltersButton && grid.filterDimensions.length !== 0\">\n <igx-icon #filterIcon (pointerdown)='onFilteringIconPointerDown($event)' (click)='onFiltersAreaDropdownClick($event)'>filter_list</igx-icon>\n <igx-badge value=\"{{this.filterDropdownDimensions.size}}\"></igx-badge>\n </div>\n </div>\n <div class='igx-grid__tr-pivot--drop-row-area' (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\">\n </div>\n </div>\n\n <div class=\"igx-grid__tr-pivot-group\">\n <div #pivotColumnContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop (igxDragLeave)=\"onAreaDragLeave($event, colArea)\">\n <!-- Columns area -->\n <igx-chips-area #colArea droppable='true'>\n <span id='empty' (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop\n *ngIf=\"grid.columnDimensions.length === 0\" class='igx-grid__pivot-empty-chip-area'>\n {{grid.resourceStrings.igx_grid_pivot_empty_column_drop_area}}</span>\n <ng-container *ngFor=\"let col of grid.columnDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"col.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'column' }\"\n [removable]=\"true\" (remove)=\"columnRemoved($event)\" (dragOver)=\"onDimDragOver($event, 1)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, colArea, 1)\"\n (moveStart)='onDimDragStart($event, colArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, col)\">\n <igx-icon igxPrefix>view_column</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, col)'>filter_list</igx-icon>\n {{col.memberName}}\n <igx-icon *ngIf=\"col.sortDirection\" igxSuffix> {{ col.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, colArea, 1)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_column_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n\n <div #pivotValueContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (pointerdown)=\"$event.preventDefault()\" (dropped)=\"onValueDrop($event, valueArea)\" igxDrop\n (igxDragLeave)=\"onAreaDragLeave($event, valueArea)\">\n <!-- Value area -->\n <igx-chips-area #valueArea droppable='true'>\n <span id='empty' (dropped)=\"onValueDrop($event, valueArea)\" igxDrop *ngIf=\"grid.values.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_value_drop_area}}</span>\n <ng-container *ngFor=\"let value of grid.values; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n <igx-chip #currChip [draggable]=\"true\" [id]=\"value.displayName || value.member\" [data]=\"{ pivotArea: 'value' }\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"valueRemoved($event)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragOver)=\"onDimDragOver($event)\"\n (dragDrop)=\"onValueDrop($event, valueArea)\">\n <div class=\"igx-grid__tr-pivot-toggle-icons\" igxPrefix\n (click)='onSummaryClick($event, value, dropdown, currChip)'\n (pointerdown)='$event.stopPropagation()' [igxDropDownItemNavigation]=\"dropdown\">\n <igx-icon>functions</igx-icon>\n <igx-icon>arrow_drop_down</igx-icon>\n </div>\n <ng-container *ngTemplateOutlet=\"grid.valueChipTemplate ? grid.valueChipTemplate : valueChipDefaultTemplate; context: { $implicit: value }\"></ng-container>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onValueDrop($event, valueArea)\" #notifyValueChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_value_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [attr.aria-activedescendant]=\"activeDescendant\" [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div #pivotContainer class=\"igx-grid__tr-pivot igx-grid__tr-pivot--row-area\"\n [style.width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Row area -->\n <igx-chips-area #rowArea droppable='true'>\n <ng-container *ngIf=\"grid.showPivotConfigurationUI\">\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, rowArea, 0)\"\n *ngIf=\"grid.rowDimensions.length === 0 && grid.showPivotConfigurationUI\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_row_drop_area}}</span>\n <ng-container *ngFor=\"let row of grid.rowDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"row.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'row' }\"\n [removable]=\"true\" (remove)=\"rowRemoved($event)\" (dragLeave)=\"onDimDragLeave($event)\"\n (dragDrop)=\"onDimDrop($event, rowArea, 0)\" (dragOver)=\"onDimDragOver($event, 0)\"\n (moveStart)='onDimDragStart($event, rowArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, row)\">\n <igx-icon igxPrefix>table_rows</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, row)'>filter_list</igx-icon>\n {{ row.memberName}}\n <igx-icon *ngIf=\"row.sortDirection\" igxSuffix> {{ row.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, rowArea, 0)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_row_drop_chip}}\n </igx-chip>\n </ng-container>\n </igx-chips-area>\n </div>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n <div class=\"igx-grid-thead--virtualizationWrapper\" [style.max-height.px]='maxContainerHeight'>\n <div class=\"igx-grid-thead__group igx-grid-thead--virtualizationContainer\" [style.height.px]='totalDepth > 1 ? grid.rowHeight : undefined' *ngFor='let dimLevelColumns of columnDimensionsByLevel; let i = index' [style.width.px]='grid.unpinnedWidth'>\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"dimLevelColumns\" [igxGridForOfUniqueSizeCache] = 'true' [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\" [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\" [igxForScrollOrientation]=\"'horizontal'\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [style.height.px]='totalDepth > 1 ? calcHeight(column, i) : undefined'\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [class.igx-grid__tr-pivot--columnDimensionLeaf] = 'isDuplicateOfExistingParent(column, i)'\n [class.igx-grid__tr-pivot--columnMultiRowSpan] = 'isMultiRow(column, i)'\n >\n </igx-grid-header-group>\n </ng-template>\n </div>\n </div>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.calcWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\" (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\">\n</div>\n\n<igx-drop-down #dropdown (selectionChanging)='onAggregationChange($event)'>\n <igx-drop-down-item *ngFor=\"let item of aggregateList\" [selected]='isSelected(item)' [value]='item'>\n {{ item.label }}\n </igx-drop-down-item>\n</igx-drop-down>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='grid.excelStyleFilterMaxHeight' [minHeight]='grid.excelStyleFilterMinHeight' #esf>\n <div igxExcelStyleColumnOperations>\n <igx-chips-area #dropdownChips>\n <igx-chip *ngFor=\"let filter of this.filterDropdownDimensions\" [id]=\"filter.memberName\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\"\n (chipClick)='onFiltersSelectionChanged($event)' [selectable]='true' [selected]='filter === this.filterDropdownDimensions.values().next().value'>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n </div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n\n<div style=\"visibility: hidden; position: absolute; top: -10000px\">\n <igx-chips-area #filterAreaHidden droppable='true'>\n <igx-chip *ngFor=\"let filter of grid.filterDimensions\" [id]=\"filter.memberName\" [draggable]=\"true\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\">\n <igx-icon igxPrefix>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n</div>\n\n<ng-template #valueChipDefaultTemplate let-value>\n {{value.aggregate.key}}({{value.displayName || value.member}})\n</ng-template>\n" }]
|
|
446
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-pivot-header-row', template: "<div>\n <div class=\"igx-grid-thead__wrapper igx-grid-thead__wrapper--pivot\" role=\"row\" [style.width.px]=\"width\">\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div class='igx-grid__tr-pivot--filter-container'>\n <div #pivotFilterContainer *ngIf=\"grid.showPivotConfigurationUI\"\n class=\"igx-grid__tr-pivot igx-grid__tr-pivot--filter\" [style.min-width.px]=\"grid.pivotRowWidths - 1\"\n [style.max-width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, filterArea)\"\n igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Filter area -->\n <igx-chips-area #filterArea droppable='true'>\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, filterArea, 2)\"\n *ngIf=\"grid.filterDimensions.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_filter_drop_area}}</span>\n <ng-container *ngFor=\"let filter of this.filterAreaDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n <igx-chip [id]=\"filter.memberName\" [draggable]=\"true\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'filter' }\"\n [removable]=\"true\" (remove)=\"filterRemoved($event)\" (dragOver)=\"onDimDragOver($event, 2)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, filterArea, 2)\"\n (moveStart)='onDimDragStart($event, filterArea)' (moveEnd)='onDimDragEnd()'>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, filter)'>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(filterArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, filterArea, 2)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_filter_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n <div class=\"igx-grid__pivot-filter-toggle\" *ngIf=\"isFiltersButton && grid.filterDimensions.length !== 0\">\n <igx-icon #filterIcon (pointerdown)='onFilteringIconPointerDown($event)' (click)='onFiltersAreaDropdownClick($event)'>filter_list</igx-icon>\n <igx-badge value=\"{{this.filterDropdownDimensions.size}}\"></igx-badge>\n </div>\n </div>\n <div class='igx-grid__tr-pivot--drop-row-area' (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\">\n </div>\n </div>\n\n <div class=\"igx-grid__tr-pivot-group\">\n <div #pivotColumnContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop (igxDragLeave)=\"onAreaDragLeave($event, colArea)\">\n <!-- Columns area -->\n <igx-chips-area #colArea droppable='true'>\n <span id='empty' (dropped)=\"onDimDrop($event, colArea, 1)\" igxDrop\n *ngIf=\"grid.columnDimensions.length === 0\" class='igx-grid__pivot-empty-chip-area'>\n {{grid.resourceStrings.igx_grid_pivot_empty_column_drop_area}}</span>\n <ng-container *ngFor=\"let col of grid.columnDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"col.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'column' }\"\n [removable]=\"true\" (remove)=\"columnRemoved($event)\" (dragOver)=\"onDimDragOver($event, 1)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragDrop)=\"onDimDrop($event, colArea, 1)\"\n (moveStart)='onDimDragStart($event, colArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, col)\">\n <igx-icon igxPrefix>view_column</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, col)'>filter_list</igx-icon>\n {{col.memberName}}\n <igx-icon *ngIf=\"col.sortDirection\" igxSuffix> {{ col.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(colArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, colArea, 1)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_column_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n\n <div #pivotValueContainer *ngIf=\"grid.showPivotConfigurationUI\" class=\"igx-grid__tr-pivot\"\n (pointerdown)=\"$event.preventDefault()\" (dropped)=\"onValueDrop($event, valueArea)\" igxDrop\n (igxDragLeave)=\"onAreaDragLeave($event, valueArea)\">\n <!-- Value area -->\n <igx-chips-area #valueArea droppable='true'>\n <span id='empty' (dropped)=\"onValueDrop($event, valueArea)\" igxDrop *ngIf=\"grid.values.length === 0\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_value_drop_area}}</span>\n <ng-container *ngFor=\"let value of grid.values; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n <igx-chip #currChip [draggable]=\"true\" [id]=\"value.displayName || value.member\" [data]=\"{ pivotArea: 'value' }\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"valueRemoved($event)\"\n (dragLeave)=\"onDimDragLeave($event)\" (dragOver)=\"onDimDragOver($event)\"\n (dragDrop)=\"onValueDrop($event, valueArea)\">\n <div class=\"igx-grid__tr-pivot-toggle-icons\" igxPrefix\n (click)='onSummaryClick($event, value, dropdown, currChip)'\n (pointerdown)='$event.stopPropagation()' [igxDropDownItemNavigation]=\"dropdown\">\n <igx-icon>functions</igx-icon>\n <igx-icon>arrow_drop_down</igx-icon>\n </div>\n <ng-container *ngTemplateOutlet=\"grid.valueChipTemplate ? grid.valueChipTemplate : valueChipDefaultTemplate; context: { $implicit: value }\"></ng-container>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(valueArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onValueDrop($event, valueArea)\" #notifyValueChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_value_drop_chip}}\n </igx-chip>\n </igx-chips-area>\n </div>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [attr.aria-activedescendant]=\"activeDescendant\" [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n <div #pivotContainer class=\"igx-grid__tr-pivot igx-grid__tr-pivot--row-area\"\n [style.width.px]=\"grid.pivotRowWidths - 1\" (igxDragLeave)=\"onAreaDragLeave($event, rowArea)\" igxDrop\n (dropped)=\"onDimDrop($event, rowArea, 0)\" (pointerdown)=\"$event.preventDefault()\">\n <!-- Row area -->\n <igx-chips-area #rowArea droppable='true'>\n <ng-container *ngIf=\"grid.showPivotConfigurationUI\">\n <span id='empty' igxDrop (dropped)=\"onDimDrop($event, rowArea, 0)\"\n *ngIf=\"grid.rowDimensions.length === 0 && grid.showPivotConfigurationUI\"\n class='igx-grid__pivot-empty-chip-area'>{{grid.resourceStrings.igx_grid_pivot_empty_row_drop_area}}</span>\n <ng-container *ngFor=\"let row of grid.rowDimensions; let last = last;\">\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n <igx-chip [draggable]=\"true\" [id]=\"row.memberName\" [displayDensity]=\"grid.displayDensity\" [data]=\"{ pivotArea: 'row' }\"\n [removable]=\"true\" (remove)=\"rowRemoved($event)\" (dragLeave)=\"onDimDragLeave($event)\"\n (dragDrop)=\"onDimDrop($event, rowArea, 0)\" (dragOver)=\"onDimDragOver($event, 0)\"\n (moveStart)='onDimDragStart($event, rowArea)' (moveEnd)='onDimDragEnd()'\n (click)=\"onChipSort($event, row)\">\n <igx-icon igxPrefix>table_rows</igx-icon>\n <igx-icon igxPrefix (pointerdown)='onFilteringIconPointerDown($event)'\n (click)='onFilteringIconClick($event, row)'>filter_list</igx-icon>\n {{ row.memberName}}\n <igx-icon *ngIf=\"row.sortDirection\" igxSuffix> {{ row.sortDirection < 2 ? 'arrow_upward'\n : 'arrow_downward' }}</igx-icon>\n </igx-chip>\n <ng-container *ngIf='last'>\n <span [style.visibility]='\"hidden\"' class=\"igx-grid__tr-pivot--chip_drop_indicator\"\n [style.height.px]='getAreaHeight(rowArea)'></span>\n </ng-container>\n </ng-container>\n <igx-chip igxDrop (dragDrop)=\"onDimDrop($event, rowArea, 0)\" #notifyChip [hidden]='true'\n [displayDensity]=\"grid.displayDensity\">\n {{grid.resourceStrings.igx_grid_pivot_row_drop_chip}}\n </igx-chip>\n </ng-container>\n </igx-chips-area>\n </div>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n <div class=\"igx-grid-thead--virtualizationWrapper\" [style.max-height.px]='maxContainerHeight'>\n <div class=\"igx-grid-thead__group igx-grid-thead--virtualizationContainer\" [style.height.px]='totalDepth > 1 ? grid.rowHeight : undefined' *ngFor='let dimLevelColumns of columnDimensionsByLevel; let i = index' [style.width.px]='grid.unpinnedWidth'>\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"dimLevelColumns\" [igxGridForOfUniqueSizeCache] = 'true' [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\" [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\" [igxForScrollOrientation]=\"'horizontal'\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [style.height.px]='totalDepth > 1 ? calcHeight(column, i) : undefined'\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [class.igx-grid__tr-pivot--columnDimensionLeaf] = 'isDuplicateOfExistingParent(column, i)'\n [class.igx-grid__tr-pivot--columnMultiRowSpan] = 'isMultiRow(column, i)'\n >\n </igx-grid-header-group>\n </ng-template>\n </div>\n </div>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\" [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\" (pointerdown)=\"grid.navigation.focusOutRowHeader($event)\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\">\n</div>\n\n<igx-drop-down #dropdown (selectionChanging)='onAggregationChange($event)'>\n <igx-drop-down-item *ngFor=\"let item of aggregateList\" [selected]='isSelected(item)' [value]='item'>\n {{ item.label }}\n </igx-drop-down-item>\n</igx-drop-down>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='grid.excelStyleFilterMaxHeight' [minHeight]='grid.excelStyleFilterMinHeight' #esf>\n <div igxExcelStyleColumnOperations>\n <igx-chips-area #dropdownChips>\n <igx-chip *ngFor=\"let filter of this.filterDropdownDimensions\" [id]=\"filter.memberName\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\"\n (chipClick)='onFiltersSelectionChanged($event)' [selectable]='true' [selected]='filter === this.filterDropdownDimensions.values().next().value'>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n </div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n\n<div style=\"visibility: hidden; position: absolute; top: -10000px\">\n <igx-chips-area #filterAreaHidden droppable='true'>\n <igx-chip *ngFor=\"let filter of grid.filterDimensions\" [id]=\"filter.memberName\" [draggable]=\"true\"\n [displayDensity]=\"grid.displayDensity\" [removable]=\"true\" (remove)=\"filterRemoved($event)\">\n <igx-icon igxPrefix>filter_list</igx-icon>\n {{filter.memberName}}\n </igx-chip>\n </igx-chips-area>\n</div>\n\n<ng-template #valueChipDefaultTemplate let-value>\n {{value.aggregate.key}}({{value.displayName || value.member}})\n</ng-template>\n" }]
|
|
447
447
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
448
448
|
type: Inject,
|
|
449
449
|
args: [IGX_GRID_BASE]
|
|
@@ -469,4 +469,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
|
|
|
469
469
|
type: ViewChildren,
|
|
470
470
|
args: ['headerVirtualContainer', { read: IgxGridForOfDirective }]
|
|
471
471
|
}] } });
|
|
472
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtaGVhZGVyLXJvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsTUFBTSxFQUlOLFNBQVMsRUFFVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9JLE9BQU8sRUFBYyxhQUFhLEVBQWlCLE1BQU0sMEJBQTBCLENBQUM7QUFFcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekM7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMkIsU0FBUSx5QkFBeUI7SUEyRHJFLElBQW9CLFdBQVc7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUMyQyxJQUFtQixFQUMxRCxHQUE0QixFQUM1QixH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QkFMdEMsU0FBUztzQ0FDVyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLHNCQUFzQjs7MEJBbUUzQixNQUFNOzJCQUFDLGFBQWE7NkhBMUNBLEdBQUc7c0JBQTNCLFNBQVM7dUJBQUMsS0FBSztnQkFLeUMsVUFBVTtzQkFBbEUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBS2hCLGFBQWE7c0JBQTVDLFNBQVM7dUJBQUMsWUFBWTtnQkFLWSxhQUFhO3NCQUEvQyxTQUFTO3VCQUFDLGVBQWU7Z0JBS2dCLG9CQUFvQjtzQkFBN0QsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBTzFCLGlCQUFpQjtzQkFEdkIsWUFBWTt1QkFBQyxZQUFZO2dCQVNuQixnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQmFzZUNoaXBFdmVudEFyZ3MsIElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDaGlwc0FyZWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGlwcy9jaGlwcy1hcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgT3ZlcmxheVNldHRpbmdzLCBQb3NpdGlvblNldHRpbmdzLCBWZXJ0aWNhbEFsaWdubWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgSUdYX0dSSURfQkFTRSwgUGl2b3RHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IERyb3BQb3NpdGlvbiB9IGZyb20gJy4uL21vdmluZy9tb3Zpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJUGl2b3RBZ2dyZWdhdG9yLCBJUGl2b3REaW1lbnNpb24sIElQaXZvdFZhbHVlLCBQaXZvdERpbWVuc2lvblR5cGUgfSBmcm9tICcuL3Bpdm90LWdyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBpdm90VXRpbCB9IGZyb20gJy4vcGl2b3QtdXRpbCc7XG5cbi8qKlxuICpcbiAqIEZvciBhbGwgaW50ZW50cyAmIHB1cnBvc2VzIHRyZWF0IHRoaXMgY29tcG9uZW50IGFzIHdoYXQgYSA8dGhlYWQ+IHVzdWFsbHkgaXMgaW4gdGhlIGRlZmF1bHQgPHRhYmxlPiBlbGVtZW50LlxuICpcbiAqIFRoaXMgY29udGFpbmVyIGhvbGRzIHRoZSBwaXZvdCBncmlkIGhlYWRlciBlbGVtZW50cyBhbmQgdGhlaXIgYmVoYXZpb3IvaW50ZXJhY3Rpb25zLlxuICpcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LXBpdm90LWhlYWRlci1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hQaXZvdEhlYWRlclJvd0NvbXBvbmVudCBleHRlbmRzIElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIHB1YmxpYyBhZ2dyZWdhdGVMaXN0OiBJUGl2b3RBZ2dyZWdhdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyB2YWx1ZTogSVBpdm90VmFsdWU7XG4gICAgcHVibGljIGZpbHRlckRyb3Bkb3duRGltZW5zaW9uczogU2V0PGFueT4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBwdWJsaWMgZmlsdGVyQXJlYURpbWVuc2lvbnM6IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfZHJvcFBvcyA9IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQ7XG4gICAgcHJpdmF0ZSB2YWx1ZURhdGE6IE1hcDxzdHJpbmcsIElQaXZvdEFnZ3JlZ2F0b3JbXT47XG4gICAgcHJpdmF0ZSBfc3ViTWVudVBvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBwcml2YXRlIF9zdWJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3N1Yk1lbnVQb3NpdGlvblNldHRpbmdzKSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlc2YnKSBwdWJsaWMgZXNmOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbHRlckFyZWFIaWRkZW4nLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGZpbHRlckFyZWE7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbHRlckljb24nKSBwdWJsaWMgZmlsdGVyc0J1dHRvbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25DaGlwcycpIHB1YmxpYyBkcm9wZG93bkNoaXBzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaXZvdEZpbHRlckNvbnRhaW5lcicpIHB1YmxpYyBwaXZvdEZpbHRlckNvbnRhaW5lcjtcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKCdub3RpZnlDaGlwJylcbiAgICBwdWJsaWMgbm90aWZpY2F0aW9uQ2hpcHM6IFF1ZXJ5TGlzdDxJZ3hDaGlwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKiBUaGUgdmlydHVhbGl6ZWQgcGFydCBvZiB0aGUgaGVhZGVyIHJvdyBjb250YWluaW5nIHRoZSB1bnBpbm5lZCBoZWFkZXIgZ3JvdXBzLlxuICAgICovXG4gICAgQFZpZXdDaGlsZHJlbignaGVhZGVyVmlydHVhbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGhlYWRlckNvbnRhaW5lcnM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50Pj47XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGhlYWRlckZvck9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJDb250YWluZXJzLmxhc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIG92ZXJyaWRlIGdyaWQ6IFBpdm90R3JpZFR5cGUsXG4gICAgICAgIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICkge1xuICAgICAgICBzdXBlcihyZWYsIGNkcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqIERlZmF1bHQgaXMgYSBzaW5nbGUgZW1wdHkgbGV2ZWwgc2luY2UgZGVmYXVsdCBkZXB0aCBpcyAxXG4gICAgKi9cbiAgICBwdWJsaWMgY29sdW1uRGltZW5zaW9uc0J5TGV2ZWw6IGFueVtdID0gW1tdXTtcblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaWx0ZXJzQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY2hpcHNXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyQXJlYURpbWVuc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQXJlYT8uY2hpcHNMaXN0ICYmIHRoaXMuZmlsdGVyQXJlYS5jaGlwc0xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGl2b3RGaWx0ZXJDb250YWluZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJQYWRkaW5ncyA9IHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdSaWdodCk7XG4gICAgICAgICAgICBjaGlwc1dpZHRoICs9IGNvbnRhaW5lclBhZGRpbmdzICsgKHRoaXMuZmlsdGVyc0J1dHRvbiAmJiB0aGlzLmZpbHRlckFyZWE/LmNoaXBzTGlzdC5sZW5ndGggPiAxID8gdGhpcy5maWx0ZXJzQnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQXJlYS5jaGlwc0xpc3QuZm9yRWFjaChjaGlwID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaW0gPSB0aGlzLmdyaWQuZmlsdGVyRGltZW5zaW9ucy5maW5kKHggPT4geC5tZW1iZXJOYW1lID09PSBjaGlwLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZGltKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDggcHggbWFyZ2luIGJldHdlZW4gY2hpcHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoaXBXaWR0aCA9IGNoaXAubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArIDg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlwc1dpZHRoICsgY3VycmVudENoaXBXaWR0aCA8IHRoaXMuZ3JpZC5waXZvdFJvd1dpZHRocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJBcmVhRGltZW5zaW9ucy5hZGQoZGltKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLmFkZChkaW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaXBzV2lkdGggKz0gY3VycmVudENoaXBXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplID4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxEZXB0aCgpIHtcbiAgICAgICAgY29uc3QgY29sdW1uRGltZW5zaW9ucyA9IHRoaXMuZ3JpZC5jb2x1bW5EaW1lbnNpb25zO1xuICAgICAgICBpZiAoY29sdW1uRGltZW5zaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbERlcHRoID0gY29sdW1uRGltZW5zaW9ucy5tYXAoeCA9PiBQaXZvdFV0aWwuZ2V0RGltZW5zaW9uRGVwdGgoeCkgKyAxKS5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwpO1xuICAgICAgICBpZiAodGhpcy5ncmlkLmhhc011bHRpcGxlVmFsdWVzKSB7XG4gICAgICAgICAgICB0b3RhbERlcHRoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4Q29udGFpbmVySGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbERlcHRoICogdGhpcy5ncmlkLnJlbmRlcmVkUm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgY2FsY0hlaWdodChjb2w6IENvbHVtblR5cGUsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLmxldmVsIDwgdGhpcy50b3RhbERlcHRoICYmIGNvbC5sZXZlbCA9PT0gaW5kZXggPyAodGhpcy50b3RhbERlcHRoIC0gY29sLmxldmVsKSAqIHRoaXMuZ3JpZC5yb3dIZWlnaHQgOiB0aGlzLmdyaWQucm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgaXNEdXBsaWNhdGVPZkV4aXN0aW5nUGFyZW50KGNvbDogQ29sdW1uVHlwZSwgbHZsOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Q29sbGVjdGlvbiA9IGx2bCA+IDAgPyB0aGlzLmNvbHVtbkRpbWVuc2lvbnNCeUxldmVsW2x2bCAtIDFdIDogW107XG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHBhcmVudENvbGxlY3Rpb24uaW5kZXhPZihjb2wpICE9PSAtMTtcblxuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgaXNNdWx0aVJvdyhjb2w6IENvbHVtblR5cGUsIGx2bDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGlzTGVhZiA9ICFjb2wuY29sdW1uR3JvdXA7XG4gICAgICAgIHJldHVybiBpc0xlYWYgJiYgbHZsICE9PSB0aGlzLnRvdGFsRGVwdGggLSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgcG9wdWxhdGVDb2x1bW5EaW1lbnNpb25zQnlMZXZlbCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b3RhbERlcHRoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc1tpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnVucGlubmVkQ29sdW1uQ29sbGVjdGlvbjtcbiAgICAgICAgLy8gcG9wdWxhdGUgY29sdW1uIGRpbWVuc2lvbiBtYXRyaXggcmVjdXJzaXZlbHlcbiAgICAgICAgdGhpcy5wb3B1bGF0ZURpbWVuc2lvblJlY3Vyc2l2ZWx5KGNvbHMuZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gMCksIDAsIHJlcyk7XG4gICAgICAgIHRoaXMuY29sdW1uRGltZW5zaW9uc0J5TGV2ZWwgPSByZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcHVsYXRlRGltZW5zaW9uUmVjdXJzaXZlbHkoY3VycmVudExldmVsQ29sdW1uczogQ29sdW1uVHlwZVtdLCBsZXZlbCA9IDAsIHJlczogYW55W10pIHtcbiAgICAgICAgY3VycmVudExldmVsQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzW2xldmVsXSkge1xuICAgICAgICAgICAgICAgIHJlc1tsZXZlbF0ucHVzaChjb2wpO1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXAgJiYgY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2wuY2hpbGRyZW4udG9BcnJheSgpLmZpbHRlcih4ID0+ICF4LmhpZGRlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEaW1lbnNpb25SZWN1cnNpdmVseSh2aXNpYmxlQ29sdW1ucywgbGV2ZWwgKyAxLCByZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPCB0aGlzLnRvdGFsRGVwdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZXZlbCArIDE7IGkgPD0gdGhpcy50b3RhbERlcHRoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbaV0ucHVzaChjb2wpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlQ29sdW1uRGltZW5zaW9uc0J5TGV2ZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1EcmFnU3RhcnQoZXZlbnQsIGFyZWEpIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBmb3IgKGxldCBjaGlwIG9mIHRoaXMubm90aWZpY2F0aW9uQ2hpcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGNoaXAubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKS5pbmRleE9mKGNoaXApID09PSAtMSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLml0ZW0oMCkuaWQgIT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICBjaGlwLm5hdGl2ZUVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFyZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsVG8oeyBsZWZ0OiBjaGlwLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1EcmFnRW5kKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlwIG9mIHRoaXMubm90aWZpY2F0aW9uQ2hpcHMpIHtcbiAgICAgICAgICAgIGNoaXAubmF0aXZlRWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXRBcmVhSGVpZ2h0KGFyZWE6IElneENoaXBzQXJlYUNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjaGlwcyA9IGFyZWEuY2hpcHNMaXN0O1xuICAgICAgICByZXR1cm4gY2hpcHMgJiYgY2hpcHMubGVuZ3RoID4gMCA/IGNoaXBzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHJvd1JlbW92ZWQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnJvd3MuZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZXZlbnQub3duZXIuaWQpO1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlRGltZW5zaW9uKHJvdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5SZW1vdmVkKGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5zLmZpbmQoeCA9PiB4Lm1lbWJlck5hbWUgPT09IGV2ZW50Lm93bmVyLmlkKTtcbiAgICAgICAgdGhpcy5ncmlkLnRvZ2dsZURpbWVuc2lvbihjb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgdmFsdWVSZW1vdmVkKGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5maW5kKHggPT4geC5tZW1iZXIgPT09IGV2ZW50Lm93bmVyLmlkIHx8IHguZGlzcGxheU5hbWUgPT09IGV2ZW50Lm93bmVyLmlkKTtcbiAgICAgICAgdGhpcy5ncmlkLnRvZ2dsZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGZpbHRlclJlbW92ZWQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMuZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZXZlbnQub3duZXIuaWQpO1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlRGltZW5zaW9uKGZpbHRlcik7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbkZpbHRlcnNBcmVhRHJvcGRvd25DbGljayh7IHRhcmdldDogdGhpcy5maWx0ZXJzQnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5oaWRlRVNGKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJzU2VsZWN0aW9uQ2hhbmdlZChldmVudD86IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmRyb3Bkb3duQ2hpcHMuY2hpcHNMaXN0LmZvckVhY2goY2hpcCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpcC5pZCAhPT0gZXZlbnQub3duZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjaGlwLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25GaWx0ZXJzQXJlYURyb3Bkb3duQ2xpY2soeyB0YXJnZXQ6IHRoaXMuZmlsdGVyc0J1dHRvbi5lbC5uYXRpdmVFbGVtZW50IH0sIHRoaXMuZ3JpZC5maWx0ZXJEaW1lbnNpb25zLmZpbmQoZGltID0+IGRpbS5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCksIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyaW5nSWNvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJpbmdJY29uQ2xpY2soZXZlbnQsIGRpbWVuc2lvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRpbSA9IGRpbWVuc2lvbjtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLmRpbWVuc2lvbkRhdGFDb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBkaW0ubWVtYmVyTmFtZSB8fCB4LmZpZWxkID09PSBkaW0ubWVtYmVyKTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UudG9nZ2xlRmlsdGVyRHJvcGRvd24oZXZlbnQudGFyZ2V0LCBjb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25TdW1tYXJ5Q2xpY2soZXZlbnRBcmdzLCB2YWx1ZTogSVBpdm90VmFsdWUsIGRyb3Bkb3duOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9zdWJNZW51T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IGV2ZW50QXJncy5jdXJyZW50VGFyZ2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3BEb3duKHZhbHVlLCBkcm9wZG93biwgY2hpcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJzQXJlYURyb3Bkb3duQ2xpY2soZXZlbnQsIGRpbWVuc2lvbj8sIHNob3VsZFJlYXR0YWNoID0gdHJ1ZSkge1xuICAgICAgICBsZXQgZGltID0gZGltZW5zaW9uIHx8IHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLmRpbWVuc2lvbkRhdGFDb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBkaW0ubWVtYmVyTmFtZSB8fCB4LmZpZWxkID09PSBkaW0ubWVtYmVyKTtcbiAgICAgICAgaWYgKHNob3VsZFJlYXR0YWNoKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ2hpcHMuY2hpcHNMaXN0LmZvckVhY2goY2hpcCA9PiB7XG4gICAgICAgICAgICAgICAgY2hpcC5zZWxlY3RlZCA9IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25DaGlwcy5jaGlwc0xpc3QuZmlyc3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLnRvZ2dsZUZpbHRlcnNFU0YodGhpcy5lc2YsIGV2ZW50LnRhcmdldCwgY29sLCBzaG91bGRSZWF0dGFjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkFnZ3JlZ2F0aW9uQ2hhbmdlKGV2ZW50OiBJU2VsZWN0aW9uRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGV2ZW50Lm5ld1NlbGVjdGlvbi52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuYWdncmVnYXRlID0gZXZlbnQubmV3U2VsZWN0aW9uLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ncmlkLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGlzU2VsZWN0ZWQodmFsOiBJUGl2b3RBZ2dyZWdhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmFnZ3JlZ2F0ZS5rZXkgPT09IHZhbC5rZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTb3J0KF9ldmVudCwgZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgY29uc3Qgc3RhcnREaXJlY3Rpb24gPSBkaW1lbnNpb24uc29ydERpcmVjdGlvbiB8fCBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHN0YXJ0RGlyZWN0aW9uICsgMSA+IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/XG4gICAgICAgICAgICBTb3J0aW5nRGlyZWN0aW9uLk5vbmUgOiBzdGFydERpcmVjdGlvbiArIDE7XG4gICAgICAgIHRoaXMuZ3JpZC5zb3J0RGltZW5zaW9uKGRpbWVuc2lvbiwgZGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG9uRGltRHJhZ092ZXIoZXZlbnQsIGRpbWVuc2lvbj86IFBpdm90RGltZW5zaW9uVHlwZSkge1xuICAgICAgICBpZiAoIWV2ZW50LmRyYWdDaGlwIHx8ICFldmVudC5kcmFnQ2hpcC5kYXRhPy5waXZvdEFyZWEpIHJldHVybjtcbiAgICAgICAgY29uc3QgdHlwZU1pc21hdGNoID0gZGltZW5zaW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5maW5kKHggPT4geC5tZW1iZXIgPT09IGV2ZW50LmRyYWdDaGlwLmlkXG4gICAgICAgICAgICB8fCB4LmRpc3BsYXlOYW1lID09PSBldmVudC5kcmFnQ2hpcC5pZCkgOlxuICAgICAgICAgICAgIXRoaXMuZ3JpZC5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzLmZpbmQoeCA9PiB4Lm1lbWJlciA9PT0gZXZlbnQuZHJhZ0NoaXAuaWQgfHwgeC5kaXNwbGF5TmFtZSA9PT0gZXZlbnQuZHJhZ0NoaXAuaWQpO1xuICAgICAgICBpZiAodHlwZU1pc21hdGNoKSB7XG4gICAgICAgICAgICAvLyBjYW5ub3QgZHJhZyBiZXR3ZWVuIGRpbWVuc2lvbnMgYW5kIHZhbHVlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIHRoZSBsZWZ0IGhhbGYgb2YgdGhlIGNoaXAsIGRyb3Agb24gdGhlIGxlZnRcbiAgICAgICAgLy8gZWxzZSBkcm9wIG9uIHRoZSByaWdodCBvZiB0aGUgY2hpcFxuICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gZXZlbnQub3duZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcG9zID0gY2xpZW50UmVjdC53aWR0aCAvIDI7XG5cbiAgICAgICAgdGhpcy5fZHJvcFBvcyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQub2Zmc2V0WCA+IHBvcyA/IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgOiBEcm9wUG9zaXRpb24uQmVmb3JlRHJvcFRhcmdldDtcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3BQb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgICAgIGV2ZW50Lm93bmVyLm5hdGl2ZUVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkRpbURyYWdMZWF2ZShldmVudCkge1xuICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuX2Ryb3BQb3MgPSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25BcmVhRHJhZ0xlYXZlKGV2ZW50LCBhcmVhKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDaGlwcyA9IGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKS5maWx0ZXIoeCA9PiB0aGlzLm5vdGlmaWNhdGlvbkNoaXBzLnRvQXJyYXkoKS5pbmRleE9mKHgpID09PSAtMSk7XG4gICAgICAgIGRhdGFDaGlwcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubmF0aXZlRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubmF0aXZlRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvblZhbHVlRHJvcChldmVudCwgYXJlYSkge1xuICAgICAgICBpZiAoIShldmVudC5kcmFnQ2hpcCAmJiBldmVudC5kcmFnQ2hpcC5kYXRhPy5waXZvdEFyZWEpICYmICEoZXZlbnQuZHJhZ0RhdGE/LmNoaXAgJiYgISFldmVudC5kcmFnRGF0YS5jaGlwLmRhdGEucGl2b3RBcmVhKSkgcmV0dXJuO1xuICAgICAgICAvL3ZhbHVlcyBjYW4gb25seSBiZSByZW9yZGVyZWRcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5ncmlkLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGRyYWdJZCA9IGV2ZW50LmRyYWdDaGlwPy5pZCB8fCBldmVudC5kcmFnRGF0YT8uY2hpcC5pZDtcbiAgICAgICAgY29uc3QgY2hpcHNBcnJheSA9IGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IGNoaXBJbmRleCA9IGNoaXBzQXJyYXkuaW5kZXhPZihldmVudC5vd25lcikgIT09IC0xID8gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50Lm93bmVyKSA6IGNoaXBzQXJyYXkubGVuZ3RoO1xuICAgICAgICBjaGlwSW5kZXggPSB0aGlzLl9kcm9wUG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gY2hpcEluZGV4ICsgMSA6IGNoaXBJbmRleDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXMuZmluZCh4ID0+IHgubWVtYmVyID09PSBkcmFnSWQgfHwgeC5kaXNwbGF5TmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkcmFnQ2hpcEluZGV4ID0gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50LmRyYWdDaGlwIHx8IGV2ZW50LmRyYWdEYXRhLmNoaXApO1xuICAgICAgICAgICAgdGhpcy5ncmlkLm1vdmVWYWx1ZSh2YWx1ZSwgZHJhZ0NoaXBJbmRleCA+PSBjaGlwSW5kZXggPyBjaGlwSW5kZXggOiBjaGlwSW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1Ecm9wKGV2ZW50LCBhcmVhLCBkaW1lbnNpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQuZHJhZ0NoaXAgJiYgZXZlbnQuZHJhZ0NoaXAuZGF0YT8ucGl2b3RBcmVhKSAmJiAhKGV2ZW50LmRyYWdEYXRhPy5jaGlwICYmICEhZXZlbnQuZHJhZ0RhdGEuY2hpcC5kYXRhLnBpdm90QXJlYSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZHJhZ0lkID0gZXZlbnQuZHJhZ0NoaXA/LmlkIHx8IGV2ZW50LmRyYWdEYXRhPy5jaGlwLmlkO1xuICAgICAgICBjb25zdCBjdXJyZW50RGltID0gdGhpcy5ncmlkLmdldERpbWVuc2lvbnNCeVR5cGUoZGltZW5zaW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IGNoaXBzQXJyYXkgPSBhcmVhLmNoaXBzTGlzdC50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IGNoaXAgPSBjaGlwc0FycmF5LmZpbmQoeCA9PiB4LmlkID09PSBkcmFnSWQpO1xuICAgICAgICBjb25zdCBpc05ld0NoaXAgPSBjaGlwID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGlzUmVvcmRlciA9IGV2ZW50Lm93bmVyLmlkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIC8vY29uc3QgY2hpcEluZGV4ID0gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50Lm93bmVyKSAhPT0gLTEgPyBjaGlwc0FycmF5LmluZGV4T2YoZXZlbnQub3duZXIpIDogY2hpcHNBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNoaXBJbmRleCA9IGN1cnJlbnREaW0uZmluZEluZGV4KHggPT4geC5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCkgIT09IC0xID9cbiAgICAgICAgICAgIGN1cnJlbnREaW0uZmluZEluZGV4KHggPT4geC5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCkgOiBjdXJyZW50RGltLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLl9kcm9wUG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gY2hpcEluZGV4ICsgMSA6IGNoaXBJbmRleDtcbiAgICAgICAgaWYgKGlzTmV3Q2hpcCkge1xuICAgICAgICAgICAgLy8gY2hpcCBtb3ZlZCBmcm9tIGFuIGV4dGVybmFsIGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IHRoaXMuZ3JpZC5hbGxEaW1lbnNpb25zLmZpbmQoeCA9PiB4ICYmIHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIGlmICghZGltKSB7XG4gICAgICAgICAgICAgICAgLy8geW91IGhhdmUgZHJhZ2dlZCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBkaW1lbnNpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyaWQubW92ZURpbWVuc2lvbihkaW0sIGRpbWVuc2lvblR5cGUsIHRhcmdldEluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1Jlb3JkZXIpIHtcbiAgICAgICAgICAgIC8vIGNoaXAgZnJvbSBzYW1lIGNvbGxlY3Rpb24sIHJlb3JkZXJlZC5cbiAgICAgICAgICAgIGNvbnN0IG5ld0RpbSA9IGN1cnJlbnREaW0uZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIGNvbnN0IGRyYWdDaGlwSW5kZXggPSBjdXJyZW50RGltLmZpbmRJbmRleCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5tb3ZlRGltZW5zaW9uKG5ld0RpbSwgZGltZW5zaW9uVHlwZSwgZHJhZ0NoaXBJbmRleCA+IGNoaXBJbmRleCA/IHRhcmdldEluZGV4IDogdGFyZ2V0SW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWQucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ncmlkLmRpbWVuc2lvbnNDaGFuZ2UuZW1pdCh7IGRpbWVuc2lvbnM6IGN1cnJlbnREaW0sIGRpbWVuc2lvbkNvbGxlY3Rpb25UeXBlOiBkaW1lbnNpb25UeXBlIH0pO1xuICAgICAgICAvLyBjbGVhbiBzdGF0ZXNcbiAgICAgICAgdGhpcy5vbkRpbURyYWdFbmQoKTtcbiAgICAgICAgdGhpcy5vbkFyZWFEcmFnTGVhdmUoZXZlbnQsIGFyZWEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVEcm9wRG93bih2YWx1ZTogSVBpdm90VmFsdWUsIGRyb3Bkb3duOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGRyb3Bkb3duLndpZHRoID0gY2hpcC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4JztcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVMaXN0ID0gUGl2b3RVdGlsLmdldEFnZ3JlZ2F0ZUxpc3QodmFsdWUsIHRoaXMuZ3JpZCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgZHJvcGRvd24ub3Blbih0aGlzLl9zdWJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG59XG4iLCI8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlciBpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlci0tcGl2b3RcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHJcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdpZ3gtZ3JpZF9fdHItcGl2b3QtLWZpbHRlci1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgI3Bpdm90RmlsdGVyQ29udGFpbmVyICpuZ0lmPVwiZ3JpZC5zaG93UGl2b3RDb25maWd1cmF0aW9uVUlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QgaWd4LWdyaWRfX3RyLXBpdm90LS1maWx0ZXJcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cImdyaWQucGl2b3RSb3dXaWR0aHMgLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiZ3JpZC5waXZvdFJvd1dpZHRocyAtIDFcIiAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIGZpbHRlckFyZWEpXCJcbiAgICAgICAgICAgICAgICAgICAgIGlneERyb3AgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgZmlsdGVyQXJlYSwgMilcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWx0ZXIgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICNmaWx0ZXJBcmVhIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdlbXB0eScgaWd4RHJvcCAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCBmaWx0ZXJBcmVhLCAyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZC5maWx0ZXJEaW1lbnNpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X2ZpbHRlcl9kcm9wX2FyZWF9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiB0aGlzLmZpbHRlckFyZWFEaW1lbnNpb25zOyBsZXQgbGFzdCA9IGxhc3Q7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSdnZXRBcmVhSGVpZ2h0KGZpbHRlckFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCIgW2RhdGFdPVwieyBwaXZvdEFyZWE6ICdmaWx0ZXInIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlKT1cImZpbHRlclJlbW92ZWQoJGV2ZW50KVwiIChkcmFnT3Zlcik9XCJvbkRpbURyYWdPdmVyKCRldmVudCwgMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0xlYXZlKT1cIm9uRGltRHJhZ0xlYXZlKCRldmVudClcIiAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgZmlsdGVyQXJlYSwgMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW92ZVN0YXJ0KT0nb25EaW1EcmFnU3RhcnQoJGV2ZW50LCBmaWx0ZXJBcmVhKScgKG1vdmVFbmQpPSdvbkRpbURyYWdFbmQoKSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBpZ3hQcmVmaXggKHBvaW50ZXJkb3duKT0nb25GaWx0ZXJpbmdJY29uUG9pbnRlckRvd24oJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9J29uRmlsdGVyaW5nSWNvbkNsaWNrKCRldmVudCwgZmlsdGVyKSc+ZmlsdGVyX2xpc3Q8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZpbHRlci5tZW1iZXJOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9J2xhc3QnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzdHlsZS52aXNpYmlsaXR5XT0nXCJoaWRkZW5cIicgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QtLWNoaXBfZHJvcF9pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSdnZXRBcmVhSGVpZ2h0KGZpbHRlckFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBpZ3hEcm9wIChkcmFnRHJvcCk9XCJvbkRpbURyb3AoJGV2ZW50LCBmaWx0ZXJBcmVhLCAyKVwiICNub3RpZnlDaGlwIFtoaWRkZW5dPSd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9waXZvdF9maWx0ZXJfZHJvcF9jaGlwfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcGl2b3QtZmlsdGVyLXRvZ2dsZVwiICpuZ0lmPVwiaXNGaWx0ZXJzQnV0dG9uICYmIGdyaWQuZmlsdGVyRGltZW5zaW9ucy5sZW5ndGggIT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAjZmlsdGVySWNvbiAocG9pbnRlcmRvd24pPSdvbkZpbHRlcmluZ0ljb25Qb2ludGVyRG93bigkZXZlbnQpJyAoY2xpY2spPSdvbkZpbHRlcnNBcmVhRHJvcGRvd25DbGljaygkZXZlbnQpJz5maWx0ZXJfbGlzdDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWJhZGdlIHZhbHVlPVwie3t0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplfX1cIj48L2lneC1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0naWd4LWdyaWRfX3RyLXBpdm90LS1kcm9wLXJvdy1hcmVhJyAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIHJvd0FyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAgICAgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAjcGl2b3RDb2x1bW5Db250YWluZXIgKm5nSWY9XCJncmlkLnNob3dQaXZvdENvbmZpZ3VyYXRpb25VSVwiIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90XCJcbiAgICAgICAgICAgICAgICAgICAgIChkcm9wcGVkKT1cIm9uRGltRHJvcCgkZXZlbnQsIGNvbEFyZWEsIDEpXCIgaWd4RHJvcCAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIGNvbEFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ29sdW1ucyBhcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXBzLWFyZWEgI2NvbEFyZWEgZHJvcHBhYmxlPSd0cnVlJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J2VtcHR5JyAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCBjb2xBcmVhLCAxKVwiIGlneERyb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZC5jb2x1bW5EaW1lbnNpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfZW1wdHlfY29sdW1uX2Ryb3BfYXJlYX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGdyaWQuY29sdW1uRGltZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChjb2xBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwiY29sLm1lbWJlck5hbWVcIiBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtkYXRhXT1cInsgcGl2b3RBcmVhOiAnY29sdW1uJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJjb2x1bW5SZW1vdmVkKCRldmVudClcIiAoZHJhZ092ZXIpPVwib25EaW1EcmFnT3ZlcigkZXZlbnQsIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdMZWF2ZSk9XCJvbkRpbURyYWdMZWF2ZSgkZXZlbnQpXCIgKGRyYWdEcm9wKT1cIm9uRGltRHJvcCgkZXZlbnQsIGNvbEFyZWEsIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdmVTdGFydCk9J29uRGltRHJhZ1N0YXJ0KCRldmVudCwgY29sQXJlYSknIChtb3ZlRW5kKT0nb25EaW1EcmFnRW5kKCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBTb3J0KCRldmVudCwgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PnZpZXdfY29sdW1uPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uIGlneFByZWZpeCAocG9pbnRlcmRvd24pPSdvbkZpbHRlcmluZ0ljb25Qb2ludGVyRG93bigkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT0nb25GaWx0ZXJpbmdJY29uQ2xpY2soJGV2ZW50LCBjb2wpJz5maWx0ZXJfbGlzdDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sLm1lbWJlck5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJjb2wuc29ydERpcmVjdGlvblwiIGlneFN1ZmZpeD4ge3sgY29sLnNvcnREaXJlY3Rpb24gPCAyID8gJ2Fycm93X3Vwd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Fycm93X2Rvd253YXJkJyB9fTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPSdsYXN0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChjb2xBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgY29sQXJlYSwgMSlcIiAjbm90aWZ5Q2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfY29sdW1uX2Ryb3BfY2hpcH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAjcGl2b3RWYWx1ZUNvbnRhaW5lciAqbmdJZj1cImdyaWQuc2hvd1Bpdm90Q29uZmlndXJhdGlvblVJXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3RcIlxuICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGRyb3BwZWQpPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAgICAgKGlneERyYWdMZWF2ZSk9XCJvbkFyZWFEcmFnTGVhdmUoJGV2ZW50LCB2YWx1ZUFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWUgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICN2YWx1ZUFyZWEgZHJvcHBhYmxlPSd0cnVlJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J2VtcHR5JyAoZHJvcHBlZCk9XCJvblZhbHVlRHJvcCgkZXZlbnQsIHZhbHVlQXJlYSlcIiBpZ3hEcm9wICpuZ0lmPVwiZ3JpZC52YWx1ZXMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X3ZhbHVlX2Ryb3BfYXJlYX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBncmlkLnZhbHVlczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodCh2YWx1ZUFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwICNjdXJyQ2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwidmFsdWUuZGlzcGxheU5hbWUgfHwgdmFsdWUubWVtYmVyXCIgW2RhdGFdPVwieyBwaXZvdEFyZWE6ICd2YWx1ZScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJ2YWx1ZVJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnTGVhdmUpPVwib25EaW1EcmFnTGVhdmUoJGV2ZW50KVwiIChkcmFnT3Zlcik9XCJvbkRpbURyYWdPdmVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0Ryb3ApPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QtdG9nZ2xlLWljb25zXCIgaWd4UHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT0nb25TdW1tYXJ5Q2xpY2soJGV2ZW50LCB2YWx1ZSwgZHJvcGRvd24sIGN1cnJDaGlwKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPSckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCknIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+ZnVuY3Rpb25zPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5hcnJvd19kcm9wX2Rvd248L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQudmFsdWVDaGlwVGVtcGxhdGUgPyBncmlkLnZhbHVlQ2hpcFRlbXBsYXRlIDogdmFsdWVDaGlwRGVmYXVsdFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogdmFsdWUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nbGFzdCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09J2dldEFyZWFIZWlnaHQodmFsdWVBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCIgI25vdGlmeVZhbHVlQ2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfdmFsdWVfZHJvcF9jaGlwfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX193cmFwcGVyXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCIgW2NsYXNzLmlneC1ncmlkX190ci0tbXJsXT1cImhhc01STFwiPlxuXG4gICAgICAgIDwhLS0gQ29sdW1uIGhlYWRlcnMgYXJlYSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190clwiIHJvbGU9XCJyb3dcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIj5cbiAgICAgICAgICAgIDxkaXYgI3Bpdm90Q29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90IGlneC1ncmlkX190ci1waXZvdC0tcm93LWFyZWFcIlxuICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ3JpZC5waXZvdFJvd1dpZHRocyAtIDFcIiAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIHJvd0FyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCByb3dBcmVhLCAwKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gUm93IGFyZWEgLS0+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICNyb3dBcmVhIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLnNob3dQaXZvdENvbmZpZ3VyYXRpb25VSVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nZW1wdHknIGlneERyb3AgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkLnJvd0RpbWVuc2lvbnMubGVuZ3RoID09PSAwICYmIGdyaWQuc2hvd1Bpdm90Q29uZmlndXJhdGlvblVJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X3Jvd19kcm9wX2FyZWF9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIGdyaWQucm93RGltZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChyb3dBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwicm93Lm1lbWJlck5hbWVcIiBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtkYXRhXT1cInsgcGl2b3RBcmVhOiAncm93JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJyb3dSZW1vdmVkKCRldmVudClcIiAoZHJhZ0xlYXZlKT1cIm9uRGltRHJhZ0xlYXZlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIiAoZHJhZ092ZXIpPVwib25EaW1EcmFnT3ZlcigkZXZlbnQsIDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdmVTdGFydCk9J29uRGltRHJhZ1N0YXJ0KCRldmVudCwgcm93QXJlYSknIChtb3ZlRW5kKT0nb25EaW1EcmFnRW5kKCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBTb3J0KCRldmVudCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PnRhYmxlX3Jvd3M8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4IChwb2ludGVyZG93bik9J29uRmlsdGVyaW5nSWNvblBvaW50ZXJEb3duKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPSdvbkZpbHRlcmluZ0ljb25DbGljaygkZXZlbnQsIHJvdyknPmZpbHRlcl9saXN0PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93Lm1lbWJlck5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJyb3cuc29ydERpcmVjdGlvblwiIGlneFN1ZmZpeD4ge3sgcm93LnNvcnREaXJlY3Rpb24gPCAyID8gJ2Fycm93X3Vwd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Fycm93X2Rvd253YXJkJyB9fTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPSdsYXN0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChyb3dBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIiAjbm90aWZ5Q2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3Rfcm93X2Ryb3BfY2hpcH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBmcm9tIHRoZSBzdGFydCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaW5uZWRDb2x1bW5Db2xsZWN0aW9uLmxlbmd0aCAmJiBncmlkLmlzUGlubmluZ1RvU3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHwgaWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5jYWxjV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4uY2FsY1dpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cImdyaWQubmF2aWdhdGlvbi5mb2N1c091dFJvd0hlYWRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWQtLXZpcnR1YWxpemF0aW9uV3JhcHBlclwiIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT0nbWF4Q29udGFpbmVySGVpZ2h0Jz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX2dyb3VwIGlneC1ncmlkLXRoZWFkLS12aXJ0dWFsaXphdGlvbkNvbnRhaW5lclwiIFtzdHlsZS5oZWlnaHQucHhdPSd0b3RhbERlcHRoID4gMSA/IGdyaWQucm93SGVpZ2h0IDogdW5kZWZpbmVkJyAqbmdGb3I9J2xldCBkaW1MZXZlbENvbHVtbnMgb2YgY29sdW1uRGltZW5zaW9uc0J5TGV2ZWw7IGxldCBpID0gaW5kZXgnIFtzdHlsZS53aWR0aC5weF09J2dyaWQudW5waW5uZWRXaWR0aCc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yICNoZWFkZXJWaXJ0dWFsQ29udGFpbmVyIGxldC1jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ3hHcmlkRm9yT2ZdPVwiZGltTGV2ZWxDb2x1bW5zXCIgW2lneEdyaWRGb3JPZlVuaXF1ZVNpemVDYWNoZV0gPSAndHJ1ZScgW2lneEZvclNjcm9sbENvbnRhaW5lcl09XCJncmlkLnBhcmVudFZpcnREaXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPVwiZ3JpZC51bnBpbm5lZFdpZHRoXCIgW2lneEZvclRyYWNrQnldPVwiZ3JpZC50cmFja0NvbHVtbkNoYW5nZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lneEZvclNpemVQcm9wTmFtZV09XCInY2FsY1BpeGVsV2lkdGgnXCIgW2lneEZvclNjcm9sbE9yaWVudGF0aW9uXT1cIidob3Jpem9udGFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cCBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09J3RvdGFsRGVwdGggPiAxID8gY2FsY0hlaWdodChjb2x1bW4sIGkpIDogdW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2x1bW4uaGVhZGVyR3JvdXBTdHlsZXMgfGlneEhlYWRlckdyb3VwU3R5bGU6Y29sdW1uOmdyaWQucGlwZVRyaWdnZXJcIiBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLmNhbGNXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4uY2FsY1dpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pZ3gtZ3JpZF9fdHItcGl2b3QtLWNvbHVtbkRpbWVuc2lvbkxlYWZdID0gJ2lzRHVwbGljYXRlT2ZFeGlzdGluZ1BhcmVudChjb2x1bW4sIGkpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaWd4LWdyaWRfX3RyLXBpdm90LS1jb2x1bW5NdWx0aVJvd1NwYW5dID0gJ2lzTXVsdGlSb3coY29sdW1uLCBpKSdcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBhdCB0aGUgZW5kIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoICYmICFncmlkLmlzUGlubmluZ1RvU3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHxpZ3hIZWFkZXJHcm91cFN0eWxlOmNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCIgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLmNhbGNXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4LWJhc2lzXT1cImNvbHVtbi5jYWxjV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCJjb2x1bW4ucmlnaHRQaW5uZWRPZmZzZXRcIiAocG9pbnRlcmRvd24pPVwiZ3JpZC5uYXZpZ2F0aW9uLmZvY3VzT3V0Um93SGVhZGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gSGVhZGVyIHRodW1iIGFyZWEgLS0+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3RodW1iXCIgW2hpZGRlbl09XCIhZ3JpZC5oYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLndpZHRoLnB4XT1cImdyaWQuc2Nyb2xsU2l6ZVwiPlxuPC9kaXY+XG5cbjxpZ3gtZHJvcC1kb3duICNkcm9wZG93biAoc2VsZWN0aW9uQ2hhbmdpbmcpPSdvbkFnZ3JlZ2F0aW9uQ2hhbmdlKCRldmVudCknPlxuICAgIDxpZ3gtZHJvcC1kb3duLWl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWdncmVnYXRlTGlzdFwiIFtzZWxlY3RlZF09J2lzU2VsZWN0ZWQoaXRlbSknIFt2YWx1ZV09J2l0ZW0nPlxuICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG48L2lneC1kcm9wLWRvd24+XG5cbjxkaXYgW2hpZGRlbl09J3RydWUnPlxuICAgIDxpZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmcgW21heEhlaWdodF09J2dyaWQuZXhjZWxTdHlsZUZpbHRlck1heEhlaWdodCcgW21pbkhlaWdodF09J2dyaWQuZXhjZWxTdHlsZUZpbHRlck1pbkhlaWdodCcgI2VzZj5cbiAgICAgICAgPGRpdiBpZ3hFeGNlbFN0eWxlQ29sdW1uT3BlcmF0aW9ucz5cbiAgICAgICAgICAgIDxpZ3gtY2hpcHMtYXJlYSAjZHJvcGRvd25DaGlwcz5cbiAgICAgICAgICAgICAgICA8aWd4LWNoaXAgKm5nRm9yPVwibGV0IGZpbHRlciBvZiB0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9uc1wiIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImdyaWQuZGlzcGxheURlbnNpdHlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlKT1cImZpbHRlclJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNoaXBDbGljayk9J29uRmlsdGVyc1NlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KScgW3NlbGVjdGFibGVdPSd0cnVlJyBbc2VsZWN0ZWRdPSdmaWx0ZXIgPT09IHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZSc+XG4gICAgICAgICAgICAgICAge3tmaWx0ZXIubWVtYmVyTmFtZX19XG4gICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlneC1leGNlbC1zdHlsZS1maWx0ZXItb3BlcmF0aW9ucz5cbiAgICAgICAgICAgIDxpZ3gtZXhjZWwtc3R5bGUtc2VhcmNoPjwvaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaD5cbiAgICAgICAgPC9pZ3gtZXhjZWwtc3R5bGUtZmlsdGVyLW9wZXJhdGlvbnM+XG4gICAgPC9pZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmc+XG48L2Rpdj5cblxuPGRpdiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDAwMHB4XCI+XG4gICAgPGlneC1jaGlwcy1hcmVhICNmaWx0ZXJBcmVhSGlkZGVuIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgIDxpZ3gtY2hpcCAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGdyaWQuZmlsdGVyRGltZW5zaW9uc1wiIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmUpPVwiZmlsdGVyUmVtb3ZlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PmZpbHRlcl9saXN0PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIHt7ZmlsdGVyLm1lbWJlck5hbWV9fVxuICAgICAgICA8L2lneC1jaGlwPlxuICAgIDwvaWd4LWNoaXBzLWFyZWE+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN2YWx1ZUNoaXBEZWZhdWx0VGVtcGxhdGUgbGV0LXZhbHVlPlxuICAgIHt7dmFsdWUuYWdncmVnYXRlLmtleX19KHt7dmFsdWUuZGlzcGxheU5hbWUgfHwgdmFsdWUubWVtYmVyfX0pXG48L25nLXRlbXBsYXRlPlxuIl19
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtaGVhZGVyLXJvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsTUFBTSxFQUlOLFNBQVMsRUFFVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9JLE9BQU8sRUFBYyxhQUFhLEVBQWlCLE1BQU0sMEJBQTBCLENBQUM7QUFFcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekM7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMkIsU0FBUSx5QkFBeUI7SUEyRHJFLElBQW9CLFdBQVc7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUMyQyxJQUFtQixFQUMxRCxHQUE0QixFQUM1QixH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QkFMdEMsU0FBUztzQ0FDVyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLHNCQUFzQjs7MEJBbUUzQixNQUFNOzJCQUFDLGFBQWE7NkhBMUNBLEdBQUc7c0JBQTNCLFNBQVM7dUJBQUMsS0FBSztnQkFLeUMsVUFBVTtzQkFBbEUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBS2hCLGFBQWE7c0JBQTVDLFNBQVM7dUJBQUMsWUFBWTtnQkFLWSxhQUFhO3NCQUEvQyxTQUFTO3VCQUFDLGVBQWU7Z0JBS2dCLG9CQUFvQjtzQkFBN0QsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBTzFCLGlCQUFpQjtzQkFEdkIsWUFBWTt1QkFBQyxZQUFZO2dCQVNuQixnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQmFzZUNoaXBFdmVudEFyZ3MsIElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDaGlwc0FyZWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGlwcy9jaGlwcy1hcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgT3ZlcmxheVNldHRpbmdzLCBQb3NpdGlvblNldHRpbmdzLCBWZXJ0aWNhbEFsaWdubWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgSUdYX0dSSURfQkFTRSwgUGl2b3RHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IERyb3BQb3NpdGlvbiB9IGZyb20gJy4uL21vdmluZy9tb3Zpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJUGl2b3RBZ2dyZWdhdG9yLCBJUGl2b3REaW1lbnNpb24sIElQaXZvdFZhbHVlLCBQaXZvdERpbWVuc2lvblR5cGUgfSBmcm9tICcuL3Bpdm90LWdyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBpdm90VXRpbCB9IGZyb20gJy4vcGl2b3QtdXRpbCc7XG5cbi8qKlxuICpcbiAqIEZvciBhbGwgaW50ZW50cyAmIHB1cnBvc2VzIHRyZWF0IHRoaXMgY29tcG9uZW50IGFzIHdoYXQgYSA8dGhlYWQ+IHVzdWFsbHkgaXMgaW4gdGhlIGRlZmF1bHQgPHRhYmxlPiBlbGVtZW50LlxuICpcbiAqIFRoaXMgY29udGFpbmVyIGhvbGRzIHRoZSBwaXZvdCBncmlkIGhlYWRlciBlbGVtZW50cyBhbmQgdGhlaXIgYmVoYXZpb3IvaW50ZXJhY3Rpb25zLlxuICpcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LXBpdm90LWhlYWRlci1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hQaXZvdEhlYWRlclJvd0NvbXBvbmVudCBleHRlbmRzIElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIHB1YmxpYyBhZ2dyZWdhdGVMaXN0OiBJUGl2b3RBZ2dyZWdhdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyB2YWx1ZTogSVBpdm90VmFsdWU7XG4gICAgcHVibGljIGZpbHRlckRyb3Bkb3duRGltZW5zaW9uczogU2V0PGFueT4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBwdWJsaWMgZmlsdGVyQXJlYURpbWVuc2lvbnM6IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfZHJvcFBvcyA9IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQ7XG4gICAgcHJpdmF0ZSB2YWx1ZURhdGE6IE1hcDxzdHJpbmcsIElQaXZvdEFnZ3JlZ2F0b3JbXT47XG4gICAgcHJpdmF0ZSBfc3ViTWVudVBvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBwcml2YXRlIF9zdWJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3N1Yk1lbnVQb3NpdGlvblNldHRpbmdzKSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlc2YnKSBwdWJsaWMgZXNmOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbHRlckFyZWFIaWRkZW4nLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGZpbHRlckFyZWE7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbHRlckljb24nKSBwdWJsaWMgZmlsdGVyc0J1dHRvbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25DaGlwcycpIHB1YmxpYyBkcm9wZG93bkNoaXBzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaXZvdEZpbHRlckNvbnRhaW5lcicpIHB1YmxpYyBwaXZvdEZpbHRlckNvbnRhaW5lcjtcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKCdub3RpZnlDaGlwJylcbiAgICBwdWJsaWMgbm90aWZpY2F0aW9uQ2hpcHM6IFF1ZXJ5TGlzdDxJZ3hDaGlwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKiBUaGUgdmlydHVhbGl6ZWQgcGFydCBvZiB0aGUgaGVhZGVyIHJvdyBjb250YWluaW5nIHRoZSB1bnBpbm5lZCBoZWFkZXIgZ3JvdXBzLlxuICAgICovXG4gICAgQFZpZXdDaGlsZHJlbignaGVhZGVyVmlydHVhbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGhlYWRlckNvbnRhaW5lcnM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50Pj47XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGhlYWRlckZvck9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJDb250YWluZXJzLmxhc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIG92ZXJyaWRlIGdyaWQ6IFBpdm90R3JpZFR5cGUsXG4gICAgICAgIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICkge1xuICAgICAgICBzdXBlcihyZWYsIGNkcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqIERlZmF1bHQgaXMgYSBzaW5nbGUgZW1wdHkgbGV2ZWwgc2luY2UgZGVmYXVsdCBkZXB0aCBpcyAxXG4gICAgKi9cbiAgICBwdWJsaWMgY29sdW1uRGltZW5zaW9uc0J5TGV2ZWw6IGFueVtdID0gW1tdXTtcblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaWx0ZXJzQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY2hpcHNXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyQXJlYURpbWVuc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQXJlYT8uY2hpcHNMaXN0ICYmIHRoaXMuZmlsdGVyQXJlYS5jaGlwc0xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGl2b3RGaWx0ZXJDb250YWluZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJQYWRkaW5ncyA9IHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdSaWdodCk7XG4gICAgICAgICAgICBjaGlwc1dpZHRoICs9IGNvbnRhaW5lclBhZGRpbmdzICsgKHRoaXMuZmlsdGVyc0J1dHRvbiAmJiB0aGlzLmZpbHRlckFyZWE/LmNoaXBzTGlzdC5sZW5ndGggPiAxID8gdGhpcy5maWx0ZXJzQnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQXJlYS5jaGlwc0xpc3QuZm9yRWFjaChjaGlwID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaW0gPSB0aGlzLmdyaWQuZmlsdGVyRGltZW5zaW9ucy5maW5kKHggPT4geC5tZW1iZXJOYW1lID09PSBjaGlwLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZGltKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDggcHggbWFyZ2luIGJldHdlZW4gY2hpcHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoaXBXaWR0aCA9IGNoaXAubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArIDg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlwc1dpZHRoICsgY3VycmVudENoaXBXaWR0aCA8IHRoaXMuZ3JpZC5waXZvdFJvd1dpZHRocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJBcmVhRGltZW5zaW9ucy5hZGQoZGltKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLmFkZChkaW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaXBzV2lkdGggKz0gY3VycmVudENoaXBXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplID4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxEZXB0aCgpIHtcbiAgICAgICAgY29uc3QgY29sdW1uRGltZW5zaW9ucyA9IHRoaXMuZ3JpZC5jb2x1bW5EaW1lbnNpb25zO1xuICAgICAgICBpZiAoY29sdW1uRGltZW5zaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbERlcHRoID0gY29sdW1uRGltZW5zaW9ucy5tYXAoeCA9PiBQaXZvdFV0aWwuZ2V0RGltZW5zaW9uRGVwdGgoeCkgKyAxKS5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwpO1xuICAgICAgICBpZiAodGhpcy5ncmlkLmhhc011bHRpcGxlVmFsdWVzKSB7XG4gICAgICAgICAgICB0b3RhbERlcHRoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4Q29udGFpbmVySGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbERlcHRoICogdGhpcy5ncmlkLnJlbmRlcmVkUm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgY2FsY0hlaWdodChjb2w6IENvbHVtblR5cGUsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLmxldmVsIDwgdGhpcy50b3RhbERlcHRoICYmIGNvbC5sZXZlbCA9PT0gaW5kZXggPyAodGhpcy50b3RhbERlcHRoIC0gY29sLmxldmVsKSAqIHRoaXMuZ3JpZC5yb3dIZWlnaHQgOiB0aGlzLmdyaWQucm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgaXNEdXBsaWNhdGVPZkV4aXN0aW5nUGFyZW50KGNvbDogQ29sdW1uVHlwZSwgbHZsOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Q29sbGVjdGlvbiA9IGx2bCA+IDAgPyB0aGlzLmNvbHVtbkRpbWVuc2lvbnNCeUxldmVsW2x2bCAtIDFdIDogW107XG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHBhcmVudENvbGxlY3Rpb24uaW5kZXhPZihjb2wpICE9PSAtMTtcblxuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgaXNNdWx0aVJvdyhjb2w6IENvbHVtblR5cGUsIGx2bDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGlzTGVhZiA9ICFjb2wuY29sdW1uR3JvdXA7XG4gICAgICAgIHJldHVybiBpc0xlYWYgJiYgbHZsICE9PSB0aGlzLnRvdGFsRGVwdGggLSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgcG9wdWxhdGVDb2x1bW5EaW1lbnNpb25zQnlMZXZlbCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b3RhbERlcHRoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc1tpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnVucGlubmVkQ29sdW1uQ29sbGVjdGlvbjtcbiAgICAgICAgLy8gcG9wdWxhdGUgY29sdW1uIGRpbWVuc2lvbiBtYXRyaXggcmVjdXJzaXZlbHlcbiAgICAgICAgdGhpcy5wb3B1bGF0ZURpbWVuc2lvblJlY3Vyc2l2ZWx5KGNvbHMuZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gMCksIDAsIHJlcyk7XG4gICAgICAgIHRoaXMuY29sdW1uRGltZW5zaW9uc0J5TGV2ZWwgPSByZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcHVsYXRlRGltZW5zaW9uUmVjdXJzaXZlbHkoY3VycmVudExldmVsQ29sdW1uczogQ29sdW1uVHlwZVtdLCBsZXZlbCA9IDAsIHJlczogYW55W10pIHtcbiAgICAgICAgY3VycmVudExldmVsQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzW2xldmVsXSkge1xuICAgICAgICAgICAgICAgIHJlc1tsZXZlbF0ucHVzaChjb2wpO1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXAgJiYgY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2wuY2hpbGRyZW4udG9BcnJheSgpLmZpbHRlcih4ID0+ICF4LmhpZGRlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEaW1lbnNpb25SZWN1cnNpdmVseSh2aXNpYmxlQ29sdW1ucywgbGV2ZWwgKyAxLCByZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPCB0aGlzLnRvdGFsRGVwdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZXZlbCArIDE7IGkgPD0gdGhpcy50b3RhbERlcHRoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbaV0ucHVzaChjb2wpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlQ29sdW1uRGltZW5zaW9uc0J5TGV2ZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1EcmFnU3RhcnQoZXZlbnQsIGFyZWEpIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBmb3IgKGxldCBjaGlwIG9mIHRoaXMubm90aWZpY2F0aW9uQ2hpcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGNoaXAubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKS5pbmRleE9mKGNoaXApID09PSAtMSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLml0ZW0oMCkuaWQgIT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICBjaGlwLm5hdGl2ZUVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFyZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsVG8oeyBsZWZ0OiBjaGlwLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1EcmFnRW5kKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlwIG9mIHRoaXMubm90aWZpY2F0aW9uQ2hpcHMpIHtcbiAgICAgICAgICAgIGNoaXAubmF0aXZlRWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXRBcmVhSGVpZ2h0KGFyZWE6IElneENoaXBzQXJlYUNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjaGlwcyA9IGFyZWEuY2hpcHNMaXN0O1xuICAgICAgICByZXR1cm4gY2hpcHMgJiYgY2hpcHMubGVuZ3RoID4gMCA/IGNoaXBzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHJvd1JlbW92ZWQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnJvd3MuZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZXZlbnQub3duZXIuaWQpO1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlRGltZW5zaW9uKHJvdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5SZW1vdmVkKGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5zLmZpbmQoeCA9PiB4Lm1lbWJlck5hbWUgPT09IGV2ZW50Lm93bmVyLmlkKTtcbiAgICAgICAgdGhpcy5ncmlkLnRvZ2dsZURpbWVuc2lvbihjb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgdmFsdWVSZW1vdmVkKGV2ZW50OiBJQmFzZUNoaXBFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5maW5kKHggPT4geC5tZW1iZXIgPT09IGV2ZW50Lm93bmVyLmlkIHx8IHguZGlzcGxheU5hbWUgPT09IGV2ZW50Lm93bmVyLmlkKTtcbiAgICAgICAgdGhpcy5ncmlkLnRvZ2dsZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGZpbHRlclJlbW92ZWQoZXZlbnQ6IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMuZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZXZlbnQub3duZXIuaWQpO1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlRGltZW5zaW9uKGZpbHRlcik7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbkZpbHRlcnNBcmVhRHJvcGRvd25DbGljayh7IHRhcmdldDogdGhpcy5maWx0ZXJzQnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQgfSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5oaWRlRVNGKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJzU2VsZWN0aW9uQ2hhbmdlZChldmVudD86IElCYXNlQ2hpcEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmRyb3Bkb3duQ2hpcHMuY2hpcHNMaXN0LmZvckVhY2goY2hpcCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpcC5pZCAhPT0gZXZlbnQub3duZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjaGlwLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25GaWx0ZXJzQXJlYURyb3Bkb3duQ2xpY2soeyB0YXJnZXQ6IHRoaXMuZmlsdGVyc0J1dHRvbi5lbC5uYXRpdmVFbGVtZW50IH0sIHRoaXMuZ3JpZC5maWx0ZXJEaW1lbnNpb25zLmZpbmQoZGltID0+IGRpbS5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCksIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyaW5nSWNvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJpbmdJY29uQ2xpY2soZXZlbnQsIGRpbWVuc2lvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRpbSA9IGRpbWVuc2lvbjtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLmRpbWVuc2lvbkRhdGFDb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBkaW0ubWVtYmVyTmFtZSB8fCB4LmZpZWxkID09PSBkaW0ubWVtYmVyKTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UudG9nZ2xlRmlsdGVyRHJvcGRvd24oZXZlbnQudGFyZ2V0LCBjb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25TdW1tYXJ5Q2xpY2soZXZlbnRBcmdzLCB2YWx1ZTogSVBpdm90VmFsdWUsIGRyb3Bkb3duOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9zdWJNZW51T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IGV2ZW50QXJncy5jdXJyZW50VGFyZ2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3BEb3duKHZhbHVlLCBkcm9wZG93biwgY2hpcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJzQXJlYURyb3Bkb3duQ2xpY2soZXZlbnQsIGRpbWVuc2lvbj8sIHNob3VsZFJlYXR0YWNoID0gdHJ1ZSkge1xuICAgICAgICBsZXQgZGltID0gZGltZW5zaW9uIHx8IHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5ncmlkLmRpbWVuc2lvbkRhdGFDb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBkaW0ubWVtYmVyTmFtZSB8fCB4LmZpZWxkID09PSBkaW0ubWVtYmVyKTtcbiAgICAgICAgaWYgKHNob3VsZFJlYXR0YWNoKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ2hpcHMuY2hpcHNMaXN0LmZvckVhY2goY2hpcCA9PiB7XG4gICAgICAgICAgICAgICAgY2hpcC5zZWxlY3RlZCA9IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25DaGlwcy5jaGlwc0xpc3QuZmlyc3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLnRvZ2dsZUZpbHRlcnNFU0YodGhpcy5lc2YsIGV2ZW50LnRhcmdldCwgY29sLCBzaG91bGRSZWF0dGFjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkFnZ3JlZ2F0aW9uQ2hhbmdlKGV2ZW50OiBJU2VsZWN0aW9uRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGV2ZW50Lm5ld1NlbGVjdGlvbi52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuYWdncmVnYXRlID0gZXZlbnQubmV3U2VsZWN0aW9uLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ncmlkLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGlzU2VsZWN0ZWQodmFsOiBJUGl2b3RBZ2dyZWdhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmFnZ3JlZ2F0ZS5rZXkgPT09IHZhbC5rZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTb3J0KF9ldmVudCwgZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgY29uc3Qgc3RhcnREaXJlY3Rpb24gPSBkaW1lbnNpb24uc29ydERpcmVjdGlvbiB8fCBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHN0YXJ0RGlyZWN0aW9uICsgMSA+IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/XG4gICAgICAgICAgICBTb3J0aW5nRGlyZWN0aW9uLk5vbmUgOiBzdGFydERpcmVjdGlvbiArIDE7XG4gICAgICAgIHRoaXMuZ3JpZC5zb3J0RGltZW5zaW9uKGRpbWVuc2lvbiwgZGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIG9uRGltRHJhZ092ZXIoZXZlbnQsIGRpbWVuc2lvbj86IFBpdm90RGltZW5zaW9uVHlwZSkge1xuICAgICAgICBpZiAoIWV2ZW50LmRyYWdDaGlwIHx8ICFldmVudC5kcmFnQ2hpcC5kYXRhPy5waXZvdEFyZWEpIHJldHVybjtcbiAgICAgICAgY29uc3QgdHlwZU1pc21hdGNoID0gZGltZW5zaW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5maW5kKHggPT4geC5tZW1iZXIgPT09IGV2ZW50LmRyYWdDaGlwLmlkXG4gICAgICAgICAgICB8fCB4LmRpc3BsYXlOYW1lID09PSBldmVudC5kcmFnQ2hpcC5pZCkgOlxuICAgICAgICAgICAgIXRoaXMuZ3JpZC5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzLmZpbmQoeCA9PiB4Lm1lbWJlciA9PT0gZXZlbnQuZHJhZ0NoaXAuaWQgfHwgeC5kaXNwbGF5TmFtZSA9PT0gZXZlbnQuZHJhZ0NoaXAuaWQpO1xuICAgICAgICBpZiAodHlwZU1pc21hdGNoKSB7XG4gICAgICAgICAgICAvLyBjYW5ub3QgZHJhZyBiZXR3ZWVuIGRpbWVuc2lvbnMgYW5kIHZhbHVlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIHRoZSBsZWZ0IGhhbGYgb2YgdGhlIGNoaXAsIGRyb3Agb24gdGhlIGxlZnRcbiAgICAgICAgLy8gZWxzZSBkcm9wIG9uIHRoZSByaWdodCBvZiB0aGUgY2hpcFxuICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gZXZlbnQub3duZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcG9zID0gY2xpZW50UmVjdC53aWR0aCAvIDI7XG5cbiAgICAgICAgdGhpcy5fZHJvcFBvcyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQub2Zmc2V0WCA+IHBvcyA/IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgOiBEcm9wUG9zaXRpb24uQmVmb3JlRHJvcFRhcmdldDtcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3BQb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgICAgIGV2ZW50Lm93bmVyLm5hdGl2ZUVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvbkRpbURyYWdMZWF2ZShldmVudCkge1xuICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBldmVudC5vd25lci5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuX2Ryb3BQb3MgPSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25BcmVhRHJhZ0xlYXZlKGV2ZW50LCBhcmVhKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDaGlwcyA9IGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKS5maWx0ZXIoeCA9PiB0aGlzLm5vdGlmaWNhdGlvbkNoaXBzLnRvQXJyYXkoKS5pbmRleE9mKHgpID09PSAtMSk7XG4gICAgICAgIGRhdGFDaGlwcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubmF0aXZlRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubmF0aXZlRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBvblZhbHVlRHJvcChldmVudCwgYXJlYSkge1xuICAgICAgICBpZiAoIShldmVudC5kcmFnQ2hpcCAmJiBldmVudC5kcmFnQ2hpcC5kYXRhPy5waXZvdEFyZWEpICYmICEoZXZlbnQuZHJhZ0RhdGE/LmNoaXAgJiYgISFldmVudC5kcmFnRGF0YS5jaGlwLmRhdGEucGl2b3RBcmVhKSkgcmV0dXJuO1xuICAgICAgICAvL3ZhbHVlcyBjYW4gb25seSBiZSByZW9yZGVyZWRcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5ncmlkLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGRyYWdJZCA9IGV2ZW50LmRyYWdDaGlwPy5pZCB8fCBldmVudC5kcmFnRGF0YT8uY2hpcC5pZDtcbiAgICAgICAgY29uc3QgY2hpcHNBcnJheSA9IGFyZWEuY2hpcHNMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IGNoaXBJbmRleCA9IGNoaXBzQXJyYXkuaW5kZXhPZihldmVudC5vd25lcikgIT09IC0xID8gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50Lm93bmVyKSA6IGNoaXBzQXJyYXkubGVuZ3RoO1xuICAgICAgICBjaGlwSW5kZXggPSB0aGlzLl9kcm9wUG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gY2hpcEluZGV4ICsgMSA6IGNoaXBJbmRleDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXMuZmluZCh4ID0+IHgubWVtYmVyID09PSBkcmFnSWQgfHwgeC5kaXNwbGF5TmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkcmFnQ2hpcEluZGV4ID0gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50LmRyYWdDaGlwIHx8IGV2ZW50LmRyYWdEYXRhLmNoaXApO1xuICAgICAgICAgICAgdGhpcy5ncmlkLm1vdmVWYWx1ZSh2YWx1ZSwgZHJhZ0NoaXBJbmRleCA+PSBjaGlwSW5kZXggPyBjaGlwSW5kZXggOiBjaGlwSW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgb25EaW1Ecm9wKGV2ZW50LCBhcmVhLCBkaW1lbnNpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQuZHJhZ0NoaXAgJiYgZXZlbnQuZHJhZ0NoaXAuZGF0YT8ucGl2b3RBcmVhKSAmJiAhKGV2ZW50LmRyYWdEYXRhPy5jaGlwICYmICEhZXZlbnQuZHJhZ0RhdGEuY2hpcC5kYXRhLnBpdm90QXJlYSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZHJhZ0lkID0gZXZlbnQuZHJhZ0NoaXA/LmlkIHx8IGV2ZW50LmRyYWdEYXRhPy5jaGlwLmlkO1xuICAgICAgICBjb25zdCBjdXJyZW50RGltID0gdGhpcy5ncmlkLmdldERpbWVuc2lvbnNCeVR5cGUoZGltZW5zaW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IGNoaXBzQXJyYXkgPSBhcmVhLmNoaXBzTGlzdC50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IGNoaXAgPSBjaGlwc0FycmF5LmZpbmQoeCA9PiB4LmlkID09PSBkcmFnSWQpO1xuICAgICAgICBjb25zdCBpc05ld0NoaXAgPSBjaGlwID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGlzUmVvcmRlciA9IGV2ZW50Lm93bmVyLmlkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIC8vY29uc3QgY2hpcEluZGV4ID0gY2hpcHNBcnJheS5pbmRleE9mKGV2ZW50Lm93bmVyKSAhPT0gLTEgPyBjaGlwc0FycmF5LmluZGV4T2YoZXZlbnQub3duZXIpIDogY2hpcHNBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNoaXBJbmRleCA9IGN1cnJlbnREaW0uZmluZEluZGV4KHggPT4geC5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCkgIT09IC0xID9cbiAgICAgICAgICAgIGN1cnJlbnREaW0uZmluZEluZGV4KHggPT4geC5tZW1iZXJOYW1lID09PSBldmVudC5vd25lci5pZCkgOiBjdXJyZW50RGltLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLl9kcm9wUG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gY2hpcEluZGV4ICsgMSA6IGNoaXBJbmRleDtcbiAgICAgICAgaWYgKGlzTmV3Q2hpcCkge1xuICAgICAgICAgICAgLy8gY2hpcCBtb3ZlZCBmcm9tIGFuIGV4dGVybmFsIGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IHRoaXMuZ3JpZC5hbGxEaW1lbnNpb25zLmZpbmQoeCA9PiB4ICYmIHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIGlmICghZGltKSB7XG4gICAgICAgICAgICAgICAgLy8geW91IGhhdmUgZHJhZ2dlZCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBkaW1lbnNpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyaWQubW92ZURpbWVuc2lvbihkaW0sIGRpbWVuc2lvblR5cGUsIHRhcmdldEluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1Jlb3JkZXIpIHtcbiAgICAgICAgICAgIC8vIGNoaXAgZnJvbSBzYW1lIGNvbGxlY3Rpb24sIHJlb3JkZXJlZC5cbiAgICAgICAgICAgIGNvbnN0IG5ld0RpbSA9IGN1cnJlbnREaW0uZmluZCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIGNvbnN0IGRyYWdDaGlwSW5kZXggPSBjdXJyZW50RGltLmZpbmRJbmRleCh4ID0+IHgubWVtYmVyTmFtZSA9PT0gZHJhZ0lkKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5tb3ZlRGltZW5zaW9uKG5ld0RpbSwgZGltZW5zaW9uVHlwZSwgZHJhZ0NoaXBJbmRleCA+IGNoaXBJbmRleCA/IHRhcmdldEluZGV4IDogdGFyZ2V0SW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWQucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ncmlkLmRpbWVuc2lvbnNDaGFuZ2UuZW1pdCh7IGRpbWVuc2lvbnM6IGN1cnJlbnREaW0sIGRpbWVuc2lvbkNvbGxlY3Rpb25UeXBlOiBkaW1lbnNpb25UeXBlIH0pO1xuICAgICAgICAvLyBjbGVhbiBzdGF0ZXNcbiAgICAgICAgdGhpcy5vbkRpbURyYWdFbmQoKTtcbiAgICAgICAgdGhpcy5vbkFyZWFEcmFnTGVhdmUoZXZlbnQsIGFyZWEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVEcm9wRG93bih2YWx1ZTogSVBpdm90VmFsdWUsIGRyb3Bkb3duOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGRyb3Bkb3duLndpZHRoID0gY2hpcC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4JztcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVMaXN0ID0gUGl2b3RVdGlsLmdldEFnZ3JlZ2F0ZUxpc3QodmFsdWUsIHRoaXMuZ3JpZCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgZHJvcGRvd24ub3Blbih0aGlzLl9zdWJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG59XG4iLCI8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlciBpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlci0tcGl2b3RcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHJcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdpZ3gtZ3JpZF9fdHItcGl2b3QtLWZpbHRlci1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgI3Bpdm90RmlsdGVyQ29udGFpbmVyICpuZ0lmPVwiZ3JpZC5zaG93UGl2b3RDb25maWd1cmF0aW9uVUlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QgaWd4LWdyaWRfX3RyLXBpdm90LS1maWx0ZXJcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cImdyaWQucGl2b3RSb3dXaWR0aHMgLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiZ3JpZC5waXZvdFJvd1dpZHRocyAtIDFcIiAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIGZpbHRlckFyZWEpXCJcbiAgICAgICAgICAgICAgICAgICAgIGlneERyb3AgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgZmlsdGVyQXJlYSwgMilcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWx0ZXIgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICNmaWx0ZXJBcmVhIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdlbXB0eScgaWd4RHJvcCAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCBmaWx0ZXJBcmVhLCAyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZC5maWx0ZXJEaW1lbnNpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X2ZpbHRlcl9kcm9wX2FyZWF9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiB0aGlzLmZpbHRlckFyZWFEaW1lbnNpb25zOyBsZXQgbGFzdCA9IGxhc3Q7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSdnZXRBcmVhSGVpZ2h0KGZpbHRlckFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCIgW2RhdGFdPVwieyBwaXZvdEFyZWE6ICdmaWx0ZXInIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlKT1cImZpbHRlclJlbW92ZWQoJGV2ZW50KVwiIChkcmFnT3Zlcik9XCJvbkRpbURyYWdPdmVyKCRldmVudCwgMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0xlYXZlKT1cIm9uRGltRHJhZ0xlYXZlKCRldmVudClcIiAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgZmlsdGVyQXJlYSwgMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW92ZVN0YXJ0KT0nb25EaW1EcmFnU3RhcnQoJGV2ZW50LCBmaWx0ZXJBcmVhKScgKG1vdmVFbmQpPSdvbkRpbURyYWdFbmQoKSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBpZ3hQcmVmaXggKHBvaW50ZXJkb3duKT0nb25GaWx0ZXJpbmdJY29uUG9pbnRlckRvd24oJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9J29uRmlsdGVyaW5nSWNvbkNsaWNrKCRldmVudCwgZmlsdGVyKSc+ZmlsdGVyX2xpc3Q8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZpbHRlci5tZW1iZXJOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9J2xhc3QnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzdHlsZS52aXNpYmlsaXR5XT0nXCJoaWRkZW5cIicgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QtLWNoaXBfZHJvcF9pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSdnZXRBcmVhSGVpZ2h0KGZpbHRlckFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBpZ3hEcm9wIChkcmFnRHJvcCk9XCJvbkRpbURyb3AoJGV2ZW50LCBmaWx0ZXJBcmVhLCAyKVwiICNub3RpZnlDaGlwIFtoaWRkZW5dPSd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9waXZvdF9maWx0ZXJfZHJvcF9jaGlwfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcGl2b3QtZmlsdGVyLXRvZ2dsZVwiICpuZ0lmPVwiaXNGaWx0ZXJzQnV0dG9uICYmIGdyaWQuZmlsdGVyRGltZW5zaW9ucy5sZW5ndGggIT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAjZmlsdGVySWNvbiAocG9pbnRlcmRvd24pPSdvbkZpbHRlcmluZ0ljb25Qb2ludGVyRG93bigkZXZlbnQpJyAoY2xpY2spPSdvbkZpbHRlcnNBcmVhRHJvcGRvd25DbGljaygkZXZlbnQpJz5maWx0ZXJfbGlzdDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWJhZGdlIHZhbHVlPVwie3t0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9ucy5zaXplfX1cIj48L2lneC1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0naWd4LWdyaWRfX3RyLXBpdm90LS1kcm9wLXJvdy1hcmVhJyAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIHJvd0FyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAgICAgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAjcGl2b3RDb2x1bW5Db250YWluZXIgKm5nSWY9XCJncmlkLnNob3dQaXZvdENvbmZpZ3VyYXRpb25VSVwiIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90XCJcbiAgICAgICAgICAgICAgICAgICAgIChkcm9wcGVkKT1cIm9uRGltRHJvcCgkZXZlbnQsIGNvbEFyZWEsIDEpXCIgaWd4RHJvcCAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIGNvbEFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ29sdW1ucyBhcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXBzLWFyZWEgI2NvbEFyZWEgZHJvcHBhYmxlPSd0cnVlJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J2VtcHR5JyAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCBjb2xBcmVhLCAxKVwiIGlneERyb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZC5jb2x1bW5EaW1lbnNpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfZW1wdHlfY29sdW1uX2Ryb3BfYXJlYX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGdyaWQuY29sdW1uRGltZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChjb2xBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwiY29sLm1lbWJlck5hbWVcIiBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtkYXRhXT1cInsgcGl2b3RBcmVhOiAnY29sdW1uJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJjb2x1bW5SZW1vdmVkKCRldmVudClcIiAoZHJhZ092ZXIpPVwib25EaW1EcmFnT3ZlcigkZXZlbnQsIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdMZWF2ZSk9XCJvbkRpbURyYWdMZWF2ZSgkZXZlbnQpXCIgKGRyYWdEcm9wKT1cIm9uRGltRHJvcCgkZXZlbnQsIGNvbEFyZWEsIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdmVTdGFydCk9J29uRGltRHJhZ1N0YXJ0KCRldmVudCwgY29sQXJlYSknIChtb3ZlRW5kKT0nb25EaW1EcmFnRW5kKCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBTb3J0KCRldmVudCwgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PnZpZXdfY29sdW1uPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uIGlneFByZWZpeCAocG9pbnRlcmRvd24pPSdvbkZpbHRlcmluZ0ljb25Qb2ludGVyRG93bigkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT0nb25GaWx0ZXJpbmdJY29uQ2xpY2soJGV2ZW50LCBjb2wpJz5maWx0ZXJfbGlzdDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sLm1lbWJlck5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJjb2wuc29ydERpcmVjdGlvblwiIGlneFN1ZmZpeD4ge3sgY29sLnNvcnREaXJlY3Rpb24gPCAyID8gJ2Fycm93X3Vwd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Fycm93X2Rvd253YXJkJyB9fTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPSdsYXN0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChjb2xBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgY29sQXJlYSwgMSlcIiAjbm90aWZ5Q2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfY29sdW1uX2Ryb3BfY2hpcH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAjcGl2b3RWYWx1ZUNvbnRhaW5lciAqbmdJZj1cImdyaWQuc2hvd1Bpdm90Q29uZmlndXJhdGlvblVJXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3RcIlxuICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGRyb3BwZWQpPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAgICAgKGlneERyYWdMZWF2ZSk9XCJvbkFyZWFEcmFnTGVhdmUoJGV2ZW50LCB2YWx1ZUFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWUgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICN2YWx1ZUFyZWEgZHJvcHBhYmxlPSd0cnVlJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J2VtcHR5JyAoZHJvcHBlZCk9XCJvblZhbHVlRHJvcCgkZXZlbnQsIHZhbHVlQXJlYSlcIiBpZ3hEcm9wICpuZ0lmPVwiZ3JpZC52YWx1ZXMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X3ZhbHVlX2Ryb3BfYXJlYX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBncmlkLnZhbHVlczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodCh2YWx1ZUFyZWEpJz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1jaGlwICNjdXJyQ2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwidmFsdWUuZGlzcGxheU5hbWUgfHwgdmFsdWUubWVtYmVyXCIgW2RhdGFdPVwieyBwaXZvdEFyZWE6ICd2YWx1ZScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJncmlkLmRpc3BsYXlEZW5zaXR5XCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJ2YWx1ZVJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnTGVhdmUpPVwib25EaW1EcmFnTGVhdmUoJGV2ZW50KVwiIChkcmFnT3Zlcik9XCJvbkRpbURyYWdPdmVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0Ryb3ApPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItcGl2b3QtdG9nZ2xlLWljb25zXCIgaWd4UHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT0nb25TdW1tYXJ5Q2xpY2soJGV2ZW50LCB2YWx1ZSwgZHJvcGRvd24sIGN1cnJDaGlwKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPSckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCknIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+ZnVuY3Rpb25zPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5hcnJvd19kcm9wX2Rvd248L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQudmFsdWVDaGlwVGVtcGxhdGUgPyBncmlkLnZhbHVlQ2hpcFRlbXBsYXRlIDogdmFsdWVDaGlwRGVmYXVsdFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogdmFsdWUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nbGFzdCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09J2dldEFyZWFIZWlnaHQodmFsdWVBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25WYWx1ZURyb3AoJGV2ZW50LCB2YWx1ZUFyZWEpXCIgI25vdGlmeVZhbHVlQ2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfdmFsdWVfZHJvcF9jaGlwfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX193cmFwcGVyXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCIgW2NsYXNzLmlneC1ncmlkX190ci0tbXJsXT1cImhhc01STFwiPlxuXG4gICAgICAgIDwhLS0gQ29sdW1uIGhlYWRlcnMgYXJlYSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190clwiIHJvbGU9XCJyb3dcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIj5cbiAgICAgICAgICAgIDxkaXYgI3Bpdm90Q29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90IGlneC1ncmlkX190ci1waXZvdC0tcm93LWFyZWFcIlxuICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ3JpZC5waXZvdFJvd1dpZHRocyAtIDFcIiAoaWd4RHJhZ0xlYXZlKT1cIm9uQXJlYURyYWdMZWF2ZSgkZXZlbnQsIHJvd0FyZWEpXCIgaWd4RHJvcFxuICAgICAgICAgICAgICAgICAoZHJvcHBlZCk9XCJvbkRpbURyb3AoJGV2ZW50LCByb3dBcmVhLCAwKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gUm93IGFyZWEgLS0+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlwcy1hcmVhICNyb3dBcmVhIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLnNob3dQaXZvdENvbmZpZ3VyYXRpb25VSVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0nZW1wdHknIGlneERyb3AgKGRyb3BwZWQpPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkLnJvd0RpbWVuc2lvbnMubGVuZ3RoID09PSAwICYmIGdyaWQuc2hvd1Bpdm90Q29uZmlndXJhdGlvblVJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSdpZ3gtZ3JpZF9fcGl2b3QtZW1wdHktY2hpcC1hcmVhJz57e2dyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3Bpdm90X2VtcHR5X3Jvd19kcm9wX2FyZWF9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIGdyaWQucm93RGltZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPSdcImhpZGRlblwiJyBjbGFzcz1cImlneC1ncmlkX190ci1waXZvdC0tY2hpcF9kcm9wX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChyb3dBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hpcCBbZHJhZ2dhYmxlXT1cInRydWVcIiBbaWRdPVwicm93Lm1lbWJlck5hbWVcIiBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtkYXRhXT1cInsgcGl2b3RBcmVhOiAncm93JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZSk9XCJyb3dSZW1vdmVkKCRldmVudClcIiAoZHJhZ0xlYXZlKT1cIm9uRGltRHJhZ0xlYXZlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIiAoZHJhZ092ZXIpPVwib25EaW1EcmFnT3ZlcigkZXZlbnQsIDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdmVTdGFydCk9J29uRGltRHJhZ1N0YXJ0KCRldmVudCwgcm93QXJlYSknIChtb3ZlRW5kKT0nb25EaW1EcmFnRW5kKCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBTb3J0KCRldmVudCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PnRhYmxlX3Jvd3M8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4IChwb2ludGVyZG93bik9J29uRmlsdGVyaW5nSWNvblBvaW50ZXJEb3duKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPSdvbkZpbHRlcmluZ0ljb25DbGljaygkZXZlbnQsIHJvdyknPmZpbHRlcl9saXN0PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93Lm1lbWJlck5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJyb3cuc29ydERpcmVjdGlvblwiIGlneFN1ZmZpeD4ge3sgcm93LnNvcnREaXJlY3Rpb24gPCAyID8gJ2Fycm93X3Vwd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Fycm93X2Rvd253YXJkJyB9fTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPSdsYXN0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUudmlzaWJpbGl0eV09J1wiaGlkZGVuXCInIGNsYXNzPVwiaWd4LWdyaWRfX3RyLXBpdm90LS1jaGlwX2Ryb3BfaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0nZ2V0QXJlYUhlaWdodChyb3dBcmVhKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoaXAgaWd4RHJvcCAoZHJhZ0Ryb3ApPVwib25EaW1Ecm9wKCRldmVudCwgcm93QXJlYSwgMClcIiAjbm90aWZ5Q2hpcCBbaGlkZGVuXT0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3Rfcm93X2Ryb3BfY2hpcH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBmcm9tIHRoZSBzdGFydCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaW5uZWRDb2x1bW5Db2xsZWN0aW9uLmxlbmd0aCAmJiBncmlkLmlzUGlubmluZ1RvU3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHwgaWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXgtYmFzaXNdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwiZ3JpZC5uYXZpZ2F0aW9uLmZvY3VzT3V0Um93SGVhZGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZC0tdmlydHVhbGl6YXRpb25XcmFwcGVyXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPSdtYXhDb250YWluZXJIZWlnaHQnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZF9fZ3JvdXAgaWd4LWdyaWQtdGhlYWQtLXZpcnR1YWxpemF0aW9uQ29udGFpbmVyXCIgW3N0eWxlLmhlaWdodC5weF09J3RvdGFsRGVwdGggPiAxID8gZ3JpZC5yb3dIZWlnaHQgOiB1bmRlZmluZWQnICpuZ0Zvcj0nbGV0IGRpbUxldmVsQ29sdW1ucyBvZiBjb2x1bW5EaW1lbnNpb25zQnlMZXZlbDsgbGV0IGkgPSBpbmRleCcgW3N0eWxlLndpZHRoLnB4XT0nZ3JpZC51bnBpbm5lZFdpZHRoJz5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgI2hlYWRlclZpcnR1YWxDb250YWluZXIgbGV0LWNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lneEdyaWRGb3JPZl09XCJkaW1MZXZlbENvbHVtbnNcIiBbaWd4R3JpZEZvck9mVW5pcXVlU2l6ZUNhY2hlXSA9ICd0cnVlJyBbaWd4Rm9yU2Nyb2xsQ29udGFpbmVyXT1cImdyaWQucGFyZW50VmlydERpclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWd4Rm9yQ29udGFpbmVyU2l6ZV09XCJncmlkLnVucGlubmVkV2lkdGhcIiBbaWd4Rm9yVHJhY2tCeV09XCJncmlkLnRyYWNrQ29sdW1uQ2hhbmdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWd4Rm9yU2l6ZVByb3BOYW1lXT1cIidjYWxjUGl4ZWxXaWR0aCdcIiBbaWd4Rm9yU2Nyb2xsT3JpZW50YXRpb25dPVwiJ2hvcml6b250YWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWdyaWQtaGVhZGVyLWdyb3VwIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJHcm91cENsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0ndG90YWxEZXB0aCA+IDEgPyBjYWxjSGVpZ2h0KGNvbHVtbiwgaSkgOiB1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaWd4LWdyaWRfX3RyLXBpdm90LS1jb2x1bW5EaW1lbnNpb25MZWFmXSA9ICdpc0R1cGxpY2F0ZU9mRXhpc3RpbmdQYXJlbnQoY29sdW1uLCBpKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlneC1ncmlkX190ci1waXZvdC0tY29sdW1uTXVsdGlSb3dTcGFuXSA9ICdpc011bHRpUm93KGNvbHVtbiwgaSknXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1ncmlkLWhlYWRlci1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBpbm5lZCBjb2x1bW5zIGNvbGxlY3Rpb24gYXQgdGhlIGVuZCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaW5uZWRDb2x1bW5Db2xsZWN0aW9uLmxlbmd0aCAmJiAhZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWdyaWQtaGVhZGVyLWdyb3VwIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJHcm91cENsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXgtYmFzaXNdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCJjb2x1bW4ucmlnaHRQaW5uZWRPZmZzZXRcIiAocG9pbnRlcmRvd24pPVwiZ3JpZC5uYXZpZ2F0aW9uLmZvY3VzT3V0Um93SGVhZGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gSGVhZGVyIHRodW1iIGFyZWEgLS0+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3RodW1iXCIgW2hpZGRlbl09XCIhZ3JpZC5oYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLndpZHRoLnB4XT1cImdyaWQuc2Nyb2xsU2l6ZVwiPlxuPC9kaXY+XG5cbjxpZ3gtZHJvcC1kb3duICNkcm9wZG93biAoc2VsZWN0aW9uQ2hhbmdpbmcpPSdvbkFnZ3JlZ2F0aW9uQ2hhbmdlKCRldmVudCknPlxuICAgIDxpZ3gtZHJvcC1kb3duLWl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWdncmVnYXRlTGlzdFwiIFtzZWxlY3RlZF09J2lzU2VsZWN0ZWQoaXRlbSknIFt2YWx1ZV09J2l0ZW0nPlxuICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG48L2lneC1kcm9wLWRvd24+XG5cbjxkaXYgW2hpZGRlbl09J3RydWUnPlxuICAgIDxpZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmcgW21heEhlaWdodF09J2dyaWQuZXhjZWxTdHlsZUZpbHRlck1heEhlaWdodCcgW21pbkhlaWdodF09J2dyaWQuZXhjZWxTdHlsZUZpbHRlck1pbkhlaWdodCcgI2VzZj5cbiAgICAgICAgPGRpdiBpZ3hFeGNlbFN0eWxlQ29sdW1uT3BlcmF0aW9ucz5cbiAgICAgICAgICAgIDxpZ3gtY2hpcHMtYXJlYSAjZHJvcGRvd25DaGlwcz5cbiAgICAgICAgICAgICAgICA8aWd4LWNoaXAgKm5nRm9yPVwibGV0IGZpbHRlciBvZiB0aGlzLmZpbHRlckRyb3Bkb3duRGltZW5zaW9uc1wiIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImdyaWQuZGlzcGxheURlbnNpdHlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlKT1cImZpbHRlclJlbW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNoaXBDbGljayk9J29uRmlsdGVyc1NlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KScgW3NlbGVjdGFibGVdPSd0cnVlJyBbc2VsZWN0ZWRdPSdmaWx0ZXIgPT09IHRoaXMuZmlsdGVyRHJvcGRvd25EaW1lbnNpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZSc+XG4gICAgICAgICAgICAgICAge3tmaWx0ZXIubWVtYmVyTmFtZX19XG4gICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlneC1leGNlbC1zdHlsZS1maWx0ZXItb3BlcmF0aW9ucz5cbiAgICAgICAgICAgIDxpZ3gtZXhjZWwtc3R5bGUtc2VhcmNoPjwvaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaD5cbiAgICAgICAgPC9pZ3gtZXhjZWwtc3R5bGUtZmlsdGVyLW9wZXJhdGlvbnM+XG4gICAgPC9pZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmc+XG48L2Rpdj5cblxuPGRpdiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDAwMHB4XCI+XG4gICAgPGlneC1jaGlwcy1hcmVhICNmaWx0ZXJBcmVhSGlkZGVuIGRyb3BwYWJsZT0ndHJ1ZSc+XG4gICAgICAgIDxpZ3gtY2hpcCAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGdyaWQuZmlsdGVyRGltZW5zaW9uc1wiIFtpZF09XCJmaWx0ZXIubWVtYmVyTmFtZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZ3JpZC5kaXNwbGF5RGVuc2l0eVwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmUpPVwiZmlsdGVyUmVtb3ZlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gaWd4UHJlZml4PmZpbHRlcl9saXN0PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIHt7ZmlsdGVyLm1lbWJlck5hbWV9fVxuICAgICAgICA8L2lneC1jaGlwPlxuICAgIDwvaWd4LWNoaXBzLWFyZWE+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN2YWx1ZUNoaXBEZWZhdWx0VGVtcGxhdGUgbGV0LXZhbHVlPlxuICAgIHt7dmFsdWUuYWdncmVnYXRlLmtleX19KHt7dmFsdWUuZGlzcGxheU5hbWUgfHwgdmFsdWUubWVtYmVyfX0pXG48L25nLXRlbXBsYXRlPlxuIl19
|