ngx-easy-table
Version:
Angular easy table
147 lines • 47.4 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
import { Event } from '../..';
import { StyleService } from '../../services/style.service';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import * as i0 from "@angular/core";
import * as i1 from "../../services/style.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/drag-drop";
import * as i4 from "../header/header.component";
export class TableTHeadComponent {
onClick(targetElement) {
if (this.additionalActionMenu &&
!this.additionalActionMenu.nativeElement.contains(targetElement)) {
this.menuActive = false;
}
// if click outside the header then close opened Header Action Template
if (this.openedHeaderActionTemplate &&
// if no header have the clicked point
!this.headerDropdown.toArray().some((ref) => ref.nativeElement.contains(targetElement))) {
this.openedHeaderActionTemplate = null;
}
}
constructor(styleService) {
this.styleService = styleService;
this.menuActive = false;
this.openedHeaderActionTemplate = null;
this.onSelectAllBinded = this.onSelectAll.bind(this);
this.filter = new EventEmitter();
this.order = new EventEmitter();
this.selectAll = new EventEmitter();
this.event = new EventEmitter();
}
getColumnDefinition(column) {
return column.searchEnabled || typeof column.searchEnabled === 'undefined';
}
orderBy(column) {
this.order.emit(column);
}
isOrderEnabled(column) {
const columnOrderEnabled = column.orderEnabled === undefined ? true : !!column.orderEnabled;
return this.config.orderEnabled && columnOrderEnabled;
}
columnDrop(event) {
moveItemInArray(this.columns, event.previousIndex, event.currentIndex);
}
onSearch($event) {
this.filter.emit($event);
}
getColumnWidth(column) {
if (column.width) {
return column.width;
}
return this.config.fixedColumnWidth ? 100 / this.columns.length + '%' : null;
}
onSelectAll() {
this.selectAll.emit();
}
onMouseDown(event, th) {
if (!this.config.resizeColumn) {
return;
}
this.th = th;
this.startOffset = th.offsetWidth - event.pageX;
this.event.emit({
event: Event.onColumnResizeMouseDown,
value: event,
});
}
onMouseMove(event) {
if (!this.config.resizeColumn) {
return;
}
if (this.th && this.th.style) {
this.th.style.width = this.startOffset + event.pageX + 'px';
this.th.style.cursor = 'col-resize';
this.th.style['user-select'] = 'none';
}
}
onMouseUp(event) {
if (!this.config.resizeColumn) {
return;
}
this.event.emit({
event: Event.onColumnResizeMouseUp,
value: event,
});
this.th.style.cursor = 'default';
this.th = undefined;
}
showHeaderActionTemplateMenu(column) {
if (!column.headerActionTemplate) {
console.error('Column [headerActionTemplate] property not defined');
}
if (this.openedHeaderActionTemplate === column.key) {
this.openedHeaderActionTemplate = null;
return;
}
this.openedHeaderActionTemplate = column.key;
}
showMenu() {
if (!this.additionalActionsTemplate) {
console.error('[additionalActionsTemplate] property not defined');
}
this.menuActive = !this.menuActive;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TableTHeadComponent, deps: [{ token: i1.StyleService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: TableTHeadComponent, selector: "[table-thead]", inputs: { config: "config", columns: "columns", sortKey: "sortKey", sortState: "sortState", selectAllTemplate: "selectAllTemplate", filtersTemplate: "filtersTemplate", additionalActionsTemplate: "additionalActionsTemplate" }, outputs: { filter: "filter", order: "order", selectAll: "selectAll", event: "event" }, host: { listeners: { "document:click": "onClick($event.target)" } }, providers: [StyleService], viewQueries: [{ propertyName: "th", first: true, predicate: ["th"], descendants: true }, { propertyName: "additionalActionMenu", first: true, predicate: ["additionalActionMenu"], descendants: true }, { propertyName: "headerDropdown", predicate: ["headerDropdown"], descendants: true }], ngImport: i0, template: "<tr class=\"ngx-table__header\" *ngIf=\"config.headerEnabled && !config.columnReorder\">\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n >\n </ng-container>\n <label\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\n >\n <input type=\"checkbox\" id=\"selectAllCheckboxes\" (change)=\"onSelectAll()\" />\n <em class=\"ngx-form-icon\" id=\"selectAllCheckbox\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th\n class=\"ngx-table__header-cell\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\"\n >\n <div\n (click)=\"orderBy(column)\"\n style=\"display: inline\"\n [class.pointer]=\"isOrderEnabled(column)\"\n >\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\"\n >\n </em>\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\"\n >\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div\n class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\"\n >\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th\n *ngIf=\"\n config.additionalActions ||\n config.detailsTemplate ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\"\n >\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\n >\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr\n class=\"ngx-table__header ngx-table__header--draggable\"\n *ngIf=\"config.headerEnabled && config.columnReorder\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"columnDrop($event)\"\n>\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n >\n </ng-container>\n <label\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\n >\n <input type=\"checkbox\" id=\"selectAllCheckboxesDrag\" (change)=\"onSelectAll()\" />\n <em class=\"ngx-form-icon\" id=\"selectAllCheckboxDrag\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\"\n cdkDragLockAxis=\"x\"\n cdkDrag\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\"\n >\n <div\n (click)=\"orderBy(column)\"\n style=\"display: inline\"\n cdkDragHandle\n [class.pointer]=\"isOrderEnabled(column)\"\n >\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\"\n >\n </em>\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\"\n >\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div\n class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\"\n >\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th\n *ngIf=\"\n config.additionalActions ||\n config.detailsTemplate ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\"\n >\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\n >\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr\n [style.display]=\"config.searchEnabled && !filtersTemplate ? 'table-row' : 'none'\"\n class=\"ngx-table__search-header\"\n>\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\n <th\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [class.pinned-left]=\"column.pinned\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n >\n <table-header\n *ngIf=\"getColumnDefinition(column)\"\n (update)=\"onSearch($event)\"\n [column]=\"column\"\n >\n </table-header>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || config.detailsTemplate\"></th>\n</tr>\n<ng-container *ngIf=\"filtersTemplate\">\n <tr>\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"> </ng-container>\n </tr>\n</ng-container>\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i4.HeaderComponent, selector: "table-header", inputs: ["column"], outputs: ["update"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TableTHeadComponent, decorators: [{
type: Component,
args: [{ selector: '[table-thead]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [StyleService], template: "<tr class=\"ngx-table__header\" *ngIf=\"config.headerEnabled && !config.columnReorder\">\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n >\n </ng-container>\n <label\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\n >\n <input type=\"checkbox\" id=\"selectAllCheckboxes\" (change)=\"onSelectAll()\" />\n <em class=\"ngx-form-icon\" id=\"selectAllCheckbox\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th\n class=\"ngx-table__header-cell\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\"\n >\n <div\n (click)=\"orderBy(column)\"\n style=\"display: inline\"\n [class.pointer]=\"isOrderEnabled(column)\"\n >\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\"\n >\n </em>\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\"\n >\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div\n class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\"\n >\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th\n *ngIf=\"\n config.additionalActions ||\n config.detailsTemplate ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\"\n >\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\n >\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr\n class=\"ngx-table__header ngx-table__header--draggable\"\n *ngIf=\"config.headerEnabled && config.columnReorder\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"columnDrop($event)\"\n>\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n >\n </ng-container>\n <label\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\n >\n <input type=\"checkbox\" id=\"selectAllCheckboxesDrag\" (change)=\"onSelectAll()\" />\n <em class=\"ngx-form-icon\" id=\"selectAllCheckboxDrag\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\"\n cdkDragLockAxis=\"x\"\n cdkDrag\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\"\n >\n <div\n (click)=\"orderBy(column)\"\n style=\"display: inline\"\n cdkDragHandle\n [class.pointer]=\"isOrderEnabled(column)\"\n >\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\"\n >\n </em>\n <em\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\"\n >\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div\n class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\"\n >\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th\n *ngIf=\"\n config.additionalActions ||\n config.detailsTemplate ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\"\n >\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\n >\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr\n [style.display]=\"config.searchEnabled && !filtersTemplate ? 'table-row' : 'none'\"\n class=\"ngx-table__search-header\"\n>\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\n <th\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [class.pinned-left]=\"column.pinned\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n >\n <table-header\n *ngIf=\"getColumnDefinition(column)\"\n (update)=\"onSearch($event)\"\n [column]=\"column\"\n >\n </table-header>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || config.detailsTemplate\"></th>\n</tr>\n<ng-container *ngIf=\"filtersTemplate\">\n <tr>\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"> </ng-container>\n </tr>\n</ng-container>\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"] }]
}], ctorParameters: () => [{ type: i1.StyleService }], propDecorators: { config: [{
type: Input
}], columns: [{
type: Input
}], sortKey: [{
type: Input
}], sortState: [{
type: Input
}], selectAllTemplate: [{
type: Input
}], filtersTemplate: [{
type: Input
}], additionalActionsTemplate: [{
type: Input
}], filter: [{
type: Output
}], order: [{
type: Output
}], selectAll: [{
type: Output
}], event: [{
type: Output
}], th: [{
type: ViewChild,
args: ['th']
}], headerDropdown: [{
type: ViewChildren,
args: ['headerDropdown']
}], additionalActionMenu: [{
type: ViewChild,
args: ['additionalActionMenu']
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVhc3ktdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RoZWFkL3RoZWFkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy90aGVhZC90aGVhZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFtQnRFLE1BQU0sT0FBTyxtQkFBbUI7SUFxQnZCLE9BQU8sQ0FBQyxhQUFrQjtRQUMvQixJQUNFLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDaEUsQ0FBQztZQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsSUFDRSxJQUFJLENBQUMsMEJBQTBCO1lBQy9CLHNDQUFzQztZQUN0QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUN2RixDQUFDO1lBQ0QsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQTRCLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBdEMvQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLCtCQUEwQixHQUFrQixJQUFJLENBQUM7UUFFakQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFTcEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUF5QyxDQUFDO1FBQ25FLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBaUMsQ0FBQztJQXVCcEIsQ0FBQztJQUUxRCxtQkFBbUIsQ0FBQyxNQUFlO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLGFBQWEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDO0lBQzdFLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBZTtRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWU7UUFDNUIsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUM1RixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLGtCQUFrQixDQUFDO0lBQ3hELENBQUM7SUFFRCxVQUFVLENBQUMsS0FBNEI7UUFDckMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUE2QztRQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQVc7UUFDeEIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQixFQUFFLEVBQThCO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsdUJBQXVCO1lBQ3BDLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzVELElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7WUFDcEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLHFCQUFxQjtZQUNsQyxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFDdEIsQ0FBQztJQUVELDRCQUE0QixDQUFDLE1BQWU7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7K0dBNUhVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHNhQUZuQixDQUFDLFlBQVksQ0FBQyx5VEM5QjNCLG85UEFvTkE7OzRGRHBMYSxtQkFBbUI7a0JBakIvQixTQUFTOytCQUNFLGVBQWUsbUJBYVIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLFlBQVksQ0FBQztpRkFRaEIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ2EsTUFBTTtzQkFBeEIsTUFBTTtnQkFDWSxLQUFLO3NCQUF2QixNQUFNO2dCQUNZLFNBQVM7c0JBQTNCLE1BQU07Z0JBQ1ksS0FBSztzQkFBdkIsTUFBTTtnQkFDa0IsRUFBRTtzQkFBMUIsU0FBUzt1QkFBQyxJQUFJO2dCQUNpQixjQUFjO3NCQUE3QyxZQUFZO3VCQUFDLGdCQUFnQjtnQkFDSyxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUUxQixPQUFPO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbnMsIENvbmZpZywgRXZlbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdHlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3RhYmxlLXRoZWFkXScsXG4gIHRlbXBsYXRlVXJsOiAnLi90aGVhZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5jZGstZHJhZy1wcmV2aWV3IHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgcGFkZGluZy10b3A6IDlweDtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICAgIGNvbG9yOiAjNTA1OTZjO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlOWVkO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtTdHlsZVNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVRIZWFkQ29tcG9uZW50IHtcbiAgcHVibGljIG1lbnVBY3RpdmUgPSBmYWxzZTtcbiAgcHVibGljIG9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHN0YXJ0T2Zmc2V0O1xuICBwdWJsaWMgb25TZWxlY3RBbGxCaW5kZWQgPSB0aGlzLm9uU2VsZWN0QWxsLmJpbmQodGhpcyk7XG5cbiAgQElucHV0KCkgY29uZmlnOiBDb25maWc7XG4gIEBJbnB1dCgpIGNvbHVtbnM6IENvbHVtbnNbXTtcbiAgQElucHV0KCkgc29ydEtleTtcbiAgQElucHV0KCkgc29ydFN0YXRlO1xuICBASW5wdXQoKSBzZWxlY3RBbGxUZW1wbGF0ZTtcbiAgQElucHV0KCkgZmlsdGVyc1RlbXBsYXRlO1xuICBASW5wdXQoKSBhZGRpdGlvbmFsQWN0aW9uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9Pj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9yZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5zPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0QWxsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IHN0cmluZzsgdmFsdWU6IGFueSB9PigpO1xuICBAVmlld0NoaWxkKCd0aCcpIHByaXZhdGUgdGg7XG4gIEBWaWV3Q2hpbGRyZW4oJ2hlYWRlckRyb3Bkb3duJykgaGVhZGVyRHJvcGRvd247XG4gIEBWaWV3Q2hpbGQoJ2FkZGl0aW9uYWxBY3Rpb25NZW51JykgYWRkaXRpb25hbEFjdGlvbk1lbnU7XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gIHB1YmxpYyBvbkNsaWNrKHRhcmdldEVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuYWRkaXRpb25hbEFjdGlvbk1lbnUgJiZcbiAgICAgICF0aGlzLmFkZGl0aW9uYWxBY3Rpb25NZW51Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMubWVudUFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIGNsaWNrIG91dHNpZGUgdGhlIGhlYWRlciB0aGVuIGNsb3NlIG9wZW5lZCBIZWFkZXIgQWN0aW9uIFRlbXBsYXRlXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSAmJlxuICAgICAgLy8gaWYgbm8gaGVhZGVyIGhhdmUgdGhlIGNsaWNrZWQgcG9pbnRcbiAgICAgICF0aGlzLmhlYWRlckRyb3Bkb3duLnRvQXJyYXkoKS5zb21lKChyZWYpID0+IHJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldEVsZW1lbnQpKVxuICAgICkge1xuICAgICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0eWxlU2VydmljZTogU3R5bGVTZXJ2aWNlKSB7fVxuXG4gIGdldENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBDb2x1bW5zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi5zZWFyY2hFbmFibGVkIHx8IHR5cGVvZiBjb2x1bW4uc2VhcmNoRW5hYmxlZCA9PT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBvcmRlckJ5KGNvbHVtbjogQ29sdW1ucyk6IHZvaWQge1xuICAgIHRoaXMub3JkZXIuZW1pdChjb2x1bW4pO1xuICB9XG5cbiAgaXNPcmRlckVuYWJsZWQoY29sdW1uOiBDb2x1bW5zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1uT3JkZXJFbmFibGVkID0gY29sdW1uLm9yZGVyRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhY29sdW1uLm9yZGVyRW5hYmxlZDtcbiAgICByZXR1cm4gdGhpcy5jb25maWcub3JkZXJFbmFibGVkICYmIGNvbHVtbk9yZGVyRW5hYmxlZDtcbiAgfVxuXG4gIGNvbHVtbkRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPik6IHZvaWQge1xuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNvbHVtbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICBvblNlYXJjaCgkZXZlbnQ6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlci5lbWl0KCRldmVudCk7XG4gIH1cblxuICBnZXRDb2x1bW5XaWR0aChjb2x1bW46IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChjb2x1bW4ud2lkdGgpIHtcbiAgICAgIHJldHVybiBjb2x1bW4ud2lkdGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5maXhlZENvbHVtbldpZHRoID8gMTAwIC8gdGhpcy5jb2x1bW5zLmxlbmd0aCArICclJyA6IG51bGw7XG4gIH1cblxuICBvblNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdEFsbC5lbWl0KCk7XG4gIH1cblxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgdGg6IEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5yZXNpemVDb2x1bW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50aCA9IHRoO1xuICAgIHRoaXMuc3RhcnRPZmZzZXQgPSB0aC5vZmZzZXRXaWR0aCAtIGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMuZXZlbnQuZW1pdCh7XG4gICAgICBldmVudDogRXZlbnQub25Db2x1bW5SZXNpemVNb3VzZURvd24sXG4gICAgICB2YWx1ZTogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcucmVzaXplQ29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnRoICYmIHRoaXMudGguc3R5bGUpIHtcbiAgICAgIHRoaXMudGguc3R5bGUud2lkdGggPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgZXZlbnQucGFnZVggKyAncHgnO1xuICAgICAgdGhpcy50aC5zdHlsZS5jdXJzb3IgPSAnY29sLXJlc2l6ZSc7XG4gICAgICB0aGlzLnRoLnN0eWxlWyd1c2VyLXNlbGVjdCddID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcucmVzaXplQ29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnQuZW1pdCh7XG4gICAgICBldmVudDogRXZlbnQub25Db2x1bW5SZXNpemVNb3VzZVVwLFxuICAgICAgdmFsdWU6IGV2ZW50LFxuICAgIH0pO1xuICAgIHRoaXMudGguc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICAgIHRoaXMudGggPSB1bmRlZmluZWQ7XG4gIH1cblxuICBzaG93SGVhZGVyQWN0aW9uVGVtcGxhdGVNZW51KGNvbHVtbjogQ29sdW1ucyk6IHZvaWQge1xuICAgIGlmICghY29sdW1uLmhlYWRlckFjdGlvblRlbXBsYXRlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb2x1bW4gW2hlYWRlckFjdGlvblRlbXBsYXRlXSBwcm9wZXJ0eSBub3QgZGVmaW5lZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9PT0gY29sdW1uLmtleSkge1xuICAgICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgPSBjb2x1bW4ua2V5O1xuICB9XG5cbiAgc2hvd01lbnUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1thZGRpdGlvbmFsQWN0aW9uc1RlbXBsYXRlXSBwcm9wZXJ0eSBub3QgZGVmaW5lZCcpO1xuICAgIH1cbiAgICB0aGlzLm1lbnVBY3RpdmUgPSAhdGhpcy5tZW51QWN0aXZlO1xuICB9XG59XG4iLCI8dHIgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlclwiICpuZ0lmPVwiY29uZmlnLmhlYWRlckVuYWJsZWQgJiYgIWNvbmZpZy5jb2x1bW5SZW9yZGVyXCI+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5jaGVja2JveGVzIHx8IGNvbmZpZy5yYWRpb1wiIFtzdHlsZS53aWR0aF09XCInMyUnXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RBbGxUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9uU2VsZWN0QWxsQmluZGVkIH1cIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwibmd4LWZvcm0tY2hlY2tib3hcIlxuICAgICAgZm9yPVwic2VsZWN0QWxsQ2hlY2tib3hlc1wiXG4gICAgICAqbmdJZj1cIiFzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXG4gICAgPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VsZWN0QWxsQ2hlY2tib3hlc1wiIChjaGFuZ2UpPVwib25TZWxlY3RBbGwoKVwiIC8+XG4gICAgICA8ZW0gY2xhc3M9XCJuZ3gtZm9ybS1pY29uXCIgaWQ9XCJzZWxlY3RBbGxDaGVja2JveFwiPjwvZW0+XG4gICAgPC9sYWJlbD5cbiAgPC90aD5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICA8dGhcbiAgICAgIGNsYXNzPVwibmd4LXRhYmxlX19oZWFkZXItY2VsbFwiXG4gICAgICBbY2xhc3MucGlubmVkLWxlZnRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICBbbmdDbGFzc109XCJjb2x1bW4uY3NzQ2xhc3MgJiYgY29sdW1uLmNzc0NsYXNzLmluY2x1ZGVIZWFkZXIgPyBjb2x1bW4uY3NzQ2xhc3MubmFtZSA6ICcnXCJcbiAgICAgIFtzdHlsZS5sZWZ0XT1cInN0eWxlU2VydmljZS5waW5uZWRXaWR0aChjb2x1bW4ucGlubmVkLCBjb2xJbmRleClcIlxuICAgICAgI3RoXG4gICAgICBbc3R5bGUud2lkdGhdPVwiZ2V0Q29sdW1uV2lkdGgoY29sdW1uKVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudCwgdGgpXCJcbiAgICAgIChtb3VzZXVwKT1cIm9uTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAoY2xpY2spPVwib3JkZXJCeShjb2x1bW4pXCJcbiAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmVcIlxuICAgICAgICBbY2xhc3MucG9pbnRlcl09XCJpc09yZGVyRW5hYmxlZChjb2x1bW4pXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19PHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgIDxlbSBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLXBpblwiICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiPjwvZW0+XG4gICAgICAgICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJjb25maWcub3JkZXJFbmFibGVkID8gJ2lubGluZScgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tYXJyb3ctdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLWFycm93LWRvd25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIiAqbmdJZj1cIiEhY29sdW1uLmhlYWRlckFjdGlvblRlbXBsYXRlXCIgI2hlYWRlckRyb3Bkb3duPlxuICAgICAgICA8YSBjbGFzcz1cIm5neC1idG4gbmd4LWJ0bi1saW5rXCIgKGNsaWNrKT1cInNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tbW9yZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIlxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gb3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyQWN0aW9uVGVtcGxhdGVcIj4gPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXRhYmxlX19jb2x1bW4tcmVzaXplclwiICpuZ0lmPVwiY29uZmlnLnJlc2l6ZUNvbHVtbiAmJiAhbGFzdFwiPjwvZGl2PlxuICAgIDwvdGg+XG4gIDwvbmctY29udGFpbmVyPlxuICA8dGhcbiAgICAqbmdJZj1cIlxuICAgICAgY29uZmlnLmFkZGl0aW9uYWxBY3Rpb25zIHx8XG4gICAgICBjb25maWcuZGV0YWlsc1RlbXBsYXRlIHx8XG4gICAgICBjb25maWcuY29sbGFwc2VBbGxSb3dzIHx8XG4gICAgICBjb25maWcuZ3JvdXBSb3dzXG4gICAgXCJcbiAgICBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLWNlbGwtYWRkaXRpb25hbC1hY3Rpb25zXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIiAjYWRkaXRpb25hbEFjdGlvbk1lbnUgKm5nSWY9XCJjb25maWcuYWRkaXRpb25hbEFjdGlvbnNcIj5cbiAgICAgIDxhIGNsYXNzPVwibmd4LWJ0biBuZ3gtYnRuLWxpbmtcIiAoY2xpY2spPVwic2hvd01lbnUoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLW1lbnVcIj48L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8dWwgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIiAqbmdJZj1cIm1lbnVBY3RpdmVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3RoPlxuPC90cj5cbjx0clxuICBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyIG5neC10YWJsZV9faGVhZGVyLS1kcmFnZ2FibGVcIlxuICAqbmdJZj1cImNvbmZpZy5oZWFkZXJFbmFibGVkICYmIGNvbmZpZy5jb2x1bW5SZW9yZGVyXCJcbiAgY2RrRHJvcExpc3RcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImNvbHVtbkRyb3AoJGV2ZW50KVwiXG4+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5jaGVja2JveGVzIHx8IGNvbmZpZy5yYWRpb1wiIFtzdHlsZS53aWR0aF09XCInMyUnXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RBbGxUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9uU2VsZWN0QWxsQmluZGVkIH1cIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwibmd4LWZvcm0tY2hlY2tib3hcIlxuICAgICAgZm9yPVwic2VsZWN0QWxsQ2hlY2tib3hlc1wiXG4gICAgICAqbmdJZj1cIiFzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXG4gICAgPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VsZWN0QWxsQ2hlY2tib3hlc0RyYWdcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsKClcIiAvPlxuICAgICAgPGVtIGNsYXNzPVwibmd4LWZvcm0taWNvblwiIGlkPVwic2VsZWN0QWxsQ2hlY2tib3hEcmFnXCI+PC9lbT5cbiAgICA8L2xhYmVsPlxuICA8L3RoPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgIDx0aFxuICAgICAgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlci1jZWxsIG5neC10YWJsZV9faGVhZGVyLWNlbGwtLWRyYWdnYWJsZVwiXG4gICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgIGNka0RyYWdcbiAgICAgIFtjZGtEcmFnU3RhcnREZWxheV09XCJjb25maWcucmVvcmRlckRlbGF5IHx8IDBcIlxuICAgICAgW2NsYXNzLnBpbm5lZC1sZWZ0XT1cImNvbHVtbi5waW5uZWRcIlxuICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNzc0NsYXNzICYmIGNvbHVtbi5jc3NDbGFzcy5pbmNsdWRlSGVhZGVyID8gY29sdW1uLmNzc0NsYXNzLm5hbWUgOiAnJ1wiXG4gICAgICBbc3R5bGUubGVmdF09XCJzdHlsZVNlcnZpY2UucGlubmVkV2lkdGgoY29sdW1uLnBpbm5lZCwgY29sSW5kZXgpXCJcbiAgICAgICN0aFxuICAgICAgW3N0eWxlLndpZHRoXT1cImdldENvbHVtbldpZHRoKGNvbHVtbilcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQsIHRoKVwiXG4gICAgICAobW91c2V1cCk9XCJvbk1vdXNlVXAoJGV2ZW50KVwiXG4gICAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKGNsaWNrKT1cIm9yZGVyQnkoY29sdW1uKVwiXG4gICAgICAgIHN0eWxlPVwiZGlzcGxheTogaW5saW5lXCJcbiAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICBbY2xhc3MucG9pbnRlcl09XCJpc09yZGVyRW5hYmxlZChjb2x1bW4pXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19PHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgIDxlbSBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLXBpblwiICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiPjwvZW0+XG4gICAgICAgICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJjb25maWcub3JkZXJFbmFibGVkID8gJ2lubGluZScgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tYXJyb3ctdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLWFycm93LWRvd25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIiAqbmdJZj1cIiEhY29sdW1uLmhlYWRlckFjdGlvblRlbXBsYXRlXCIgI2hlYWRlckRyb3Bkb3duPlxuICAgICAgICA8YSBjbGFzcz1cIm5neC1idG4gbmd4LWJ0bi1saW5rXCIgKGNsaWNrKT1cInNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tbW9yZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIlxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gb3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyQWN0aW9uVGVtcGxhdGVcIj4gPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXRhYmxlX19jb2x1bW4tcmVzaXplclwiICpuZ0lmPVwiY29uZmlnLnJlc2l6ZUNvbHVtbiAmJiAhbGFzdFwiPjwvZGl2PlxuICAgIDwvdGg+XG4gIDwvbmctY29udGFpbmVyPlxuICA8dGhcbiAgICAqbmdJZj1cIlxuICAgICAgY29uZmlnLmFkZGl0aW9uYWxBY3Rpb25zIHx8XG4gICAgICBjb25maWcuZGV0YWlsc1RlbXBsYXRlIHx8XG4gICAgICBjb25maWcuY29sbGFwc2VBbGxSb3dzIHx8XG4gICAgICBjb25maWcuZ3JvdXBSb3dzXG4gICAgXCJcbiAgICBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLWNlbGwtYWRkaXRpb25hbC1hY3Rpb25zXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIiAjYWRkaXRpb25hbEFjdGlvbk1lbnUgKm5nSWY9XCJjb25maWcuYWRkaXRpb25hbEFjdGlvbnNcIj5cbiAgICAgIDxhIGNsYXNzPVwibmd4LWJ0biBuZ3gtYnRuLWxpbmtcIiAoY2xpY2spPVwic2hvd01lbnUoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLW1lbnVcIj48L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8dWwgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIiAqbmdJZj1cIm1lbnVBY3RpdmVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3RoPlxuPC90cj5cbjx0clxuICBbc3R5bGUuZGlzcGxheV09XCJjb25maWcuc2VhcmNoRW5hYmxlZCAmJiAhZmlsdGVyc1RlbXBsYXRlID8gJ3RhYmxlLXJvdycgOiAnbm9uZSdcIlxuICBjbGFzcz1cIm5neC10YWJsZV9fc2VhcmNoLWhlYWRlclwiXG4+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5jaGVja2JveGVzIHx8IGNvbmZpZy5yYWRpb1wiPjwvdGg+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgY29sSW5kZXggPSBpbmRleFwiPlxuICAgIDx0aFxuICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNzc0NsYXNzICYmIGNvbHVtbi5jc3NDbGFzcy5pbmNsdWRlSGVhZGVyID8gY29sdW1uLmNzc0NsYXNzLm5hbWUgOiAnJ1wiXG4gICAgICBbY2xhc3MucGlubmVkLWxlZnRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICBbc3R5bGUubGVmdF09XCJzdHlsZVNlcnZpY2UucGlubmVkV2lkdGgoY29sdW1uLnBpbm5lZCwgY29sSW5kZXgpXCJcbiAgICA+XG4gICAgICA8dGFibGUtaGVhZGVyXG4gICAgICAgICpuZ0lmPVwiZ2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW4pXCJcbiAgICAgICAgKHVwZGF0ZSk9XCJvblNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgPlxuICAgICAgPC90YWJsZS1oZWFkZXI+XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5hZGRpdGlvbmFsQWN0aW9ucyB8fCBjb25maWcuZGV0YWlsc1RlbXBsYXRlXCI+PC90aD5cbjwvdHI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyc1RlbXBsYXRlXCI+XG4gIDx0cj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlcnNUZW1wbGF0ZVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgPC90cj5cbjwvbmctY29udGFpbmVyPlxuIl19