UNPKG

med-table

Version:
198 lines 51.2 kB
import { get } from 'lodash'; import { Component, Input, ViewChild, Output, EventEmitter, } from '@angular/core'; import { FILTER_TYPES } from './types/filterTypes'; import { APP_SELECTOR } from './constants/selectors'; import { StickyHeader } from './services/StickyHeader'; import { PrimengConfigMixin } from './mixins/PrimengConfigMixin'; import { CONFIG_KEY_CHILDREN } from './configs/columnConfigKeys'; import { CellConfigsFactory } from './services/CellConfigsFactory'; import { DEFAULT_TABLE_SETTINGS } from './configs/defaultTableSettings'; import { SheetsGenerator } from './services/SheetsGenerator/SheetsGenerator'; import { FilterDataHandler } from './services/FilterDataHandler/FilterDataHandler'; import { isExist, getNestedList, getColspanByKey, getMaxDeepKeyLevel, createArrayByNumber, getRowspanByLevelAndKey, } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "primeng/api"; import * as i2 from "./services/med-table.service"; import * as i3 from "primeng/table"; import * as i4 from "./components/table-head-cell/table-head-cell.component"; import * as i5 from "./components/filters/filter-select/filter-select.component"; import * as i6 from "./components/filters/filter-date/filter-date.component"; import * as i7 from "./components/filters/filter-checkbox/filter-checkbox.component"; import * as i8 from "./components/filters/filter-text/filter-text.component"; import * as i9 from "./components/table-cell/table-cell.component"; import * as i10 from "@angular/common"; import * as i11 from "primeng/inputtext"; import * as i12 from "primeng/button"; export class MedTableComponent extends PrimengConfigMixin { constructor(primeConfig, filterService, cb, store) { super(primeConfig, filterService); this.cb = cb; this.store = store; this.FILTER_TYPES = FILTER_TYPES; this.filterDataHandler = new FilterDataHandler(); this.columnsConfig = []; this._data = []; this._config = []; this.loading = false; this.settings = {}; this.updateTable = new EventEmitter(); this.updateRow = new EventEmitter(); this.focusCell = new EventEmitter(); } set config(newValue) { const cellConfigList = new CellConfigsFactory().build(newValue); this.columnsConfig = newValue; this.filterDataHandler.setConfig(cellConfigList); this._config = cellConfigList; } get config() { return this._config; } set data(newValue) { this.store.data = newValue; this.filterDataHandler.setData(newValue); this._data = newValue; } get data() { return this._data; } get filterableFields() { return this.config .filter(({ filterable }) => filterable) .map(({ key, sortKey }) => sortKey || key); } get localSettings() { return { ...DEFAULT_TABLE_SETTINGS, ...this.settings, }; } get colspan() { if (this.localSettings.expandedDataKey) { return this.config.length + 1; } return this.config.length; } get maxDeepKeyLevel() { return getMaxDeepKeyLevel(this.columnsConfig, CONFIG_KEY_CHILDREN); } get tableHeadLevels() { return createArrayByNumber(this.maxDeepKeyLevel); } ngAfterViewInit() { if (this.localSettings.doubleScrollbar) { this.addDoubleScrollbar(); } if (this.localSettings.sticky) { this.updateDynamicHeight(); } this.cb.detectChanges(); } clearFilters() { this.store.filters = {}; this.tableRef.clear(); } exportData(data) { const sheetsGenerator = new SheetsGenerator(data || this.tableRef.filteredValue || this.data, this.columnsConfig); sheetsGenerator.generate(this.localSettings.exportFileName); } /** * Call this method when updated dynamic height of outside content */ updateDynamicHeight() { setTimeout(() => { const { tableHeight } = new StickyHeader(); this.settings.scrollHeight = tableHeight; }, 0); } getHeadColumnClasses({ headCellClass, sticky }) { return `${headCellClass || ''} ${sticky ? `sticky ${sticky}` : ''}`; } getDataColumnClasses({ dataCellClass, sticky }, row) { const cellClass = dataCellClass ? dataCellClass(row) : ''; return `${cellClass} ${sticky ? `sticky ${sticky}` : ''}`; } getHeadRowConfigByLevel(level) { return getNestedList(this.columnsConfig, CONFIG_KEY_CHILDREN, level); } getColspan(column) { return getColspanByKey(column, CONFIG_KEY_CHILDREN); } getRowspan(column, level) { return getRowspanByLevelAndKey(column, CONFIG_KEY_CHILDREN, this.maxDeepKeyLevel, level); } getCellMinWidth({ minWidth }) { return minWidth || this.localSettings.colMinWidth; } getCellMaxWidth({ maxWidth }) { return maxWidth || this.localSettings.colMaxWidth; } getFilterSelectOptions({ key, sortKey }) { const options = this.data .map(obj => get(obj, sortKey || key)) .filter(Boolean); return [...new Set(options)].map(value => ({ value, label: value })); // delete duplicates } onFilter({ filters }) { this.store.filters = filters; } onLazyLoad({ first, rows, globalFilter, sortField, sortOrder, filters }) { const formatFilters = Object.entries(filters) .map(([key, data]) => ({ key, value: data.value })) .filter(({ value }) => isExist(value)); const data = Object.entries({ rows, sortField, sortOrder, search: globalFilter, page: Math.ceil(first / rows), filters: formatFilters, }).filter(([, value]) => isExist(value)); this.updateTable.emit(Object.fromEntries(data)); } addDoubleScrollbar() { // TODO should create DoubleScrollbar service const { nativeElement: upScrollRef } = this.upScrollRef; const tableRef = this.tableRef.el.nativeElement.querySelector('.p-datatable-wrapper'); const { offsetWidth: tableWidth } = tableRef.querySelector('table'); this.upScrollItemRef.nativeElement.style.width = `${tableWidth}px`; upScrollRef.onscroll = () => { if (tableRef.scrollLeft !== upScrollRef.scrollLeft) tableRef.scrollLeft = upScrollRef.scrollLeft; }; tableRef.onscroll = () => { if (upScrollRef.scrollLeft !== tableRef.scrollLeft) upScrollRef.scrollLeft = tableRef.scrollLeft; }; } } MedTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MedTableComponent, deps: [{ token: i1.PrimeNGConfig }, { token: i1.FilterService }, { token: i0.ChangeDetectorRef }, { token: i2.MedTableService }], target: i0.ɵɵFactoryTarget.Component }); MedTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MedTableComponent, selector: "med-table", inputs: { loading: "loading", settings: "settings", config: "config", data: "data" }, outputs: { updateTable: "updateTable", updateRow: "updateRow", focusCell: "focusCell" }, viewQueries: [{ propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true }, { propertyName: "upScrollRef", first: true, predicate: ["upScrollRef"], descendants: true }, { propertyName: "upScrollItemRef", first: true, predicate: ["upScrollItemRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n #upScrollRef\n *ngIf=\"localSettings.doubleScrollbar\"\n class=\"med-table__up-scroll\"\n>\n <div #upScrollItemRef class=\"med-table__up-scroll-item\"></div>\n</div>\n\n<p-table\n #tableRef\n class=\"med-table\"\n [value]=\"data\"\n [columns]=\"config\"\n [loading]=\"loading\"\n [lazy]=\"localSettings.lazy\"\n [rows]=\"localSettings.rows\"\n [globalFilterFields]=\"filterableFields\"\n [paginator]=\"localSettings.paginator\"\n [filterDelay]=\"localSettings.filterDelay\"\n [dataKey]=\"localSettings.expandedDataKey\"\n [totalRecords]=\"localSettings.totalRecords\"\n [scrollHeight]=\"localSettings.scrollHeight\"\n [rowsPerPageOptions]=\"localSettings.rowsPerPageOptions\"\n [showCurrentPageReport]=\"localSettings.showCurrentPageReport\"\n [currentPageReportTemplate]=\"localSettings.currentPageReportTemplate\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n>\n <ng-template *ngIf=\"captionTemplate || localSettings.showGlobalSearchFilter\" pTemplate=\"caption\">\n <span *ngIf=\"localSettings.showGlobalSearchFilter\" class=\"p-input-icon-left p-ml-auto mr-3\">\n <i class=\"pi pi-search\"></i>\n <input\n pInputText\n type=\"text\"\n placeholder=\"Search keyword\"\n (input)=\"tableRef.filterGlobal($any($event.target).value, 'custom-contains')\"\n />\n </span>\n\n <ng-container *ngTemplateOutlet=\"captionTemplate || null\"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngFor=\"let level of tableHeadLevels\">\n <th\n *ngIf=\"localSettings.expandedDataKey && !level\"\n [attr.rowspan]=\"maxDeepKeyLevel\"\n class=\"med-table__th\"\n ></th>\n\n <ng-container *ngFor=\"let col of getHeadRowConfigByLevel(level)\">\n <th\n *ngIf=\"col\"\n [attr.colspan]=\"getColspan(col)\"\n [attr.rowspan]=\"getRowspan(col, level)\"\n [style.minWidth]=\"getCellMinWidth(col)\"\n [style.maxWidth]=\"getCellMaxWidth(col)\"\n [pSortableColumn]=\"col.sortKey || col.key || ''\"\n [ngClass]=\"getHeadColumnClasses(col)\"\n class=\"med-table__th\"\n >\n <table-head-cell\n [config]=\"col\"\n [template]=\"thTemplate\"\n ></table-head-cell>\n </th>\n </ng-container>\n\n <ng-template #thTemplate let-config>\n <ng-container *ngTemplateOutlet=\"\n tableHeadTemplate || null\n context: { $implicit: config }\"\n ></ng-container>\n </ng-template>\n </tr>\n\n <tr *ngIf=\"filterableFields.length\">\n <th *ngIf=\"localSettings.expandedDataKey\" class=\"med-table__th\"></th>\n\n <th\n *ngFor=\"let col of config\"\n [ngClass]=\"getHeadColumnClasses(col)\"\n class=\"med-table__th\"\n >\n <ng-container *ngIf=\"col.filterable\" [ngSwitch]=\"col.filterType\">\n <filter-select\n *ngSwitchCase=\"FILTER_TYPES.SELECT\"\n [settings]=\"localSettings\"\n [key]=\"col.sortKey || col.key\"\n [filterDataHandler]=\"filterDataHandler\"\n ></filter-select>\n\n <filter-date\n *ngSwitchCase=\"FILTER_TYPES.DATE\"\n [key]=\"col.sortKey || col.key\"\n ></filter-date>\n\n <filter-checkbox\n *ngSwitchCase=\"FILTER_TYPES.CHECKBOX\"\n [key]=\"col.sortKey || col.key\"\n ></filter-checkbox>\n\n <filter-text *ngSwitchDefault [key]=\"col.sortKey || col.key\"></filter-text>\n </ng-container>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-expanded=\"expanded\">\n <tr class=\"med-table__row\">\n <td *ngIf=\"localSettings.expandedDataKey\" class=\"med-table__td\">\n <button\n type=\"button\"\n pButton\n pRipple\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain w-2rem h-2rem m-2\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n ></button>\n </td>\n\n <td\n *ngFor=\"let column of config\"\n [ngClass]=\"getDataColumnClasses(column, item)\"\n class=\"med-table__td\"\n >\n <table-cell\n [item]=\"item\"\n [config]=\"column\"\n [template]=\"tdTemplate\"\n (update)=\"updateRow.emit($event)\"\n (onFocus)=\"focusCell.emit($event)\"\n ></table-cell>\n\n <ng-template #tdTemplate let-data let-item=\"item\">\n <ng-container *ngTemplateOutlet=\"\n tableDataTemplate || null\n context: { $implicit: data, item: item, config: column }\"\n ></ng-container>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-item>\n <tr>\n <th [attr.colspan]=\"colspan\">\n <ng-container *ngTemplateOutlet=\"\n rowExpansion || null\n context: { $implicit: item }\"\n ></ng-container>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"colspan\">{{ localSettings.emptyMessage }}</td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"paginatorTemplate\" pTemplate=\"paginatorleft\">\n <ng-container *ngTemplateOutlet=\"paginatorTemplate || null\"></ng-container>\n </ng-template>\n</p-table>\n", styles: [":host ::ng-deep .med-table .p-datatable .p-datatable-thead{position:sticky;z-index:2;top:0}@media screen and (min-width: 960px){:host ::ng-deep .med-table .p-datatable-wrapper{overflow:scroll}}@media screen and (max-width: 960px){:host ::ng-deep .med-table .p-datatable-wrapper{height:auto!important}}.med-table__column-title{display:none}@media screen and (max-width: 960px){.med-table__row:nth-child(even){background:var(--gray-50)}}.med-table__th{padding:5px!important}.med-table__td{padding:0!important}@media screen and (max-width: 960px){.med-table__btn{font-size:14px}}.med-table__up-scroll{width:100%;height:15px;overflow-x:scroll}.med-table__up-scroll-item{width:1px;height:1px;padding:0!important}@media screen and (max-width: 960px){.med-table__up-scroll{display:none}}.sticky{position:sticky;background-color:#fff}.sticky.left{left:0}.sticky.right{right:0}\n"], components: [{ type: i3.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i4.TableHeadCellComponent, selector: "table-head-cell", inputs: ["config", "template"] }, { type: i5.FilterSelectComponent, selector: "filter-select", inputs: ["key", "settings", "filterDataHandler"] }, { type: i6.FilterDateComponent, selector: "filter-date", inputs: ["key"] }, { type: i7.FilterCheckboxComponent, selector: "filter-checkbox", inputs: ["key"] }, { type: i8.FilterTextComponent, selector: "filter-text", inputs: ["key"] }, { type: i9.TableCellComponent, selector: "table-cell", inputs: ["template", "config", "item"], outputs: ["update", "onFocus"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i11.InputText, selector: "[pInputText]" }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i3.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MedTableComponent, decorators: [{ type: Component, args: [{ selector: APP_SELECTOR, template: "<div\n #upScrollRef\n *ngIf=\"localSettings.doubleScrollbar\"\n class=\"med-table__up-scroll\"\n>\n <div #upScrollItemRef class=\"med-table__up-scroll-item\"></div>\n</div>\n\n<p-table\n #tableRef\n class=\"med-table\"\n [value]=\"data\"\n [columns]=\"config\"\n [loading]=\"loading\"\n [lazy]=\"localSettings.lazy\"\n [rows]=\"localSettings.rows\"\n [globalFilterFields]=\"filterableFields\"\n [paginator]=\"localSettings.paginator\"\n [filterDelay]=\"localSettings.filterDelay\"\n [dataKey]=\"localSettings.expandedDataKey\"\n [totalRecords]=\"localSettings.totalRecords\"\n [scrollHeight]=\"localSettings.scrollHeight\"\n [rowsPerPageOptions]=\"localSettings.rowsPerPageOptions\"\n [showCurrentPageReport]=\"localSettings.showCurrentPageReport\"\n [currentPageReportTemplate]=\"localSettings.currentPageReportTemplate\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n>\n <ng-template *ngIf=\"captionTemplate || localSettings.showGlobalSearchFilter\" pTemplate=\"caption\">\n <span *ngIf=\"localSettings.showGlobalSearchFilter\" class=\"p-input-icon-left p-ml-auto mr-3\">\n <i class=\"pi pi-search\"></i>\n <input\n pInputText\n type=\"text\"\n placeholder=\"Search keyword\"\n (input)=\"tableRef.filterGlobal($any($event.target).value, 'custom-contains')\"\n />\n </span>\n\n <ng-container *ngTemplateOutlet=\"captionTemplate || null\"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngFor=\"let level of tableHeadLevels\">\n <th\n *ngIf=\"localSettings.expandedDataKey && !level\"\n [attr.rowspan]=\"maxDeepKeyLevel\"\n class=\"med-table__th\"\n ></th>\n\n <ng-container *ngFor=\"let col of getHeadRowConfigByLevel(level)\">\n <th\n *ngIf=\"col\"\n [attr.colspan]=\"getColspan(col)\"\n [attr.rowspan]=\"getRowspan(col, level)\"\n [style.minWidth]=\"getCellMinWidth(col)\"\n [style.maxWidth]=\"getCellMaxWidth(col)\"\n [pSortableColumn]=\"col.sortKey || col.key || ''\"\n [ngClass]=\"getHeadColumnClasses(col)\"\n class=\"med-table__th\"\n >\n <table-head-cell\n [config]=\"col\"\n [template]=\"thTemplate\"\n ></table-head-cell>\n </th>\n </ng-container>\n\n <ng-template #thTemplate let-config>\n <ng-container *ngTemplateOutlet=\"\n tableHeadTemplate || null\n context: { $implicit: config }\"\n ></ng-container>\n </ng-template>\n </tr>\n\n <tr *ngIf=\"filterableFields.length\">\n <th *ngIf=\"localSettings.expandedDataKey\" class=\"med-table__th\"></th>\n\n <th\n *ngFor=\"let col of config\"\n [ngClass]=\"getHeadColumnClasses(col)\"\n class=\"med-table__th\"\n >\n <ng-container *ngIf=\"col.filterable\" [ngSwitch]=\"col.filterType\">\n <filter-select\n *ngSwitchCase=\"FILTER_TYPES.SELECT\"\n [settings]=\"localSettings\"\n [key]=\"col.sortKey || col.key\"\n [filterDataHandler]=\"filterDataHandler\"\n ></filter-select>\n\n <filter-date\n *ngSwitchCase=\"FILTER_TYPES.DATE\"\n [key]=\"col.sortKey || col.key\"\n ></filter-date>\n\n <filter-checkbox\n *ngSwitchCase=\"FILTER_TYPES.CHECKBOX\"\n [key]=\"col.sortKey || col.key\"\n ></filter-checkbox>\n\n <filter-text *ngSwitchDefault [key]=\"col.sortKey || col.key\"></filter-text>\n </ng-container>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-expanded=\"expanded\">\n <tr class=\"med-table__row\">\n <td *ngIf=\"localSettings.expandedDataKey\" class=\"med-table__td\">\n <button\n type=\"button\"\n pButton\n pRipple\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain w-2rem h-2rem m-2\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n ></button>\n </td>\n\n <td\n *ngFor=\"let column of config\"\n [ngClass]=\"getDataColumnClasses(column, item)\"\n class=\"med-table__td\"\n >\n <table-cell\n [item]=\"item\"\n [config]=\"column\"\n [template]=\"tdTemplate\"\n (update)=\"updateRow.emit($event)\"\n (onFocus)=\"focusCell.emit($event)\"\n ></table-cell>\n\n <ng-template #tdTemplate let-data let-item=\"item\">\n <ng-container *ngTemplateOutlet=\"\n tableDataTemplate || null\n context: { $implicit: data, item: item, config: column }\"\n ></ng-container>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-item>\n <tr>\n <th [attr.colspan]=\"colspan\">\n <ng-container *ngTemplateOutlet=\"\n rowExpansion || null\n context: { $implicit: item }\"\n ></ng-container>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"colspan\">{{ localSettings.emptyMessage }}</td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"paginatorTemplate\" pTemplate=\"paginatorleft\">\n <ng-container *ngTemplateOutlet=\"paginatorTemplate || null\"></ng-container>\n </ng-template>\n</p-table>\n", styles: [":host ::ng-deep .med-table .p-datatable .p-datatable-thead{position:sticky;z-index:2;top:0}@media screen and (min-width: 960px){:host ::ng-deep .med-table .p-datatable-wrapper{overflow:scroll}}@media screen and (max-width: 960px){:host ::ng-deep .med-table .p-datatable-wrapper{height:auto!important}}.med-table__column-title{display:none}@media screen and (max-width: 960px){.med-table__row:nth-child(even){background:var(--gray-50)}}.med-table__th{padding:5px!important}.med-table__td{padding:0!important}@media screen and (max-width: 960px){.med-table__btn{font-size:14px}}.med-table__up-scroll{width:100%;height:15px;overflow-x:scroll}.med-table__up-scroll-item{width:1px;height:1px;padding:0!important}@media screen and (max-width: 960px){.med-table__up-scroll{display:none}}.sticky{position:sticky;background-color:#fff}.sticky.left{left:0}.sticky.right{right:0}\n"] }] }], ctorParameters: function () { return [{ type: i1.PrimeNGConfig }, { type: i1.FilterService }, { type: i0.ChangeDetectorRef }, { type: i2.MedTableService }]; }, propDecorators: { loading: [{ type: Input }], settings: [{ type: Input }], config: [{ type: Input }], data: [{ type: Input }], updateTable: [{ type: Output }], updateRow: [{ type: Output }], focusCell: [{ type: Output }], tableRef: [{ type: ViewChild, args: ['tableRef'] }], upScrollRef: [{ type: ViewChild, args: ['upScrollRef'] }], upScrollItemRef: [{ type: ViewChild, args: ['upScrollItemRef'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lZC10YWJsZS9zcmMvbGliL21lZC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWQtdGFibGUvc3JjL2xpYi9tZWQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUc3QixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUNOLFlBQVksR0FHYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUtuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDbkYsT0FBTyxFQUNMLE9BQU8sRUFDUCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBQ3hCLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU9qQixNQUFNLE9BQU8saUJBQTRCLFNBQVEsa0JBQWtCO0lBQ2pFLFlB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Q0FBQztRQUN0RixNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLFVBQVUsSUFBSSxDQUFDO1FBRW5FLFdBQVcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsVUFBVTtnQkFDaEQsUUFBUSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVTtnQkFDaEQsV0FBVyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ2pELENBQUMsQ0FBQztJQUNKLENBQUM7OzhHQWpMVSxpQkFBaUI7a0dBQWpCLGlCQUFpQiwraEJDL0M5QixzNEtBcUtBOzJGRHRIYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsWUFBWTs4TEFlYixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlPLElBQUk7c0JBQWhCLEtBQUs7Z0JBVUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRWdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDSyxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ00sZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7RmlsdGVyU2VydmljZSwgUHJpbWVOR0NvbmZpZ30gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEFmdGVyVmlld0luaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGSUxURVJfVFlQRVMgfSBmcm9tICcuL3R5cGVzL2ZpbHRlclR5cGVzJztcbmltcG9ydCB7IEFQUF9TRUxFQ1RPUiB9IGZyb20gJy4vY29uc3RhbnRzL3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBTdGlja3lIZWFkZXIgfSBmcm9tICcuL3NlcnZpY2VzL1N0aWNreUhlYWRlcic7XG5pbXBvcnQgeyBQcmltZU9uRmlsdGVyRXZlbnQgfSBmcm9tICcuL3R5cGVzL1ByaW1lRmlsdGVyJztcbmltcG9ydCB7IE1lZFNlbGVjdE9wdGlvbiB9IGZyb20gJy4vdHlwZXMvTWVkU2VsZWN0T3B0aW9uJztcbmltcG9ydCB7IE1lZFRhYmxlU2V0dGluZ3MgfSBmcm9tICcuL3R5cGVzL01lZFRhYmxlU2V0dGluZ3MnO1xuaW1wb3J0IHsgUHJpbWVuZ0NvbmZpZ01peGluIH0gZnJvbSAnLi9taXhpbnMvUHJpbWVuZ0NvbmZpZ01peGluJztcbmltcG9ydCB7IENPTkZJR19LRVlfQ0hJTERSRU4gfSBmcm9tICcuL2NvbmZpZ3MvY29sdW1uQ29uZmlnS2V5cyc7XG5pbXBvcnQgeyBNZWRUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21lZC10YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxEYXRhQ29uZmlnTG9jYWwgfSBmcm9tICcuL3R5cGVzL0NlbGxEYXRhQ29uZmlnTG9jYWwnO1xuaW1wb3J0IHsgQ2VsbENvbmZpZ3NGYWN0b3J5IH0gZnJvbSAnLi9zZXJ2aWNlcy9DZWxsQ29uZmlnc0ZhY3RvcnknO1xuaW1wb3J0IHsgTWVkVXBkYXRlVGFibGVFdmVudCB9IGZyb20gJy4vdHlwZXMvTWVkVXBkYXRlVGFibGVFdmVudCc7XG5pbXBvcnQgeyBNZWRUYWJsZUNvbHVtbkNvbmZpZyB9IGZyb20gJy4vdHlwZXMvTWVkVGFibGVDb2x1bW5Db25maWcnO1xuaW1wb3J0IHsgTWVkVXBkYXRlRXZlbnQgfSBmcm9tICcuL3R5cGVzL01lZFVwZGF0ZUV2ZW50JztcbmltcG9ydCB7IE1lZFRhYmxlU2V0dGluZ3NMb2NhbCB9IGZyb20gJy4vdHlwZXMvTWVkVGFibGVTZXR0aW5nc0xvY2FsJztcbmltcG9ydCB7IERFRkFVTFRfVEFCTEVfU0VUVElOR1MgfSBmcm9tICcuL2NvbmZpZ3MvZGVmYXVsdFRhYmxlU2V0dGluZ3MnO1xuaW1wb3J0IHsgUHJpbWVUYWJsZUxhenlMb2FkRXZlbnQgfSBmcm9tICcuL3R5cGVzL1ByaW1lVGFibGVMYXp5TG9hZEV2ZW50JztcbmltcG9ydCB7IFNoZWV0c0dlbmVyYXRvciB9IGZyb20gJy4vc2VydmljZXMvU2hlZXRzR2VuZXJhdG9yL1NoZWV0c0dlbmVyYXRvcic7XG5pbXBvcnQgeyBGaWx0ZXJEYXRhSGFuZGxlciB9IGZyb20gJy4vc2VydmljZXMvRmlsdGVyRGF0YUhhbmRsZXIvRmlsdGVyRGF0YUhhbmRsZXInO1xuaW1wb3J0IHtcbiAgaXNFeGlzdCxcbiAgZ2V0TmVzdGVkTGlzdCxcbiAgZ2V0Q29sc3BhbkJ5S2V5LFxuICBnZXRNYXhEZWVwS2V5TGV2ZWwsXG4gIGNyZWF0ZUFycmF5QnlOdW1iZXIsXG4gIGdldFJvd3NwYW5CeUxldmVsQW5kS2V5LFxufSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBBUFBfU0VMRUNUT1IsXG4gIHRlbXBsYXRlVXJsOiAnbWVkLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVkLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1lZFRhYmxlQ29tcG9uZW50PEl0ZW1UeXBlPiBleHRlbmRzIFByaW1lbmdDb25maWdNaXhpbiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBjb25zdHJ1Y3RvcihwcmltZUNvbmZpZzogUHJpbWVOR0NvbmZpZywgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSwgcHJpdmF0ZSBjYjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc3RvcmU6IE1lZFRhYmxlU2VydmljZSkge1xuICAgIHN1cGVyKHByaW1lQ29uZmlnLCBmaWx0ZXJTZXJ2aWNlKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBGSUxURVJfVFlQRVMgPSBGSUxURVJfVFlQRVM7XG4gIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEYXRhSGFuZGxlciA9IG5ldyBGaWx0ZXJEYXRhSGFuZGxlcjxJdGVtVHlwZT4oKTtcbiAgcHVibGljIGNvbHVtbnNDb25maWc6IE1lZFRhYmxlQ29sdW1uQ29uZmlnW10gPSBbXTtcbiAgcHJpdmF0ZSBfZGF0YTogSXRlbVR5cGVbXSA9IFtdO1xuICBwcml2YXRlIF9jb25maWc6IENlbGxEYXRhQ29uZmlnTG9jYWxbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0dGluZ3M6IE1lZFRhYmxlU2V0dGluZ3MgPSB7fTtcbiAgQElucHV0KCkgc2V0IGNvbmZpZyhuZXdWYWx1ZTogTWVkVGFibGVDb2x1bW5Db25maWdbXSkge1xuICAgIGNvbnN0IGNlbGxDb25maWdMaXN0ID0gbmV3IENlbGxDb25maWdzRmFjdG9yeSgpLmJ1aWxkKG5ld1ZhbHVlKTtcblxuICAgIHRoaXMuY29sdW1uc0NvbmZpZyA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuZmlsdGVyRGF0YUhhbmRsZXIuc2V0Q29uZmlnKGNlbGxDb25maWdMaXN0KTtcbiAgICB0aGlzLl9jb25maWcgPSBjZWxsQ29uZmlnTGlzdDtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogQ2VsbERhdGFDb25maWdMb2NhbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGEobmV3VmFsdWU6IEl0ZW1UeXBlW10pIHtcbiAgICB0aGlzLnN0b3JlLmRhdGEgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckRhdGFIYW5kbGVyLnNldERhdGEobmV3VmFsdWUpO1xuICAgIHRoaXMuX2RhdGEgPSBuZXdWYWx1ZTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IEl0ZW1UeXBlW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgQE91dHB1dCgpIHVwZGF0ZVRhYmxlID0gbmV3IEV2ZW50RW1pdHRlcjxNZWRVcGRhdGVUYWJsZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgdXBkYXRlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxNZWRVcGRhdGVFdmVudDxJdGVtVHlwZT4+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c0NlbGwgPSBuZXcgRXZlbnRFbWl0dGVyPE1lZFVwZGF0ZUV2ZW50PEl0ZW1UeXBlPj4oKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZVJlZicpIHRhYmxlUmVmITogVGFibGU7XG4gIEBWaWV3Q2hpbGQoJ3VwU2Nyb2xsUmVmJykgdXBTY3JvbGxSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndXBTY3JvbGxJdGVtUmVmJykgdXBTY3JvbGxJdGVtUmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgZ2V0IGZpbHRlcmFibGVGaWVsZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1xuICAgICAgLmZpbHRlcigoe2ZpbHRlcmFibGV9KSA9PiBmaWx0ZXJhYmxlKVxuICAgICAgLm1hcCgoe2tleSwgc29ydEtleX0pID0+IHNvcnRLZXkgfHwga2V5KTtcbiAgfVxuXG4gIGdldCBsb2NhbFNldHRpbmdzKCk6IE1lZFRhYmxlU2V0dGluZ3NMb2NhbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkRFRkFVTFRfVEFCTEVfU0VUVElOR1MsXG4gICAgICAuLi50aGlzLnNldHRpbmdzLFxuICAgIH07XG4gIH1cblxuICBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmxvY2FsU2V0dGluZ3MuZXhwYW5kZWREYXRhS2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcubGVuZ3RoICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IG1heERlZXBLZXlMZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRNYXhEZWVwS2V5TGV2ZWw8TWVkVGFibGVDb2x1bW5Db25maWc+KHRoaXMuY29sdW1uc0NvbmZpZywgQ09ORklHX0tFWV9DSElMRFJFTik7XG4gIH1cblxuICBnZXQgdGFibGVIZWFkTGV2ZWxzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gY3JlYXRlQXJyYXlCeU51bWJlcih0aGlzLm1heERlZXBLZXlMZXZlbCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMubG9jYWxTZXR0aW5ncy5kb3VibGVTY3JvbGxiYXIpIHtcbiAgICAgIHRoaXMuYWRkRG91YmxlU2Nyb2xsYmFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9jYWxTZXR0aW5ncy5zdGlja3kpIHtcbiAgICAgIHRoaXMudXBkYXRlRHluYW1pY0hlaWdodCgpO1xuICAgIH1cblxuICAgIHRoaXMuY2IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmZpbHRlcnMgPSB7fTtcbiAgICB0aGlzLnRhYmxlUmVmLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0RGF0YShkYXRhPzogSXRlbVR5cGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNoZWV0c0dlbmVyYXRvciA9IG5ldyBTaGVldHNHZW5lcmF0b3IoZGF0YSB8fCB0aGlzLnRhYmxlUmVmLmZpbHRlcmVkVmFsdWUgfHwgdGhpcy5kYXRhLCB0aGlzLmNvbHVtbnNDb25maWcpO1xuICAgIHNoZWV0c0dlbmVyYXRvci5nZW5lcmF0ZSh0aGlzLmxvY2FsU2V0dGluZ3MuZXhwb3J0RmlsZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2Qgd2hlbiB1cGRhdGVkIGR5bmFtaWMgaGVpZ2h0IG9mIG91dHNpZGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUR5bmFtaWNIZWlnaHQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB7IHRhYmxlSGVpZ2h0IH0gPSBuZXcgU3RpY2t5SGVhZGVyKCk7XG4gICAgICB0aGlzLnNldHRpbmdzLnNjcm9sbEhlaWdodCA9IHRhYmxlSGVpZ2h0O1xuICAgIH0sIDApO1xuICB9XG5cbiAgZ2V0SGVhZENvbHVtbkNsYXNzZXMoeyBoZWFkQ2VsbENsYXNzLCBzdGlja3kgfTogTWVkVGFibGVDb2x1bW5Db25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtoZWFkQ2VsbENsYXNzIHx8ICcnfSAkeyBzdGlja3kgPyBgc3RpY2t5ICR7c3RpY2t5fWAgOiAnJyB9YDtcbiAgfVxuXG4gIGdldERhdGFDb2x1bW5DbGFzc2VzKHsgZGF0YUNlbGxDbGFzcywgc3RpY2t5IH06IE1lZFRhYmxlQ29sdW1uQ29uZmlnLCByb3c6IEl0ZW1UeXBlKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZWxsQ2xhc3MgPSBkYXRhQ2VsbENsYXNzID8gZGF0YUNlbGxDbGFzcyhyb3cpIDogJyc7XG4gICAgcmV0dXJuIGAke2NlbGxDbGFzc30gJHsgc3RpY2t5ID8gYHN0aWNreSAke3N0aWNreX1gIDogJycgfWA7XG4gIH1cblxuICBnZXRIZWFkUm93Q29uZmlnQnlMZXZlbChsZXZlbDogbnVtYmVyKTogQXJyYXk8TWVkVGFibGVDb2x1bW5Db25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gZ2V0TmVzdGVkTGlzdCh0aGlzLmNvbHVtbnNDb25maWcsIENPTkZJR19LRVlfQ0hJTERSRU4sIGxldmVsKTtcbiAgfVxuXG4gIGdldENvbHNwYW4oY29sdW1uOiBNZWRUYWJsZUNvbHVtbkNvbmZpZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldENvbHNwYW5CeUtleShjb2x1bW4sIENPTkZJR19LRVlfQ0hJTERSRU4pO1xuICB9XG5cbiAgZ2V0Um93c3Bhbihjb2x1bW46IE1lZFRhYmxlQ29sdW1uQ29uZmlnLCBsZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0Um93c3BhbkJ5TGV2ZWxBbmRLZXkoY29sdW1uLCBDT05GSUdfS0VZX0NISUxEUkVOLCB0aGlzLm1heERlZXBLZXlMZXZlbCwgbGV2ZWwpO1xuICB9XG5cbiAgZ2V0Q2VsbE1pbldpZHRoKHttaW5XaWR0aH06IE1lZFRhYmxlQ29sdW1uQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbWluV2lkdGggfHwgdGhpcy5sb2NhbFNldHRpbmdzLmNvbE1pbldpZHRoO1xuICB9XG5cbiAgZ2V0Q2VsbE1heFdpZHRoKHttYXhXaWR0aH06IE1lZFRhYmxlQ29sdW1uQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbWF4V2lkdGggfHwgdGhpcy5sb2NhbFNldHRpbmdzLmNvbE1heFdpZHRoO1xuICB9XG5cbiAgZ2V0RmlsdGVyU2VsZWN0T3B0aW9ucyh7a2V5LCBzb3J0S2V5fTogQ2VsbERhdGFDb25maWdMb2NhbCk6IE1lZFNlbGVjdE9wdGlvbjxzdHJpbmc+W10ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRhdGFcbiAgICAgIC5tYXAob2JqID0+IGdldChvYmosIHNvcnRLZXkgfHwga2V5KSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KG9wdGlvbnMpXS5tYXAodmFsdWUgPT4gKHsgdmFsdWUsIGxhYmVsOiB2YWx1ZSB9KSk7IC8vIGRlbGV0ZSBkdXBsaWNhdGVzXG4gIH1cblxuICBvbkZpbHRlcih7ZmlsdGVyc306IFByaW1lT25GaWx0ZXJFdmVudDxJdGVtVHlwZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICB9XG5cbiAgb25MYXp5TG9hZCh7Zmlyc3QsIHJvd3MsIGdsb2JhbEZpbHRlciwgc29ydEZpZWxkLCBzb3J0T3JkZXIsIGZpbHRlcnN9OiBQcmltZVRhYmxlTGF6eUxvYWRFdmVudCkge1xuICAgIGNvbnN0IGZvcm1hdEZpbHRlcnM6IGFueVtdID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycylcbiAgICAgIC5tYXAoKFtrZXksIGRhdGFdKSA9PiAoe2tleSwgdmFsdWU6IGRhdGEudmFsdWV9KSlcbiAgICAgIC5maWx0ZXIoKHt2YWx1ZX0pID0+IGlzRXhpc3QodmFsdWUpKTtcblxuICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuZW50cmllcyh7XG4gICAgICByb3dzLFxuICAgICAgc29ydEZpZWxkLFxuICAgICAgc29ydE9yZGVyLFxuICAgICAgc2VhcmNoOiBnbG9iYWxGaWx0ZXIsXG4gICAgICBwYWdlOiBNYXRoLmNlaWwoZmlyc3QgLyByb3dzKSxcbiAgICAgIGZpbHRlcnM6IGZvcm1hdEZpbHRlcnMsXG4gICAgfSkuZmlsdGVyKChbLCB2YWx1ZV0pID0+IGlzRXhpc3QodmFsdWUpKTtcblxuICAgIHRoaXMudXBkYXRlVGFibGUuZW1pdChPYmplY3QuZnJvbUVudHJpZXMoZGF0YSkgYXMgTWVkVXBkYXRlVGFibGVFdmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFkZERvdWJsZVNjcm9sbGJhcigpIHtcbiAgICAvLyBUT0RPIHNob3VsZCBjcmVhdGUgRG91YmxlU2Nyb2xsYmFyIHNlcnZpY2VcbiAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQ6IHVwU2Nyb2xsUmVmIH0gPSB0aGlzLnVwU2Nyb2xsUmVmO1xuICAgIGNvbnN0IHRhYmxlUmVmID0gdGhpcy50YWJsZVJlZi5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS13cmFwcGVyJyk7XG4gICAgY29uc3QgeyBvZmZzZXRXaWR0aDogdGFibGVXaWR0aCB9ID0gdGFibGVSZWYucXVlcnlTZWxlY3RvcigndGFibGUnKTtcbiAgICB0aGlzLnVwU2Nyb2xsSXRlbVJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGFibGVXaWR0aH1weGA7XG5cbiAgICB1cFNjcm9sbFJlZi5vbnNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGlmICh0YWJsZVJlZi5zY3JvbGxMZWZ0ICE9PSB1cFNjcm9sbFJlZi5zY3JvbGxMZWZ0KVxuICAgICAgICB0YWJsZVJlZi5zY3JvbGxMZWZ0ID0gdXBTY3JvbGxSZWYuc2Nyb2xsTGVmdDtcbiAgICB9O1xuXG4gICAgdGFibGVSZWYub25zY3JvbGwgPSAoKSA9PiB7XG4gICAgICBpZiAodXBTY3JvbGxSZWYuc2Nyb2xsTGVmdCAhPT0gdGFibGVSZWYuc2Nyb2xsTGVmdClcbiAgICAgICAgdXBTY3JvbGxSZWYuc2Nyb2xsTGVmdCA9IHRhYmxlUmVmLnNjcm9sbExlZnQ7XG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdlxuICAjdXBTY3JvbGxSZWZcbiAgKm5nSWY9XCJsb2NhbFNldHRpbmdzLmRvdWJsZVNjcm9sbGJhclwiXG4gIGNsYXNzPVwibWVkLXRhYmxlX191cC1zY3JvbGxcIlxuPlxuICA8ZGl2ICN1cFNjcm9sbEl0ZW1SZWYgY2xhc3M9XCJtZWQtdGFibGVfX3VwLXNjcm9sbC1pdGVtXCI+PC9kaXY+XG48L2Rpdj5cblxuPHAtdGFibGVcbiAgI3RhYmxlUmVmXG4gIGNsYXNzPVwibWVkLXRhYmxlXCJcbiAgW3ZhbHVlXT1cImRhdGFcIlxuICBbY29sdW1uc109XCJjb25maWdcIlxuICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgW2xhenldPVwibG9jYWxTZXR0aW5ncy5sYXp5XCJcbiAgW3Jvd3NdPVwibG9jYWxTZXR0aW5ncy5yb3dzXCJcbiAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJmaWx0ZXJhYmxlRmllbGRzXCJcbiAgW3BhZ2luYXRvcl09XCJsb2NhbFNldHRpbmdzLnBhZ2luYXRvclwiXG4gIFtmaWx0ZXJEZWxheV09XCJsb2NhbFNldHRpbmdzLmZpbHRlckRlbGF5XCJcbiAgW2RhdGFLZXldPVwibG9jYWxTZXR0aW5ncy5leHBhbmRlZERhdGFLZXlcIlxuICBbdG90YWxSZWNvcmRzXT1cImxvY2FsU2V0dGluZ3MudG90YWxSZWNvcmRzXCJcbiAgW3Njcm9sbEhlaWdodF09XCJsb2NhbFNldHRpbmdzLnNjcm9sbEhlaWdodFwiXG4gIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwibG9jYWxTZXR0aW5ncy5yb3dzUGVyUGFnZU9wdGlvbnNcIlxuICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cImxvY2FsU2V0dGluZ3Muc2hvd0N1cnJlbnRQYWdlUmVwb3J0XCJcbiAgW2N1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGVdPVwibG9jYWxTZXR0aW5ncy5jdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXCJcbiAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyKCRldmVudClcIlxuICAob25MYXp5TG9hZCk9XCJvbkxhenlMb2FkKCRldmVudClcIlxuPlxuICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjYXB0aW9uVGVtcGxhdGUgfHwgbG9jYWxTZXR0aW5ncy5zaG93R2xvYmFsU2VhcmNoRmlsdGVyXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgIDxzcGFuICpuZ0lmPVwibG9jYWxTZXR0aW5ncy5zaG93R2xvYmFsU2VhcmNoRmlsdGVyXCIgY2xhc3M9XCJwLWlucHV0LWljb24tbGVmdCBwLW1sLWF1dG8gbXItM1wiPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+XG4gICAgICA8aW5wdXRcbiAgICAgICAgcElucHV0VGV4dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGtleXdvcmRcIlxuICAgICAgICAoaW5wdXQpPVwidGFibGVSZWYuZmlsdGVyR2xvYmFsKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdjdXN0b20tY29udGFpbnMnKVwiXG4gICAgICAvPlxuICAgIDwvc3Bhbj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGUgfHwgbnVsbFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8dHIgKm5nRm9yPVwibGV0IGxldmVsIG9mIHRhYmxlSGVhZExldmVsc1wiPlxuICAgICAgPHRoXG4gICAgICAgICpuZ0lmPVwibG9jYWxTZXR0aW5ncy5leHBhbmRlZERhdGFLZXkgJiYgIWxldmVsXCJcbiAgICAgICAgW2F0dHIucm93c3Bhbl09XCJtYXhEZWVwS2V5TGV2ZWxcIlxuICAgICAgICBjbGFzcz1cIm1lZC10YWJsZV9fdGhcIlxuICAgICAgPjwvdGg+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBnZXRIZWFkUm93Q29uZmlnQnlMZXZlbChsZXZlbClcIj5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nSWY9XCJjb2xcIlxuICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiZ2V0Q29sc3Bhbihjb2wpXCJcbiAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImdldFJvd3NwYW4oY29sLCBsZXZlbClcIlxuICAgICAgICAgIFtzdHlsZS5taW5XaWR0aF09XCJnZXRDZWxsTWluV2lkdGgoY29sKVwiXG4gICAgICAgICAgW3N0eWxlLm1heFdpZHRoXT1cImdldENlbGxNYXhXaWR0aChjb2wpXCJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5zb3J0S2V5IHx8IGNvbC5rZXkgfHwgJydcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEhlYWRDb2x1bW5DbGFzc2VzKGNvbClcIlxuICAgICAgICAgIGNsYXNzPVwibWVkLXRhYmxlX190aFwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGFibGUtaGVhZC1jZWxsXG4gICAgICAgICAgICBbY29uZmlnXT1cImNvbFwiXG4gICAgICAgICAgICBbdGVtcGxhdGVdPVwidGhUZW1wbGF0ZVwiXG4gICAgICAgICAgPjwvdGFibGUtaGVhZC1jZWxsPlxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjdGhUZW1wbGF0ZSBsZXQtY29uZmlnPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICB0YWJsZUhlYWRUZW1wbGF0ZSB8fCBudWxsXG4gICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29uZmlnIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdHI+XG5cbiAgICA8dHIgKm5nSWY9XCJmaWx0ZXJhYmxlRmllbGRzLmxlbmd0aFwiPlxuICAgICAgPHRoICpuZ0lmPVwibG9jYWxTZXR0aW5ncy5leHBhbmRlZERhdGFLZXlcIiBjbGFzcz1cIm1lZC10YWJsZV9fdGhcIj48L3RoPlxuXG4gICAgICA8dGhcbiAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb25maWdcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXRIZWFkQ29sdW1uQ2xhc3Nlcyhjb2wpXCJcbiAgICAgICAgY2xhc3M9XCJtZWQtdGFibGVfX3RoXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWx0ZXJhYmxlXCIgW25nU3dpdGNoXT1cImNvbC5maWx0ZXJUeXBlXCI+XG4gICAgICAgICAgPGZpbHRlci1zZWxlY3RcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJGSUxURVJfVFlQRVMuU0VMRUNUXCJcbiAgICAgICAgICAgIFtzZXR0aW5nc109XCJsb2NhbFNldHRpbmdzXCJcbiAgICAgICAgICAgIFtrZXldPVwiY29sLnNvcnRLZXkgfHwgY29sLmtleVwiXG4gICAgICAgICAgICBbZmlsdGVyRGF0YUhhbmRsZXJdPVwiZmlsdGVyRGF0YUhhbmRsZXJcIlxuICAgICAgICAgID48L2ZpbHRlci1zZWxlY3Q+XG5cbiAgICAgICAgICA8ZmlsdGVyLWRhdGVcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJGSUxURVJfVFlQRVMuREFURVwiXG4gICAgICAgICAgICBba2V5XT1cImNvbC5zb3J0S2V5IHx8IGNvbC5rZXlcIlxuICAgICAgICAgID48L2ZpbHRlci1kYXRlPlxuXG4gICAgICAgICAgPGZpbHRlci1jaGVja2JveFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIkZJTFRFUl9UWVBFUy5DSEVDS0JPWFwiXG4gICAgICAgICAgICBba2V5XT1cImNvbC5zb3J0S2V5IHx8IGNvbC5rZXlcIlxuICAgICAgICAgID48L2ZpbHRlci1jaGVja2JveD5cblxuICAgICAgICAgIDxmaWx0ZXItdGV4dCAqbmdTd2l0Y2hEZWZhdWx0IFtrZXldPVwiY29sLnNvcnRLZXkgfHwgY29sLmtleVwiPjwvZmlsdGVyLXRleHQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cbiAgICA8dHIgY2xhc3M9XCJtZWQtdGFibGVfX3Jvd1wiPlxuICAgICAgPHRkICpuZ0lmPVwibG9jYWxTZXR0aW5ncy5leHBhbmRlZERhdGFLZXlcIiBjbGFzcz1cIm1lZC10YWJsZV9fdGRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgW3BSb3dUb2dnbGVyXT1cIml0ZW1cIlxuICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXBsYWluIHctMnJlbSBoLTJyZW0gbS0yXCJcbiAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLWRvd24nIDogJ3BpIHBpLWNoZXZyb24tcmlnaHQnXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC90ZD5cblxuICAgICAgPHRkXG4gICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29uZmlnXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGF0YUNvbHVtbkNsYXNzZXMoY29sdW1uLCBpdGVtKVwiXG4gICAgICAgIGNsYXNzPVwibWVkLXRhYmxlX190ZFwiXG4gICAgICA+XG4gICAgICAgIDx0YWJsZS1jZWxsXG4gICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJjb2x1bW5cIlxuICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ0ZFRlbXBsYXRlXCJcbiAgICAgICAgICAodXBkYXRlKT1cInVwZGF0ZVJvdy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChvbkZvY3VzKT1cImZvY3VzQ2VsbC5lbWl0KCRldmVudClcIlxuICAgICAgICA+PC90YWJsZS1jZWxsPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdGRUZW1wbGF0ZSBsZXQtZGF0YSBsZXQtaXR