UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

450 lines 66.8 kB
import { Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { GridContextMenuActionData } from './contextmenu/grid-context-menu-action-data'; import { StylesUtilService } from '../utilities/styles.util.service'; import { timer } from 'rxjs'; import { GridColumnsOptions } from './options/grid-column-options'; import { GridColumnOptionsDialog } from './options/grid-column-options-dialog.component'; import { GridContextMenuCellRendererComponent } from './contextmenu/grid-context-menu-cell-renderer.component'; import { TwoListItem } from '../twolist/two-list-utilities'; import { AutosizeGridHelper, initializeCalculatedGridState } from '../helper/autosize-grid-helper'; import * as i0 from "@angular/core"; import * as i1 from "systelab-preferences"; import * as i2 from "systelab-translate"; import * as i3 from "../modal/dialog/dialog.service"; export class AbstractGrid { static { this.contextMenuColId = 'contextMenu'; } static { this.selectionColId = 'selectCol'; } constructor(preferencesService, i18nService, dialogService) { this.preferencesService = preferencesService; this.i18nService = i18nService; this.dialogService = dialogService; this.startCellEditorWithTab = false; this.multipleSelection = false; this.showChecks = false; this.headerCheckboxSelection = false; this.rowData = []; this.removeSelectionOnOpenContextMenu = false; this.autoSizeColumnsToContent = false; this.action = new EventEmitter(); this.clickRow = new EventEmitter(); this.rowDragEnd = new EventEmitter(); this.viewportChanged = new EventEmitter(); this.rowSelected = new EventEmitter(); this.firstSizeToFitExecuted = false; } ngOnInit() { this.gridOptions = this.getInitialGridOptions(); if (this.noRowsText) { this.overlayNoRowsTemplate = this.noRowsText; this.overlayLoadingTemplate = this.loadingText; } this.calculatedGridState = initializeCalculatedGridState(this.autoSizeColumnsToContent); } getInitialGridOptions() { const rowHeight = StylesUtilService.getStyleValue(this.hiddenElement, 'line-height'); const headerHeight = StylesUtilService.getStyleValue(this.hiddenElement, 'height'); const options = {}; options.columnDefs = this.getColumnDefsWithOptions(); options.rowHeight = Number(rowHeight); options.headerHeight = Number(headerHeight); options.suppressDragLeaveHidesColumns = true; options.suppressCellFocus = true; options.enableRangeSelection = true; options.stopEditingWhenCellsLoseFocus = true; options.singleClickEdit = true; options.defaultColDef = { resizable: this.isColResizeEnabled() }; options.rowSelection = this.getRowSelectionType(); options.localeText = { noRowsToShow: this.i18nService.instant('COMMON_NO_ROWS_TO_SHOW'), loadingOoo: this.i18nService.instant('COMMON_LOADING') }; if (this.hideHeader()) { options.headerHeight = 0; } if (this.showChecks) { if (this.multipleSelection) { options.suppressRowClickSelection = true; } } options.isFullWidthRow = (isFullWidthRowParams) => this.getIsFullWidthRow(isFullWidthRowParams); options.fullWidthCellRenderer = this.getFullWidthCellRenderer(); options.context = { componentParent: this }; options.onCellEditingStarted = (event) => this.onCellEditingStarted(event); return options; } onCellEditingStarted(event) { this.startCellEditorWithTab = event.event?.key === 'Tab'; } onModelUpdated(event) { this.doAutoSizeManagement(); return event; } doGridReady(event) { this.loadColumnsStateFromPreferences(); if (this.autoSizeColumnsToContent) { this.gridOptions.api.addEventListener('bodyScroll', this.onBodyScroll.bind(this)); } else { this.doAutoSizeManagement(); } this.gridOptions.api.addEventListener('columnMoved', this.saveColumnsStateInPreferences.bind(this)); } saveColumnsStateInPreferences() { if (this.firstSizeToFitExecuted) { this.preferencesService.put(this.getGridOptionsPreferencesPrefix(), this.gridOptions.columnApi.getColumnState()); } } loadColumnsStateFromPreferences() { this.loadColumnsState(this.getGridOptionsPreferencesPrefix(), this.gridOptions.columnApi); } loadColumnsState(prefix, columnApi) { if (this.preferencesService.get(prefix)) { const gridOptionsPreferences = this.preferencesService.get(prefix); // Filtered preferences columns that are not in the current columnDef. const filteredGridOptionsPreferences = gridOptionsPreferences .filter(colPref => columnApi.getColumns() .some(column => colPref.colId === column.getColId())); // Show new added columns columnApi.getColumns() .filter(column => !filteredGridOptionsPreferences.some(colPref => colPref.colId === column.getColId())) .forEach(column => { const newColumn = { 'colId': column.getColId(), 'hide': !column.isVisible(), 'aggFunc': null, 'width': column.getActualWidth(), 'pivotIndex': null, 'pinned': null, 'rowGroupIndex': null }; if (column.getColId() === AbstractGrid.contextMenuColId || column.getColId() === AbstractGrid.selectionColId) { filteredGridOptionsPreferences.unshift(newColumn); } else { filteredGridOptionsPreferences.push(newColumn); } }); this.setColumnWidthToFitContent(columnApi, filteredGridOptionsPreferences); // Override pinned property saved in preferences const pinnedCol = filteredGridOptionsPreferences.find(column => column.colId === AbstractGrid.contextMenuColId || column.colId === AbstractGrid.selectionColId); if (pinnedCol) { pinnedCol['pinned'] = 'left'; } columnApi.applyColumnState({ state: filteredGridOptionsPreferences, applyOrder: true }); } } setColumnWidthToFitContent(columnApi, filteredGridOptionsPreferences) { // Set to null width of preferences of columns without supressSizeToFit // If not set to null these columns are not sizedtofit columnApi.getColumns() .filter(column => !column.getColDef().suppressSizeToFit) .forEach(column => { const columnPref = filteredGridOptionsPreferences.find(colPref => colPref.colId === column.getColId()); columnPref.width = null; }); } getContextMenuColumnDef(width) { return { colId: AbstractGrid.contextMenuColId, headerName: '', pinned: 'left', width: width, suppressSizeToFit: true, resizable: false, suppressMovable: true, cellRenderer: GridContextMenuCellRendererComponent }; } getCheckColumnDef(width) { return { colId: AbstractGrid.selectionColId, headerName: '', headerCheckboxSelection: this.headerCheckboxSelection, checkboxSelection: true, pinned: 'left', width: width, suppressSizeToFit: true, resizable: false, suppressMovable: true }; } getColumnDefsWithOptions() { const colDefs = this.getColumnDefs(); if (this.menu && this.menu.length > 0) { colDefs.unshift(this.getContextMenuColumnDef(this.getContextMenuColumnWidth())); } if (this.showChecks) { colDefs.unshift(this.getCheckColumnDef(this.getCheckColumnWidth())); } colDefs.forEach((colDef) => this.suppressColumnSizeToFit(colDef)); return colDefs; } hideHeader() { return false; } getIsFullWidthRow(isFullWidthRowParams) { return false; } getFullWidthCellRenderer() { return undefined; } getGridOptionsPreferencesPrefix() { return this.preferenceName || this.constructor.name; } executeContextMenuAction(elementId, actionId) { const option = this.menu.find(opt => opt.actionId === actionId); const rowId = Number(elementId.substr(elementId.indexOf('row')) .replace('row', '')); const data = this.gridOptions.api.getModel() .getRow(rowId).data; const rowsSelected = this.gridOptions.api.getSelectedRows(); const actionData = new GridContextMenuActionData(rowId.toString(), actionId, data, this.gridOptions, rowsSelected); if (option && option.action && data !== undefined) { option.action(actionData); } else { this.action.emit(actionData); } this.popupmenu.closeDropDown(); } isContextMenuOptionEnabled(elementId, actionId) { const option = this.menu.find(opt => opt.actionId === actionId); const rowId = Number(elementId.substr(elementId.indexOf('row')) .replace('row', '')); const data = this.gridOptions.api.getModel() .getRow(rowId).data; if (option && option.isActionEnabled && data !== undefined) { return option.isActionEnabled(data); } return true; } executeHeaderContextMenuAction(elementId, actionId, headerData) { const option = this.headerMenu.find(opt => opt.actionId === actionId); if (option && option.action) { const actionData = new GridContextMenuActionData(elementId, actionId, headerData, this.gridOptions); return option.action(actionData); } else { const actionData = new GridContextMenuActionData(elementId, actionId, headerData, this.gridOptions); this.action.emit(actionData); } this.headerPopupMenu.closeDropDown(); } isHeaderContextMenuOptionEnabled(elementId, actionId, headerData) { const option = this.headerMenu.find(opt => opt.actionId === actionId); if (option && option.isActionEnabled) { return option.isActionEnabled(headerData); } return true; } isColResizeEnabled() { return true; } suppressColumnSizeToFit(colDef) { if (colDef.width) { colDef.suppressSizeToFit = true; } } onRowSelected(event) { this.rowSelected.emit(event.data); } getRowSelectionType() { return this.multipleSelection ? 'multiple' : 'single'; } getSelectedRows() { return this.gridOptions.api.getSelectedRows(); } getSelectedRow() { const selected = this.getSelectedRows(); return selected.length > 0 ? selected[0] : null; } selectRow(index) { this.gridOptions.api.ensureIndexVisible(index); timer(200) .subscribe(() => this.gridOptions.api.selectIndex(index, false, false)); } doClick(event) { if (event.column.colId === 'contextMenu' && !(event.event.ctrlKey && this.showChecks)) { event.node.setSelected(true); } else { if (event.column.colId === 'selectCol') { event.node.setSelected(!event.node.isSelected()); } else { if (!event.column.isCellEditable(event.node)) { const value = (event.event.ctrlKey && this.multipleSelection && !this.showChecks) ? event.event : event.data; this.clickRow.emit(value); } } } } doColumnResized(event) { this.saveColumnsStateInPreferences(); } doViewportChanged() { this.viewportChanged.emit(); } doGridSizeChanged(event) { if (this.gridOptions.api) { this.doAutoSizeManagement(); } } showOptions(canHideAllColumns) { const parameters = GridColumnOptionsDialog.getParameters(); parameters.columnOptions = this.getGridColumnOptions(this.gridOptions.columnApi, this.getColumnDefs()); parameters.canHideAllColumns = canHideAllColumns; this.dialogService.showDialog(GridColumnOptionsDialog, parameters) .subscribe((columnsOptions) => { if (columnsOptions) { this.applyGridColumnOptions(this.gridOptions.columnApi, columnsOptions); this.doAutoSizeManagement(); this.saveColumnsStateInPreferences(); } }); } getGridColumnOptions(columnApi, columnDefs) { const options = new GridColumnsOptions(); options.available = columnApi.getColumns() .filter(column => !columnApi.getColumn(column.getColDef().colId) .isVisible()) .map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, false)); options.initialAvailableColumns = columnApi.getColumns() .map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, false)); options.visible = columnApi.getAllDisplayedColumns() .filter(column => column.getColId() !== 'contextMenu' && column.getColId() !== 'selectCol') .map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, true)); options.defaultVisibleColumns = columnDefs.filter(column => !column.hide) .map(column => new TwoListItem(column.headerName, column.colId, false, true)); options.defaultHiddenColumns = columnDefs.filter(column => column.hide) .map(column => new TwoListItem(column.headerName, column.colId, false, false)); return options; } applyGridColumnOptions(columnApi, columnOptions) { let numberOfFixedInitialColumns = (columnApi.getColumn('contextMenu') !== null) ? 1 : 0; numberOfFixedInitialColumns += (columnApi.getColumn('selectCol') !== null) ? 1 : 0; columnOptions.visible.forEach((tlp, index) => { const col = columnApi.getColumns() .find((column) => column.getColDef().colId === tlp.colId); col.setVisible(true); columnApi.moveColumn(col.getColId(), index + numberOfFixedInitialColumns); }); columnApi.getColumns() .forEach((column) => { if (column.getColId() !== 'contextMenu' && column.getColId() !== 'selectCol') { if (!columnOptions.visible.some(tlp => tlp.colId === column.getColDef().colId)) { columnApi.setColumnVisible(column.getColId(), false); } } }); } dotsClicked(rowIndex, data, event) { this.popupmenu.setActionManager(this); this.popupmenu.setRowIndex(rowIndex); if (this.existsAtLeastOneActionEnabled(data)) { timer(200) .subscribe(() => this.popupmenu.openWithOptions(event, this.menu)); } else { event.stopPropagation(); } } headerDotsClicked(headerData, event) { this.headerPopupMenu.setActionManager(this); this.headerPopupMenu.setHeaderData(headerData); if (this.existsAtLeastOneHeaderActionEnabled(headerData)) { timer(200) .subscribe(() => this.headerPopupMenu.openWithOptions(event, this.headerMenu)); } else { event.stopPropagation(); } } existsAtLeastOneHeaderActionEnabled(data) { return this.headerMenu ? this.headerMenu.some(menuOption => this.isMenuOptionEnabled(menuOption, data)) : false; } existsAtLeastOneActionEnabled(data) { if (this.menu) { return this.menu.some(menuOption => this.isMenuOptionEnabled(menuOption, data)); } else { return false; } } isMenuOptionEnabled(menuOption, data) { if (menuOption.isActionEnabled) { return menuOption.isActionEnabled.apply(null, [data]); } else { return true; } } onRowDragEnd(event) { this.rowDragEnd.emit(event); } getContextMenuColumnWidth() { return 40; } getCheckColumnWidth() { return 35; } onBodyScroll(event) { clearTimeout(this.scrollTimeout); this.scrollTimeout = setTimeout(() => { this.doAutoSizeManagement(event); }, 150); } doAutoSizeManagement(event) { this.firstSizeToFitExecuted = true; AutosizeGridHelper.doAutoSizeManagement(this.calculatedGridState, this.gridOptions, event); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractGrid, deps: [{ token: i1.PreferencesService }, { token: i2.I18nService }, { token: i3.DialogService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: AbstractGrid, inputs: { headerMenu: "headerMenu", menu: "menu", preferenceName: "preferenceName", multipleSelection: "multipleSelection", showChecks: "showChecks", headerCheckboxSelection: "headerCheckboxSelection", rowData: "rowData", noRowsText: "noRowsText", loadingText: "loadingText", removeSelectionOnOpenContextMenu: "removeSelectionOnOpenContextMenu", autoSizeColumnsToContent: "autoSizeColumnsToContent" }, outputs: { action: "action", clickRow: "clickRow", rowDragEnd: "rowDragEnd", viewportChanged: "viewportChanged", rowSelected: "rowSelected" }, viewQueries: [{ propertyName: "hiddenElement", first: true, predicate: ["hidden"], descendants: true, static: true }, { propertyName: "popupmenu", first: true, predicate: ["popupmenu"], descendants: true }, { propertyName: "headerPopupMenu", first: true, predicate: ["headerpopupmenu"], descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractGrid, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i1.PreferencesService }, { type: i2.I18nService }, { type: i3.DialogService }], propDecorators: { headerMenu: [{ type: Input }], menu: [{ type: Input }], preferenceName: [{ type: Input }], multipleSelection: [{ type: Input }], showChecks: [{ type: Input }], headerCheckboxSelection: [{ type: Input }], rowData: [{ type: Input }], noRowsText: [{ type: Input }], loadingText: [{ type: Input }], removeSelectionOnOpenContextMenu: [{ type: Input }], autoSizeColumnsToContent: [{ type: Input }], action: [{ type: Output }], clickRow: [{ type: Output }], rowDragEnd: [{ type: Output }], viewportChanged: [{ type: Output }], rowSelected: [{ type: Output }], hiddenElement: [{ type: ViewChild, args: ['hidden', { static: true }] }], popupmenu: [{ type: ViewChild, args: ['popupmenu', { static: false }] }], headerPopupMenu: [{ type: ViewChild, args: ['headerpopupmenu', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvZ3JpZC9hYnN0cmFjdC1ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUl4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUMsTUFBTSxnREFBZ0QsQ0FBQztBQUM1SCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUMvRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGtCQUFrQixFQUF1Qiw2QkFBNkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7OztBQUt4SCxNQUFNLE9BQWdCLFlBQVk7YUFFVixxQkFBZ0IsR0FBRyxhQUFhLEFBQWhCLENBQWlCO2FBQ2pDLG1CQUFjLEdBQUcsV0FBVyxBQUFkLENBQWU7SUFrQ3BELFlBQWdDLGtCQUFzQyxFQUFZLFdBQXdCLEVBQ3pGLGFBQTRCO1FBRGIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pGLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBOUJ0QywyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFNdEIsc0JBQWlCLEdBQUcs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QUF6QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSx1QkFBdUI7c0JBQXRDLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsZ0NBQWdDO3NCQUEvQyxLQUFLO2dCQUNVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFFVyxNQUFNO3NCQUF0QixNQUFNO2dCQUNVLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsVUFBVTtzQkFBMUIsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBRXFDLGFBQWE7c0JBQXhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYSxTQUFTO3NCQUF4RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ2UsZUFBZTtzQkFBcEUsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbERlZiwgQ29sdW1uLCBDb2x1bW5BcGksIEdyaWRPcHRpb25zLCBJc0Z1bGxXaWR0aFJvd1BhcmFtcyB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IEdyaWRDb250ZXh0TWVudU9wdGlvbiB9IGZyb20gJy4vY29udGV4dG1lbnUvZ3JpZC1jb250ZXh0LW1lbnUtb3B0aW9uJztcbmltcG9ydCB7IEdyaWRDb250ZXh0TWVudUFjdGlvbkRhdGEgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtY29udGV4dC1tZW51LWFjdGlvbi1kYXRhJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnc3lzdGVsYWItcHJlZmVyZW5jZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdzeXN0ZWxhYi10cmFuc2xhdGUnO1xuaW1wb3J0IHsgU3R5bGVzVXRpbFNlcnZpY2UgfSBmcm9tICcuLi91dGlsaXRpZXMvc3R5bGVzLnV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkQ29udGV4dE1lbnVDb21wb25lbnQsIEdyaWRSb3dNZW51QWN0aW9uSGFuZGxlciB9IGZyb20gJy4vY29udGV4dG1lbnUvZ3JpZC1jb250ZXh0LW1lbnUtY29tcG9uZW50JztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uc09wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvZ3JpZC1jb2x1bW4tb3B0aW9ucyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uT3B0aW9uc0RpYWxvZywgR3JpZENvbHVtbk9wdGlvbnNEaWFsb2dQYXJhbWV0ZXJzIH0gZnJvbSAnLi9vcHRpb25zL2dyaWQtY29sdW1uLW9wdGlvbnMtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkQ29udGV4dE1lbnVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtY29udGV4dC1tZW51LWNlbGwtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFR3b0xpc3RJdGVtIH0gZnJvbSAnLi4vdHdvbGlzdC90d28tbGlzdC11dGlsaXRpZXMnO1xuaW1wb3J0IHsgR3JpZEhlYWRlckNvbnRleHRNZW51LCBHcmlkSGVhZGVyTWVudUFjdGlvbkhhbmRsZXIgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtaGVhZGVyLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0b3NpemVHcmlkSGVscGVyLCBDYWxjdWxhdGVkR3JpZFN0YXRlLCBpbml0aWFsaXplQ2FsY3VsYXRlZEdyaWRTdGF0ZSB9IGZyb20gJy4uL2hlbHBlci9hdXRvc2l6ZS1ncmlkLWhlbHBlcic7XG5cbmV4cG9ydCB0eXBlIHJvd1NlbGVjdGlvblR5cGUgPSAnc2luZ2xlJyB8ICdtdWx0aXBsZSc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R3JpZDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgR3JpZFJvd01lbnVBY3Rpb25IYW5kbGVyLCBHcmlkSGVhZGVyTWVudUFjdGlvbkhhbmRsZXIge1xuXG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29udGV4dE1lbnVDb2xJZCA9ICdjb250ZXh0TWVudSc7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc2VsZWN0aW9uQ29sSWQgPSAnc2VsZWN0Q29sJztcblxuXHRwdWJsaWMgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xuXHRwdWJsaWMgb3ZlcmxheU5vUm93c1RlbXBsYXRlO1xuXHRwdWJsaWMgb3ZlcmxheUxvYWRpbmdUZW1wbGF0ZTtcblx0cHVibGljIHN0YXJ0Q2VsbEVkaXRvcldpdGhUYWIgPSBmYWxzZTtcblxuXHRASW5wdXQoKSBwdWJsaWMgaGVhZGVyTWVudTogQXJyYXk8R3JpZENvbnRleHRNZW51T3B0aW9uPE9iamVjdD4+O1xuXHRASW5wdXQoKSBwdWJsaWMgbWVudTogQXJyYXk8R3JpZENvbnRleHRNZW51T3B0aW9uPFQ+PjtcblxuXHRASW5wdXQoKSBwdWJsaWMgcHJlZmVyZW5jZU5hbWU6IHN0cmluZztcblx0QElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBzaG93Q2hlY2tzID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJDaGVja2JveFNlbGVjdGlvbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8VD4gPSBbXTtcblx0QElucHV0KCkgcHVibGljIG5vUm93c1RleHQ7XG5cdEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nVGV4dDtcblx0QElucHV0KCkgcHVibGljIHJlbW92ZVNlbGVjdGlvbk9uT3BlbkNvbnRleHRNZW51ID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBhdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQgPSBmYWxzZTtcblxuXHRAT3V0cHV0KCkgcHVibGljIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyBjbGlja1JvdyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyByb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcHVibGljIHZpZXdwb3J0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRAVmlld0NoaWxkKCdoaWRkZW4nLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGhpZGRlbkVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ3BvcHVwbWVudScsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIHBvcHVwbWVudTogR3JpZENvbnRleHRNZW51Q29tcG9uZW50PFQ+O1xuXHRAVmlld0NoaWxkKCdoZWFkZXJwb3B1cG1lbnUnLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyBoZWFkZXJQb3B1cE1lbnU6IEdyaWRIZWFkZXJDb250ZXh0TWVudTxPYmplY3Q+O1xuXG5cdHByb3RlY3RlZCBmaXJzdFNpemVUb0ZpdEV4ZWN1dGVkID0gZmFsc2U7XG5cdHByaXZhdGUgY2FsY3VsYXRlZEdyaWRTdGF0ZTogQ2FsY3VsYXRlZEdyaWRTdGF0ZTtcblx0cHJpdmF0ZSBzY3JvbGxUaW1lb3V0O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcHJlZmVyZW5jZXNTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG5cdFx0XHRcdFx0XHQgIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XG5cdH1cblxuXHRwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG5cblx0XHR0aGlzLmdyaWRPcHRpb25zID0gdGhpcy5nZXRJbml0aWFsR3JpZE9wdGlvbnMoKTtcblxuXHRcdGlmICh0aGlzLm5vUm93c1RleHQpIHtcblx0XHRcdHRoaXMub3ZlcmxheU5vUm93c1RlbXBsYXRlID0gdGhpcy5ub1Jvd3NUZXh0O1xuXHRcdFx0dGhpcy5vdmVybGF5TG9hZGluZ1RlbXBsYXRlID0gdGhpcy5sb2FkaW5nVGV4dDtcblx0XHR9XG5cdFx0dGhpcy5jYWxjdWxhdGVkR3JpZFN0YXRlID0gaW5pdGlhbGl6ZUNhbGN1bGF0ZWRHcmlkU3RhdGUodGhpcy5hdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGdldEluaXRpYWxHcmlkT3B0aW9ucygpOiBHcmlkT3B0aW9ucyB7XG5cdFx0Y29uc3Qgcm93SGVpZ2h0ID0gU3R5bGVzVXRpbFNlcnZpY2UuZ2V0U3R5bGVWYWx1ZSh0aGlzLmhpZGRlbkVsZW1lbnQsICdsaW5lLWhlaWdodCcpO1xuXHRcdGNvbnN0IGhlYWRlckhlaWdodCA9IFN0eWxlc1V0aWxTZXJ2aWNlLmdldFN0eWxlVmFsdWUodGhpcy5oaWRkZW5FbGVtZW50LCAnaGVpZ2h0Jyk7XG5cblx0XHRjb25zdCBvcHRpb25zOiBHcmlkT3B0aW9ucyA9IHt9O1xuXG5cdFx0b3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5nZXRDb2x1bW5EZWZzV2l0aE9wdGlvbnMoKTtcblx0XHRvcHRpb25zLnJvd0hlaWdodCA9IE51bWJlcihyb3dIZWlnaHQpO1xuXHRcdG9wdGlvbnMuaGVhZGVySGVpZ2h0ID0gTnVtYmVyKGhlYWRlckhlaWdodCk7XG5cdFx0b3B0aW9ucy5zdXBwcmVzc0RyYWdMZWF2ZUhpZGVzQ29sdW1ucyA9IHRydWU7XG5cdFx0b3B0aW9ucy5zdXBwcmVzc0NlbGxGb2N1cyA9IHRydWU7XG5cdFx0b3B0aW9ucy5lbmFibGVSYW5nZVNlbGVjdGlvbiA9IHRydWU7XG5cdFx0b3B0aW9ucy5zdG9wRWRpdGluZ1doZW5DZWxsc0xvc2VGb2N1cyA9IHRydWU7XG5cdFx0b3B0aW9ucy5zaW5nbGVDbGlja0VkaXQgPSB0cnVlO1xuXHRcdG9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcblx0XHRcdHJlc2l6YWJsZTogdGhpcy5pc0NvbFJlc2l6ZUVuYWJsZWQoKVxuXHRcdH07XG5cdFx0b3B0aW9ucy5yb3dTZWxlY3Rpb24gPSB0aGlzLmdldFJvd1NlbGVjdGlvblR5cGUoKTtcblx0XHRvcHRpb25zLmxvY2FsZVRleHQgPSB7XG5cdFx0XHRub1Jvd3NUb1Nob3c6IHRoaXMuaTE4blNlcnZpY2UuaW5zdGFudCgnQ09NTU9OX05PX1JPV1NfVE9fU0hPVycpLFxuXHRcdFx0bG9hZGluZ09vbzogICB0aGlzLmkxOG5TZXJ2aWNlLmluc3RhbnQoJ0NPTU1PTl9MT0FESU5HJylcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuaGlkZUhlYWRlcigpKSB7XG5cdFx0XHRvcHRpb25zLmhlYWRlckhlaWdodCA9IDA7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnNob3dDaGVja3MpIHtcblx0XHRcdGlmICh0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHRcdG9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG9wdGlvbnMuaXNGdWxsV2lkdGhSb3cgPSAoaXNGdWxsV2lkdGhSb3dQYXJhbXM6IElzRnVsbFdpZHRoUm93UGFyYW1zKSA9PiB0aGlzLmdldElzRnVsbFdpZHRoUm93KGlzRnVsbFdpZHRoUm93UGFyYW1zKTtcblx0XHRvcHRpb25zLmZ1bGxXaWR0aENlbGxSZW5kZXJlciA9IHRoaXMuZ2V0RnVsbFdpZHRoQ2VsbFJlbmRlcmVyKCk7XG5cdFx0b3B0aW9ucy5jb250ZXh0ID0ge2NvbXBvbmVudFBhcmVudDogdGhpc307XG5cdFx0b3B0aW9ucy5vbkNlbGxFZGl0aW5nU3RhcnRlZCA9IChldmVudCkgPT4gdGhpcy5vbkNlbGxFZGl0aW5nU3RhcnRlZChldmVudCk7XG5cblx0XHRyZXR1cm4gb3B0aW9ucztcblx0fVxuXG5cdHByb3RlY3RlZCBvbkNlbGxFZGl0aW5nU3RhcnRlZChldmVudDogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5zdGFydENlbGxFZGl0b3JXaXRoVGFiID0gZXZlbnQuZXZlbnQ/LmtleSA9PT0gJ1RhYic7XG5cdH1cblxuXHRwdWJsaWMgb25Nb2RlbFVwZGF0ZWQoZXZlbnQ6IGFueSkge1xuXHRcdHRoaXMuZG9BdXRvU2l6ZU1hbmFnZW1lbnQoKTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH1cblxuXHRwdWJsaWMgZG9HcmlkUmVhZHkoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMubG9hZENvbHVtbnNTdGF0ZUZyb21QcmVmZXJlbmNlcygpO1xuXG5cdFx0aWYodGhpcy5hdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQpIHtcblx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFkZEV2ZW50TGlzdGVuZXIoJ2JvZHlTY3JvbGwnLCB0aGlzLm9uQm9keVNjcm9sbC5iaW5kKHRoaXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kb0F1dG9TaXplTWFuYWdlbWVudCgpO1xuXHRcdH1cblx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5Nb3ZlZCcsIHRoaXMuc2F2ZUNvbHVtbnNTdGF0ZUluUHJlZmVyZW5jZXMuYmluZCh0aGlzKSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2F2ZUNvbHVtbnNTdGF0ZUluUHJlZmVyZW5jZXMoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZmlyc3RTaXplVG9GaXRFeGVjdXRlZCkge1xuXHRcdFx0dGhpcy5wcmVmZXJlbmNlc1NlcnZpY2UucHV0KHRoaXMuZ2V0R3JpZE9wdGlvbnNQcmVmZXJlbmNlc1ByZWZpeCgpLCB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbkFwaS5nZXRDb2x1bW5TdGF0ZSgpKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgbG9hZENvbHVtbnNTdGF0ZUZyb21QcmVmZXJlbmNlcygpOiB2b2lkIHtcblx0XHR0aGlzLmxvYWRDb2x1bW5zU3RhdGUodGhpcy5nZXRHcmlkT3B0aW9uc1ByZWZlcmVuY2VzUHJlZml4KCksIHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uQXBpKTtcblx0fVxuXG5cdHByaXZhdGUgbG9hZENvbHVtbnNTdGF0ZShwcmVmaXg6IHN0cmluZywgY29sdW1uQXBpOiBDb2x1bW5BcGkpOiB2b2lkIHtcblxuXHRcdGlmICh0aGlzLnByZWZlcmVuY2VzU2VydmljZS5nZXQocHJlZml4KSkge1xuXG5cdFx0XHRjb25zdCBncmlkT3B0aW9uc1ByZWZlcmVuY2VzOiBBcnJheTxhbnk+ID0gdGhpcy5wcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KHByZWZpeCk7XG5cblx0XHRcdC8vIEZpbHRlcmVkIHByZWZlcmVuY2VzIGNvbHVtbnMgdGhhdCBhcmUgbm90IGluIHRoZSBjdXJyZW50IGNvbHVtbkRlZi5cblx0XHRcdGNvbnN0IGZpbHRlcmVkR3JpZE9wdGlvbnNQcmVmZXJlbmNlczogQXJyYXk8YW55PiA9IGdyaWRPcHRpb25zUHJlZmVyZW5jZXNcblx0XHRcdFx0LmZpbHRlcihjb2xQcmVmID0+IGNvbHVtbkFwaS5nZXRDb2x1bW5zKClcblx0XHRcdFx0XHQuc29tZShjb2x1bW4gPT4gY29sUHJlZi5jb2xJZCA9PT0gY29sdW1uLmdldENvbElkKCkpKTtcblxuXHRcdFx0Ly8gU2hvdyB