igniteui-angular 15.1.31 → 15.1.33
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/buttonGroup/buttonGroup.component.mjs +5 -9
- package/esm2020/lib/directives/for-of/for_of.directive.mjs +4 -1
- package/esm2020/lib/grids/common/strategy.mjs +2 -1
- package/esm2020/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.mjs +6 -3
- package/esm2020/lib/grids/grid/grid.component.mjs +15 -3
- package/esm2020/lib/grids/headers/grid-header-row.component.mjs +9 -3
- package/esm2020/lib/services/overlay/overlay.mjs +2 -2
- package/fesm2015/igniteui-angular.mjs +34 -14
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +34 -14
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/lib/buttonGroup/buttonGroup.component.d.ts +2 -2
- package/lib/grids/grid/grid.component.d.ts +9 -0
- package/lib/grids/headers/grid-header-row.component.d.ts +4 -0
- package/migrations/common/tsUtils.js +1 -1
- package/package.json +1 -1
|
@@ -104,6 +104,12 @@ export class IgxGridHeaderRowComponent {
|
|
|
104
104
|
ngDoCheck() {
|
|
105
105
|
this.cdr.markForCheck();
|
|
106
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* @hidden @internal
|
|
109
|
+
*/
|
|
110
|
+
scroll(event) {
|
|
111
|
+
this.grid.preventHeaderScroll(event);
|
|
112
|
+
}
|
|
107
113
|
headerRowSelection(event) {
|
|
108
114
|
if (!this.grid.isMultiRowSelectionEnabled) {
|
|
109
115
|
return;
|
|
@@ -117,10 +123,10 @@ export class IgxGridHeaderRowComponent {
|
|
|
117
123
|
}
|
|
118
124
|
}
|
|
119
125
|
IgxGridHeaderRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IgxGridHeaderRowComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
-
IgxGridHeaderRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: { grid: "grid", pinnedColumnCollection: "pinnedColumnCollection", unpinnedColumnCollection: "unpinnedColumnCollection", activeDescendant: "activeDescendant", hasMRL: "hasMRL", width: "width", density: "density" }, host: { properties: { "class.igx-grid-thead--cosy": "this.cosyStyle", "class.igx-grid-thead--compact": "this.compactStyle" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective, static: true }, { propertyName: "headerDragContainer", first: true, predicate: ["headerDragContainer"], descendants: true }, { propertyName: "headerSelectorContainer", first: true, predicate: ["headerSelectorContainer"], descendants: true }, { propertyName: "headerGroupContainer", first: true, predicate: ["headerGroupContainer"], descendants: true }, { propertyName: "headSelectorBaseTemplate", first: true, predicate: ["headSelectorBaseTemplate"], descendants: true }, { propertyName: "filterRow", first: true, predicate: IgxGridFilteringRowComponent, descendants: true }, { propertyName: "headerHierarchyExpander", first: true, predicate: ["headerHierarchyExpander"], descendants: true }, { propertyName: "_groups", predicate: IgxGridHeaderGroupComponent, descendants: true }], ngImport: i0, template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [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\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: i3.IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: i4.IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: ["column", "value"] }, { kind: "directive", type: i5.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "component", type: i6.IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "pipe", type: i7.IgxGridTopLevelColumns, name: "igxTopLevel" }, { kind: "pipe", type: i8.IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: i8.IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
126
|
+
IgxGridHeaderRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: { grid: "grid", pinnedColumnCollection: "pinnedColumnCollection", unpinnedColumnCollection: "unpinnedColumnCollection", activeDescendant: "activeDescendant", hasMRL: "hasMRL", width: "width", density: "density" }, host: { properties: { "class.igx-grid-thead--cosy": "this.cosyStyle", "class.igx-grid-thead--compact": "this.compactStyle" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective, static: true }, { propertyName: "headerDragContainer", first: true, predicate: ["headerDragContainer"], descendants: true }, { propertyName: "headerSelectorContainer", first: true, predicate: ["headerSelectorContainer"], descendants: true }, { propertyName: "headerGroupContainer", first: true, predicate: ["headerGroupContainer"], descendants: true }, { propertyName: "headSelectorBaseTemplate", first: true, predicate: ["headSelectorBaseTemplate"], descendants: true }, { propertyName: "filterRow", first: true, predicate: IgxGridFilteringRowComponent, descendants: true }, { propertyName: "headerHierarchyExpander", first: true, predicate: ["headerHierarchyExpander"], descendants: true }, { propertyName: "_groups", predicate: IgxGridHeaderGroupComponent, descendants: true }], ngImport: i0, template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" (scroll)=\"scroll($event)\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [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\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: i3.IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: i4.IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: ["column", "value"] }, { kind: "directive", type: i5.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "component", type: i6.IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "pipe", type: i7.IgxGridTopLevelColumns, name: "igxTopLevel" }, { kind: "pipe", type: i8.IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: i8.IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
121
127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IgxGridHeaderRowComponent, decorators: [{
|
|
122
128
|
type: Component,
|
|
123
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-header-row', template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [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\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n" }]
|
|
129
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-header-row', template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" (scroll)=\"scroll($event)\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\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\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [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\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n" }]
|
|
124
130
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { grid: [{
|
|
125
131
|
type: Input
|
|
126
132
|
}], pinnedColumnCollection: [{
|
|
@@ -166,4 +172,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
166
172
|
type: ViewChild,
|
|
167
173
|
args: ['headerHierarchyExpander']
|
|
168
174
|
}] } });
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBR1QsV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUdqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7OztBQUc1RTs7Ozs7OztHQU9HO0FBTUgsTUFBTSxPQUFPLHlCQUF5QjtJQTBCbEM7OztPQUdHO0lBQ0gsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFlRDs7OztPQUlHO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFNRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUEwQkQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQVcscUJBQXFCO1FBQzVCLE9BQU8saUVBQWlFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbkgsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzFCLE1BQU0sR0FBRyxHQUFHO1lBQ1IsU0FBUyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLE1BQWdCO2dCQUNqRixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBbUM7YUFDNUQ7U0FDOEIsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFELEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDakU7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxZQUNjLEdBQTRCLEVBQzVCLEdBQXNCO1FBRHRCLFFBQUcsR0FBSCxHQUFHLENBQXlCO1FBQzVCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUlwQyxrQ0FBa0M7UUFFM0IsMkJBQXNCLEdBQWlCLEVBQUUsQ0FBQztRQUVqRCxvQ0FBb0M7UUFFN0IsNkJBQXdCLEdBQWlCLEVBQUUsQ0FBQztJQXlJL0MsQ0FBQztJQUVMOzs7Ozs7O09BT0c7SUFDSSxTQUFTO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBaUI7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDOztzSEE3S1EseUJBQXlCOzBHQUF6Qix5QkFBeUIsK2ZBNkVXLHFCQUFxQiwrZ0JBbUJ2RCw0QkFBNEIsa0xBMUN6QiwyQkFBMkIsZ0RDekY3QyxtbFBBNElBOzJGRHpHYSx5QkFBeUI7a0JBTHJDLFNBQVM7c0NBQ1csdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxxQkFBcUI7aUlBT3hCLElBQUk7c0JBRFYsS0FBSztnQkFLQyxzQkFBc0I7c0JBRDVCLEtBQUs7Z0JBS0Msd0JBQXdCO3NCQUQ5QixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFRSyxTQUFTO3NCQURuQixXQUFXO3VCQUFDLDRCQUE0QjtnQkFVOUIsWUFBWTtzQkFEdEIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBZ0JyQyxPQUFPO3NCQURiLFlBQVk7dUJBQUMsMkJBQTJCO2dCQXdCbEMsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVEzRSxtQkFBbUI7c0JBRHpCLFNBQVM7dUJBQUMscUJBQXFCO2dCQUl6Qix1QkFBdUI7c0JBRDdCLFNBQVM7dUJBQUMseUJBQXlCO2dCQUk3QixvQkFBb0I7c0JBRDFCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUkxQix3QkFBd0I7c0JBRDlCLFNBQVM7dUJBQUMsMEJBQTBCO2dCQUk5QixTQUFTO3NCQURmLFNBQVM7dUJBQUMsNEJBQTRCO2dCQVVoQyx1QkFBdUI7c0JBRDdCLFNBQVM7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEdyaWRGb3JPZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgR3JpZFR5cGUsIElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICpcbiAqIEZvciBhbGwgaW50ZW50cyAmIHB1cnBvc2VzIHRyZWF0IHRoaXMgY29tcG9uZW50IGFzIHdoYXQgYSA8dGhlYWQ+IHVzdWFsbHkgaXMgaW4gdGhlIGRlZmF1bHQgPHRhYmxlPiBlbGVtZW50LlxuICpcbiAqIFRoaXMgY29udGFpbmVyIGhvbGRzIHRoZSBncmlkIGhlYWRlciBlbGVtZW50cyBhbmQgdGhlaXIgYmVoYXZpb3IvaW50ZXJhY3Rpb25zLlxuICpcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LWdyaWQtaGVhZGVyLXJvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2sge1xuXG4gICAgLyoqIFRoZSBncmlkIGNvbXBvbmVudCBjb250YWluaW5nIHRoaXMgZWxlbWVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkOiBHcmlkVHlwZTtcblxuICAgIC8qKiBQaW5uZWQgY29sdW1ucyBvZiB0aGUgZ3JpZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwaW5uZWRDb2x1bW5Db2xsZWN0aW9uOiBDb2x1bW5UeXBlW10gPSBbXTtcblxuICAgIC8qKiBVbnBpbm5lZCBjb2x1bW5zIG9mIHRoZSBncmlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVucGlubmVkQ29sdW1uQ29sbGVjdGlvbjogQ29sdW1uVHlwZVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVEZXNjZW5kYW50OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoYXNNUkw6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVuc2l0eTogRGlzcGxheURlbnNpdHk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aGVhZC0tY29zeScpXG4gICAgcHVibGljIGdldCBjb3N5U3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbnNpdHkgPT09ICdjb3N5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aGVhZC0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjb21wYWN0U3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbnNpdHkgPT09ICdjb21wYWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWFkZXIgZ3JvdXBzIGluc2lkZSB0aGUgaGVhZGVyIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBOb3RlOiBUaGVzZSBhcmUgb25seSB0aGUgdG9wIGxldmVsIGhlYWRlciBncm91cHMgaW4gY2FzZSB0aGVyZSBhcmUgbXVsdGktY29sdW1uIGhlYWRlcnNcbiAgICAgKiBvciBhIHNwZWNpZmljIGNvbHVtbiBsYXlvdXQuIElmIHlvdSB3YW50IHRvIGdldCB0aGUgZmxhdHRlbmVkIGNvbGxlY3Rpb24gdXNlIHRoZSBgZ3JvdXBzYFxuICAgICAqIHByb3BlcnR5IGJlbG93LlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBfZ3JvdXBzOiBRdWVyeUxpc3Q8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGF0dGVuZWQgaGVhZGVyIGdyb3VwcyBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdyb3VwcygpOiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMuX2dyb3Vwcz8udG9BcnJheSgpID8/IFtdKTtcbiAgICB9XG5cbiAgICAvKiogSGVhZGVyIGNvbXBvbmVudHMgaW4gdGhlIGhlYWRlciByb3cuICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneEdyaWRIZWFkZXJDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5tYXAoZ3JvdXAgPT4gZ3JvdXAuaGVhZGVyKTtcbiAgICB9XG5cbiAgICAvKiogRmlsdGVyaW5nIGNlbGwgY29tcG9uZW50cyBpbiB0aGUgaGVhZGVyIHJvdy4gKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKTogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5tYXAoZ3JvdXAgPT4gZ3JvdXAuZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHZpcnR1YWxpemVkIHBhcnQgb2YgdGhlIGhlYWRlciByb3cgY29udGFpbmluZyB0aGUgdW5waW5uZWQgaGVhZGVyIGdyb3Vwcy4gKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJWaXJ0dWFsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBoZWFkZXJDb250YWluZXI6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQ+O1xuXG4gICAgcHVibGljIGdldCBoZWFkZXJGb3JPZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckRyYWdDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJEcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclNlbGVjdG9yQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyU2VsZWN0b3JDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyR3JvdXBDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUnKVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkKElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQpXG4gICAgcHVibGljIGZpbHRlclJvdzogSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEV4cGFuZC9jb2xsYXBzZSBhbGwgY2hpbGQgZ3JpZHMgYXJlYSBpbiBhIGhpZXJhcmNoaWNhbCBncmlkLlxuICAgICAqIGB1bmRlZmluZWRgIGluIHRoZSBiYXNlIGFuZCB0cmVlIGdyaWRzLlxuICAgICAqXG4gICAgICogQGludGVybmFsIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJIaWVyYXJjaHlFeHBhbmRlcicpXG4gICAgcHVibGljIGhlYWRlckhpZXJhcmNoeUV4cGFuZGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIHB1YmxpYyBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGdyaWQgaW5zdGFuY2UgaXMgYSBoaWVyYXJjaGljYWwgZ3JpZC5cbiAgICAgKiBhcyBvbmx5IGhpZXJhcmNoaWNhbCBncmlkcyBoYXZlIHRoZSBgaXNIaWVyYXJjaGljYWxSZWNvcmRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0hpZXJhcmNoaWNhbEdyaWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZ3JpZC5pc0hpZXJhcmNoaWNhbFJlY29yZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGluZGVudGF0aW9uQ1NTQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGBpZ3gtZ3JpZF9faGVhZGVyLWluZGVudGF0aW9uIGlneC1ncmlkX19yb3ctaW5kZW50YXRpb24tLWxldmVsLSR7dGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMubGVuZ3RofWA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dTZWxlY3RvcnNDb250ZXh0KCk6IElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ291bnQ6IHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmZpbHRlcmVkU2VsZWN0ZWRSb3dJZHMubGVuZ3RoIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50OiB0aGlzLmdyaWQudG90YWxSb3dzQ291bnRBZnRlckZpbHRlciBhcyBudW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWxHcmlkKSB7XG4gICAgICAgICAgICBjdHguJGltcGxpY2l0LnNlbGVjdEFsbCA9ICgpID0+IHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKCk7XG4gICAgICAgICAgICBjdHguJGltcGxpY2l0LmRlc2VsZWN0QWxsID0gKCkgPT4gdGhpcy5ncmlkLmRlc2VsZWN0QWxsUm93cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7IH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaG9vayBleGlzdHMgYXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgdW5mb3J0dW5hdGUgZmFjdFxuICAgICAqIHRoYXQgd2hlbiB3ZSBoYXZlIHBpbm5lZCBjb2x1bW5zIGluIHRoZSBncmlkLCB0aGUgdW5waW5uZWQgY29sdW1ucyBoZWFkZXJzXG4gICAgICogYXJlIGFmZmVjdGVkIGJ5IGEgZGVsYXllZCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIGFmdGVyIGEgaG9yaXpvbnRhbCBzY3JvbGwgOihcbiAgICAgKiBUaHVzLCB3ZSB0ZWxsIHRoZSBwYXJlbnQgZ3JpZCBjaGFuZ2UgZGV0ZWN0b3IgdG8gY2hlY2sgdXMgYXQgZWFjaCBjeWNsZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGhlYWRlclJvd1NlbGVjdGlvbihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFJvd3MoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX193cmFwcGVyXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICBbY2xhc3MuaWd4LWdyaWRfX3RyLS1tcmxdPVwiaGFzTVJMXCI+XG5cbiAgICA8IS0tIENvbHVtbiBoZWFkZXJzIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190clwiIHJvbGU9XCJyb3dcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIj5cblxuICAgICAgICA8IS0tIExlZnQgY29sdW1uIG1vdmluZyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggPD0gMFwiPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsZWZ0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctbGVmdFwiIGRyb3BwYWJsZT1cInRydWVcIiBbc3R5bGUubGVmdC5weF09XCJncmlkLnBpbm5lZFdpZHRoXCJcbiAgICAgICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIj48L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImxlZnRcIiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1waW5uZWRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW3N0eWxlLmxlZnQucHhdPVwiZ3JpZC5waW5uZWRXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFJvdyBkcmFnZ2luZyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5yb3dEcmFnZ2FibGVcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckRyYWdDb250YWluZXIgY2xhc3M9XCJpZ3gtZ3JpZF9fZHJhZy1pbmRpY2F0b3IgaWd4LWdyaWRfX3RyLWFjdGlvblwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIFtjbGFzcy5pZ3gtZ3JpZF9fZHJhZy1pbmRpY2F0b3ItLWhlYWRlcl09XCIhZ3JpZC5pc1Jvd1NlbGVjdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZC5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlIHx8IGdyaWQuZHJhZ0luZGljYXRvckljb25CYXNlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBSb3cgc2VsZWN0b3JzIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLnNob3dSb3dTZWxlY3RvcnNcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlclNlbGVjdG9yQ29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2NieC1zZWxlY3Rpb24gaWd4LWdyaWRfX3RyLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlneC1ncmlkX19jYngtc2VsZWN0aW9uLS1wdXNoXT1cImdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoZWFkZXJSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjaGVhZFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZC5oZWFkU2VsZWN0b3JUZW1wbGF0ZSB8fCBoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGU7IGNvbnRleHQ6IHJvd1NlbGVjdG9yc0NvbnRleHRcIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEhpZXJhcmNoaWNhbCBncmlkcyBleHBhbmQgYWxsIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0hpZXJhcmNoaWNhbEdyaWRcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckhpZXJhcmNoeUV4cGFuZGVyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdyaWQudG9nZ2xlQWxsKClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhZ3JpZC5oYXNFeHBhbmRhYmxlQ2hpbGRyZW4gfHwgIWdyaWQuaGFzVmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXIgaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1leHBhbmRlci0taGVhZGVyIGlneC1ncmlkX190ci1hY3Rpb24nOiBncmlkLmhhc0V4cGFuZGFibGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLXB1c2gnOiBncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1leHBhbmRlci0tbm8tYm9yZGVyJzogZ3JpZC5pc1Jvd1NlbGVjdGFibGUgfHwgZ3JpZC5yb3dEcmFnZ2FibGVcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZ3JpZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8IS0tIEdyb3VwaW5nIGljb24gdG9nZ2xlIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkPy5ncm91cGluZ0V4cHJlc3Npb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckdyb3VwQ29udGFpbmVyIGNsYXNzPVwie3sgaW5kZW50YXRpb25DU1NDbGFzc2VzIH19XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ3JpZC50b2dnbGVBbGxHcm91cFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZ3JpZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBQaW5uZWQgY29sdW1ucyBjb2xsZWN0aW9uIGZyb20gdGhlIHN0YXJ0IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggJiYgZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHwgaWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIj5cbiAgICAgICAgICAgICAgICA8L2lneC1ncmlkLWhlYWRlci1ncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFVucGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgI2hlYWRlclZpcnR1YWxDb250YWluZXIgbGV0LWNvbHVtblxuICAgICAgICAgICAgW2lneEdyaWRGb3JPZl09XCJ1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiXG4gICAgICAgICAgICBbaWd4Rm9yU2Nyb2xsQ29udGFpbmVyXT1cImdyaWQucGFyZW50VmlydERpclwiXG4gICAgICAgICAgICBbaWd4Rm9yQ29udGFpbmVyU2l6ZV09XCJncmlkLnVucGlubmVkV2lkdGhcIlxuICAgICAgICAgICAgW2lneEZvclRyYWNrQnldPVwiZ3JpZC50cmFja0NvbHVtbkNoYW5nZXNcIlxuICAgICAgICAgICAgW2lneEZvclNpemVQcm9wTmFtZV09XCInY2FsY1BpeGVsV2lkdGgnXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCInaG9yaXpvbnRhbCdcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWdyaWQtaGVhZGVyLWdyb3VwXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHxpZ3hIZWFkZXJHcm91cFN0eWxlOmNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4LWJhc2lzXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiPlxuICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPCEtLSBQaW5uZWQgY29sdW1ucyBjb2xsZWN0aW9uIGF0IHRoZSBlbmQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaW5uZWRDb2x1bW5Db2xsZWN0aW9uLmxlbmd0aCAmJiAhZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHxpZ3hIZWFkZXJHcm91cFN0eWxlOmNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4LWJhc2lzXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cImNvbHVtbi5yaWdodFBpbm5lZE9mZnNldFwiPlxuICAgICAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGaWx0ZXIgcm93IGFyZWEgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcIj5cbiAgICAgICAgPGlneC1ncmlkLWZpbHRlcmluZy1yb3cgI2ZpbHRlcmluZ1Jvd1xuICAgICAgICAgICAgW2NvbHVtbl09XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgIDwvaWd4LWdyaWQtZmlsdGVyaW5nLXJvdz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUmlnaHQgY29sdW1uIG1vdmluZyBhcmVhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLm1vdmluZyAmJiBncmlkLmNvbHVtbkluRHJhZ1wiPlxuICAgICAgICA8c3BhbiBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjwhLS0gSGVhZGVyIHRodW1iIGFyZWEgLS0+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3RodW1iXCIgW2hpZGRlbl09XCIhZ3JpZC5oYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLndpZHRoLnB4XT1cImdyaWQuc2Nyb2xsU2l6ZVwiPjwvZGl2PlxuXG48IS0tIERlZmF1bHQgcm93IHNlbGVjdGlvbiBoZWFkZXIgY2hlY2tib3ggdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2hlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZSBpZ3hIZWFkU2VsZWN0b3IgbGV0LWNvbnRleHQ+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19jYngtcGFkZGluZ1wiPlxuICAgICAgICA8aWd4LWNoZWNrYm94XG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29udGV4dC5zZWxlY3RlZENvdW50ID4gMCAmJiBncmlkLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsndmlzaWJpbGl0eSc6IGdyaWQuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQ/ICd2aXNpYmxlJyA6ICdoaWRkZW4nIH1cIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiY29udGV4dC5zZWxlY3RlZENvdW50ID4gMCAmJiBncmlkLnNlbGVjdGlvblNlcnZpY2UuaGFzU29tZVJvd1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiZ3JpZC5oZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsXCJcbiAgICAgICAgICAgICNoZWFkZXJDaGVja2JveD5cbiAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBR1QsV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUdqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7OztBQUc1RTs7Ozs7OztHQU9HO0FBTUgsTUFBTSxPQUFPLHlCQUF5QjtJQTBCbEM7OztPQUdHO0lBQ0gsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFlRDs7OztPQUlHO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsMkNBQTJDO0lB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UztzQ0FDVyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLHFCQUFxQjtpSUFPeEIsSUFBSTtzQkFEVixLQUFLO2dCQUtDLHNCQUFzQjtzQkFENUIsS0FBSztnQkFLQyx3QkFBd0I7c0JBRDlCLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQVFLLFNBQVM7c0JBRG5CLFdBQVc7dUJBQUMsNEJBQTRCO2dCQVU5QixZQUFZO3NCQUR0QixXQUFXO3VCQUFDLCtCQUErQjtnQkFnQnJDLE9BQU87c0JBRGIsWUFBWTt1QkFBQywyQkFBMkI7Z0JBd0JsQyxlQUFlO3NCQURyQixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUTNFLG1CQUFtQjtzQkFEekIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSXpCLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUI7Z0JBSTdCLG9CQUFvQjtzQkFEMUIsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBSTFCLHdCQUF3QjtzQkFEOUIsU0FBUzt1QkFBQywwQkFBMEI7Z0JBSTlCLFNBQVM7c0JBRGYsU0FBUzt1QkFBQyw0QkFBNEI7Z0JBVWhDLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uLy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyaW5nL2Jhc2UvZ3JpZC1maWx0ZXJpbmctY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXIuY29tcG9uZW50JztcblxuLyoqXG4gKlxuICogRm9yIGFsbCBpbnRlbnRzICYgcHVycG9zZXMgdHJlYXQgdGhpcyBjb21wb25lbnQgYXMgd2hhdCBhIDx0aGVhZD4gdXN1YWxseSBpcyBpbiB0aGUgZGVmYXVsdCA8dGFibGU+IGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250YWluZXIgaG9sZHMgdGhlIGdyaWQgaGVhZGVyIGVsZW1lbnRzIGFuZCB0aGVpciBiZWhhdmlvci9pbnRlcmFjdGlvbnMuXG4gKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1oZWFkZXItcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjayB7XG5cbiAgICAvKiogVGhlIGdyaWQgY29tcG9uZW50IGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyaWQ6IEdyaWRUeXBlO1xuXG4gICAgLyoqIFBpbm5lZCBjb2x1bW5zIG9mIHRoZSBncmlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBpbm5lZENvbHVtbkNvbGxlY3Rpb246IENvbHVtblR5cGVbXSA9IFtdO1xuXG4gICAgLyoqIFVucGlubmVkIGNvbHVtbnMgb2YgdGhlIGdyaWQuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uOiBDb2x1bW5UeXBlW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFjdGl2ZURlc2NlbmRhbnQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhhc01STDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHdpZHRoOiBudW1iZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkZW5zaXR5OiBEaXNwbGF5RGVuc2l0eTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoZWFkLS1jb3N5JylcbiAgICBwdWJsaWMgZ2V0IGNvc3lTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVuc2l0eSA9PT0gJ2Nvc3knO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoZWFkLS1jb21wYWN0JylcbiAgICBwdWJsaWMgZ2V0IGNvbXBhY3RTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVuc2l0eSA9PT0gJ2NvbXBhY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlYWRlciBncm91cHMgaW5zaWRlIHRoZSBoZWFkZXIgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya1xuICAgICAqIE5vdGU6IFRoZXNlIGFyZSBvbmx5IHRoZSB0b3AgbGV2ZWwgaGVhZGVyIGdyb3VwcyBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aS1jb2x1bW4gaGVhZGVyc1xuICAgICAqIG9yIGEgc3BlY2lmaWMgY29sdW1uIGxheW91dC4gSWYgeW91IHdhbnQgdG8gZ2V0IHRoZSBmbGF0dGVuZWQgY29sbGVjdGlvbiB1c2UgdGhlIGBncm91cHNgXG4gICAgICogcHJvcGVydHkgYmVsb3cuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQpXG4gICAgcHVibGljIF9ncm91cHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYXR0ZW5lZCBoZWFkZXIgZ3JvdXBzIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3JvdXBzKCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4odGhpcy5fZ3JvdXBzPy50b0FycmF5KCkgPz8gW10pO1xuICAgIH1cblxuICAgIC8qKiBIZWFkZXIgY29tcG9uZW50cyBpbiB0aGUgaGVhZGVyIHJvdy4gKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcnMoKTogSWd4R3JpZEhlYWRlckNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLm1hcChncm91cCA9PiBncm91cC5oZWFkZXIpO1xuICAgIH1cblxuICAgIC8qKiBGaWx0ZXJpbmcgY2VsbCBjb21wb25lbnRzIGluIHRoZSBoZWFkZXIgcm93LiAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLm1hcChncm91cCA9PiBncm91cC5maWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgdmlydHVhbGl6ZWQgcGFydCBvZiB0aGUgaGVhZGVyIHJvdyBjb250YWluaW5nIHRoZSB1bnBpbm5lZCBoZWFkZXIgZ3JvdXBzLiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclZpcnR1YWxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlckNvbnRhaW5lcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudD47XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckZvck9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyRHJhZ0NvbnRhaW5lcicpXG4gICAgcHVibGljIGhlYWRlckRyYWdDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyU2VsZWN0b3JDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJTZWxlY3RvckNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJHcm91cENvbnRhaW5lcicpXG4gICAgcHVibGljIGhlYWRlckdyb3VwQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZScpXG4gICAgcHVibGljIGhlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0PjtcblxuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudClcbiAgICBwdWJsaWMgZmlsdGVyUm93OiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogRXhwYW5kL2NvbGxhcHNlIGFsbCBjaGlsZCBncmlkcyBhcmVhIGluIGEgaGllcmFyY2hpY2FsIGdyaWQuXG4gICAgICogYHVuZGVmaW5lZGAgaW4gdGhlIGJhc2UgYW5kIHRyZWUgZ3JpZHMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckhpZXJhcmNoeUV4cGFuZGVyJylcbiAgICBwdWJsaWMgaGVhZGVySGllcmFyY2h5RXhwYW5kZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHVibGljIGdldCBuYXZpZ2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLm5hdmlnYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgZ3JpZCBpbnN0YW5jZSBpcyBhIGhpZXJhcmNoaWNhbCBncmlkLlxuICAgICAqIGFzIG9ubHkgaGllcmFyY2hpY2FsIGdyaWRzIGhhdmUgdGhlIGBpc0hpZXJhcmNoaWNhbFJlY29yZGAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzSGllcmFyY2hpY2FsR3JpZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5ncmlkLmlzSGllcmFyY2hpY2FsUmVjb3JkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW5kZW50YXRpb25DU1NDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gYGlneC1ncmlkX19oZWFkZXItaW5kZW50YXRpb24gaWd4LWdyaWRfX3Jvdy1pbmRlbnRhdGlvbi0tbGV2ZWwtJHt0aGlzLmdyaWQuZ3JvdXBpbmdFeHByZXNzaW9ucy5sZW5ndGh9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yc0NvbnRleHQoKTogSWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0IHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb3VudDogdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuZmlsdGVyZWRTZWxlY3RlZFJvd0lkcy5sZW5ndGggYXMgbnVtYmVyLFxuICAgICAgICAgICAgICAgIHRvdGFsQ291bnQ6IHRoaXMuZ3JpZC50b3RhbFJvd3NDb3VudEFmdGVyRmlsdGVyIGFzIG51bWJlclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dDtcblxuICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbEdyaWQpIHtcbiAgICAgICAgICAgIGN0eC4kaW1wbGljaXQuc2VsZWN0QWxsID0gKCkgPT4gdGhpcy5ncmlkLnNlbGVjdEFsbFJvd3MoKTtcbiAgICAgICAgICAgIGN0eC4kaW1wbGljaXQuZGVzZWxlY3RBbGwgPSAoKSA9PiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3R4O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHsgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBob29rIGV4aXN0cyBhcyBhIHdvcmthcm91bmQgZm9yIHRoZSB1bmZvcnR1bmF0ZSBmYWN0XG4gICAgICogdGhhdCB3aGVuIHdlIGhhdmUgcGlubmVkIGNvbHVtbnMgaW4gdGhlIGdyaWQsIHRoZSB1bnBpbm5lZCBjb2x1bW5zIGhlYWRlcnNcbiAgICAgKiBhcmUgYWZmZWN0ZWQgYnkgYSBkZWxheWVkIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgYWZ0ZXIgYSBob3Jpem9udGFsIHNjcm9sbCA6KFxuICAgICAqIFRodXMsIHdlIHRlbGwgdGhlIHBhcmVudCBncmlkIGNoYW5nZSBkZXRlY3RvciB0byBjaGVjayB1cyBhdCBlYWNoIGN5Y2xlLlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZ3JpZC5wcmV2ZW50SGVhZGVyU2Nyb2xsKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVhZGVyUm93U2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJSb3dTZWxlY3Rpb24oZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsUm93cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IHJvbGU9XCJyb3dncm91cFwiIGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3dyYXBwZXJcIiAoc2Nyb2xsKT1cInNjcm9sbCgkZXZlbnQpXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICBbY2xhc3MuaWd4LWdyaWRfX3RyLS1tcmxdPVwiaGFzTVJMXCI+XG5cbiAgICA8IS0tIENvbHVtbiBoZWFkZXJzIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190clwiIHJvbGU9XCJyb3dcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIj5cblxuICAgICAgICA8IS0tIExlZnQgY29sdW1uIG1vdmluZyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggPD0gMFwiPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsZWZ0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctbGVmdFwiIGRyb3BwYWJsZT1cInRydWVcIiBbc3R5bGUubGVmdC5weF09XCJncmlkLnBpbm5lZFdpZHRoXCJcbiAgICAgICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIj48L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImxlZnRcIiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1waW5uZWRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW3N0eWxlLmxlZnQucHhdPVwiZ3JpZC5waW5uZWRXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFJvdyBkcmFnZ2luZyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5yb3dEcmFnZ2FibGVcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckRyYWdDb250YWluZXIgY2xhc3M9XCJpZ3gtZ3JpZF9fZHJhZy1pbmRpY2F0b3IgaWd4LWdyaWRfX3RyLWFjdGlvblwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIFtjbGFzcy5pZ3gtZ3JpZF9fZHJhZy1pbmRpY2F0b3ItLWhlYWRlcl09XCIhZ3JpZC5pc1Jvd1NlbGVjdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZC5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlIHx8IGdyaWQuZHJhZ0luZGljYXRvckljb25CYXNlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBSb3cgc2VsZWN0b3JzIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLnNob3dSb3dTZWxlY3RvcnNcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlclNlbGVjdG9yQ29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2NieC1zZWxlY3Rpb24gaWd4LWdyaWRfX3RyLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlneC1ncmlkX19jYngtc2VsZWN0aW9uLS1wdXNoXT1cImdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoZWFkZXJSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjaGVhZFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZC5oZWFkU2VsZWN0b3JUZW1wbGF0ZSB8fCBoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGU7IGNvbnRleHQ6IHJvd1NlbGVjdG9yc0NvbnRleHRcIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEhpZXJhcmNoaWNhbCBncmlkcyBleHBhbmQgYWxsIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0hpZXJhcmNoaWNhbEdyaWRcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckhpZXJhcmNoeUV4cGFuZGVyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdyaWQudG9nZ2xlQWxsKClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhZ3JpZC5oYXNFeHBhbmRhYmxlQ2hpbGRyZW4gfHwgIWdyaWQuaGFzVmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXIgaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1leHBhbmRlci0taGVhZGVyIGlneC1ncmlkX190ci1hY3Rpb24nOiBncmlkLmhhc0V4cGFuZGFibGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLXB1c2gnOiBncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1leHBhbmRlci0tbm8tYm9yZGVyJzogZ3JpZC5pc1Jvd1NlbGVjdGFibGUgfHwgZ3JpZC5yb3dEcmFnZ2FibGVcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZ3JpZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8IS0tIEdyb3VwaW5nIGljb24gdG9nZ2xlIGFyZWEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkPy5ncm91cGluZ0V4cHJlc3Npb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgI2hlYWRlckdyb3VwQ29udGFpbmVyIGNsYXNzPVwie3sgaW5kZW50YXRpb25DU1NDbGFzc2VzIH19XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ3JpZC50b2dnbGVBbGxHcm91cFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZ3JpZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBQaW5uZWQgY29sdW1ucyBjb2xsZWN0aW9uIGZyb20gdGhlIHN0YXJ0IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggJiYgZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHwgaWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIj5cbiAgICAgICAgICAgICAgICA8L2lneC1ncmlkLWhlYWRlci1ncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFVucGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgI2hlYWRlclZpcnR1YWxDb250YWluZXIgbGV0LWNvbHVtblxuICAgICAgICAgICAgW2lneEdyaWRGb3JPZl09XCJ1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiXG4gICAgICAgICAgICBbaWd4Rm9yU2Nyb2xsQ29udGFpbmVyXT1cImdyaWQucGFyZW50VmlydERpclwiXG4gICAgICAgICAgICBbaWd4Rm9yQ29udGFpbmVyU2l6ZV09XCJncmlkLnVucGlubmVkV2lkdGhcIlxuICAgICAgICAgICAgW2lneEZvclRyYWNrQnldPVwiZ3JpZC50cmFja0NvbHVtbkNoYW5nZXNcIlxuICAgICAgICAgICAgW2lneEZvclNpemVQcm9wTmFtZV09XCInY2FsY1BpeGVsV2lkdGgnXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCInaG9yaXpvbnRhbCdcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWdyaWQtaGVhZGVyLWdyb3VwXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHxpZ3hIZWFkZXJHcm91cFN0eWxlOmNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4LWJhc2lzXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiPlxuICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPCEtLSBQaW5uZWQgY29sdW1ucyBjb2xsZWN0aW9uIGF0IHRoZSBlbmQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaW5uZWRDb2x1bW5Db2xsZWN0aW9uLmxlbmd0aCAmJiAhZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgcGlubmVkQ29sdW1uQ29sbGVjdGlvbiB8IGlneFRvcExldmVsXCI+XG4gICAgICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlckdyb3VwU3R5bGVzIHxpZ3hIZWFkZXJHcm91cFN0eWxlOmNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4LWJhc2lzXT1cImNvbHVtbi5yZXNvbHZlZFdpZHRoIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cImNvbHVtbi5yaWdodFBpbm5lZE9mZnNldFwiPlxuICAgICAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGaWx0ZXIgcm93IGFyZWEgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcIj5cbiAgICAgICAgPGlneC1ncmlkLWZpbHRlcmluZy1yb3cgI2ZpbHRlcmluZ1Jvd1xuICAgICAgICAgICAgW2NvbHVtbl09XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgIDwvaWd4LWdyaWQtZmlsdGVyaW5nLXJvdz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUmlnaHQgY29sdW1uIG1vdmluZyBhcmVhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLm1vdmluZyAmJiBncmlkLmNvbHVtbkluRHJhZ1wiPlxuICAgICAgICA8c3BhbiBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjwhLS0gSGVhZGVyIHRodW1iIGFyZWEgLS0+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3RodW1iXCIgW2hpZGRlbl09XCIhZ3JpZC5oYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLndpZHRoLnB4XT1cImdyaWQuc2Nyb2xsU2l6ZVwiPjwvZGl2PlxuXG48IS0tIERlZmF1bHQgcm93IHNlbGVjdGlvbiBoZWFkZXIgY2hlY2tib3ggdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2hlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZSBpZ3hIZWFkU2VsZWN0b3IgbGV0LWNvbnRleHQ+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19jYngtcGFkZGluZ1wiPlxuICAgICAgICA8aWd4LWNoZWNrYm94XG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29udGV4dC5zZWxlY3RlZENvdW50ID4gMCAmJiBncmlkLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsndmlzaWJpbGl0eSc6IGdyaWQuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQ/ICd2aXNpYmxlJyA6ICdoaWRkZW4nIH1cIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiY29udGV4dC5zZWxlY3RlZENvdW50ID4gMCAmJiBncmlkLnNlbGVjdGlvblNlcnZpY2UuaGFzU29tZVJvd1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiZ3JpZC5oZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsXCJcbiAgICAgICAgICAgICNoZWFkZXJDaGVja2JveD5cbiAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|