UNPKG

@lucasferreiralsf/angular-frontend-library

Version:

This is a set of custom angular components to easy the development of any Subway frontend project.

355 lines 31.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild, Renderer2 } from '@angular/core'; import { SelectionModel } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material'; import { DataTableService } from './data-table.service'; import { map } from 'rxjs/operators'; import { PopoverService } from './popover/popover.service'; import { trigger, transition, useAnimation } from '@angular/animations'; import { flipInX, flipOutX } from 'ng-animate'; /** * @record */ export function DataTableColumnNamesInterface() { } if (false) { /** @type {?} */ DataTableColumnNamesInterface.prototype.columnNameApi; /** @type {?} */ DataTableColumnNamesInterface.prototype.displayName; } /** * @record */ export function DataTableInputDataInterface() { } if (false) { /** @type {?} */ DataTableInputDataInterface.prototype.id; /** @type {?} */ DataTableInputDataInterface.prototype.actions; } /** * @record */ export function DataTableActionsInterface() { } if (false) { /** @type {?} */ DataTableActionsInterface.prototype.actionName; /** @type {?} */ DataTableActionsInterface.prototype.actionDescription; /** @type {?} */ DataTableActionsInterface.prototype.actionIcon; /** @type {?} */ DataTableActionsInterface.prototype.actionFunction; /** @type {?|undefined} */ DataTableActionsInterface.prototype.isDelete; /** @type {?|undefined} */ DataTableActionsInterface.prototype.isDeleteTitle; /** @type {?|undefined} */ DataTableActionsInterface.prototype.isDeleteDescription; } /** * @record */ export function DataTableTopActionButtonInterface() { } if (false) { /** @type {?} */ DataTableTopActionButtonInterface.prototype.actionName; /** @type {?} */ DataTableTopActionButtonInterface.prototype.eventSlug; /** @type {?} */ DataTableTopActionButtonInterface.prototype.buttonType; /** @type {?|undefined} */ DataTableTopActionButtonInterface.prototype.buttonColor; } export class DataTableComponent { /** * @param {?} dataTableService * @param {?} popoverService * @param {?} renderer */ constructor(dataTableService, popoverService, renderer) { this.dataTableService = dataTableService; this.popoverService = popoverService; this.renderer = renderer; this.selectColumn = false; this.columnNames = []; this.actions = []; this.inputData = []; this.topActionButtons = []; this.displayedColumns = []; this.columnsToDisplay = []; this.selection = new SelectionModel(true, []); this.columnsNameApi = []; this.topButtonStyle = { height: '32px', 'line-height': '32px' }; } /** * @return {?} */ ngOnInit() { this.data = this.dataTableService.setDataSource(this.inputData); this.columnsNameApi = this.columnNames.map((/** * @param {?} e * @return {?} */ e => e.columnNameApi)); this.displayColumns(); this.dataTableService.inputDataEvent.subscribe((/** * @param {?} inputData * @return {?} */ inputData => { this.load(inputData); })); } /** * @param {?} inputData * @return {?} */ load(inputData) { this.inputData = inputData; this.columnsNameApi = this.columnNames.map((/** * @param {?} e * @return {?} */ e => e.columnNameApi)); this.data = this.dataTableService.setDataSource(this.inputData); this.noData = this.data.connect().pipe(map((/** * @param {?} data * @return {?} */ data => data.length === 0))); this.data.paginator = this.paginator; this.addActionsToData(); this.displayColumns(); this.popoverService.buttonClickEvent.subscribe((/** * @param {?} event * @return {?} */ event => { this.buttonRowClick(event.event, event.elementId); })); } /** * @return {?} */ filterLimparButtonClick() { this.dataTableService.filterLimparButtonClick(); } /** * @return {?} */ filterPesquisarButtonClick() { this.dataTableService.filterPesquisarButtonClick(); } /** * @param {?} eventSlug * @return {?} */ topButtonClick(eventSlug) { this.dataTableService.topButtonClick(eventSlug); } /** * @param {?} event * @param {?} index * @return {?} */ buttonRowClick(event, index) { // console.log(`buttonRowClick: ${event.toLowerCase()}, ${index.toLowerCase()}`); this.dataTableService.buttonRowClick(event.toLowerCase(), index); } /** * @return {?} */ addActionsToData() { this.data.data.map((/** * @param {?} e * @return {?} */ e => { // tslint:disable-next-line: no-string-literal e['actions'] = Object.assign({}, this.actions); })); } /** * @return {?} */ isAllSelected() { /** @type {?} */ const numSelected = this.selection.selected.length; /** @type {?} */ const numRows = this.data.data.length; return numSelected === numRows; } /** * @return {?} */ masterToggle() { this.isAllSelected() ? this.selection.clear() : this.data.data.forEach((/** * @param {?} row * @return {?} */ row => this.selection.select(row))); } /** * @return {?} */ displayColumns() { if (this.selectColumn) { this.addSelectToDisplayedColumns(); } if (this.actions.length >= 0) { this.addActionsToDisplayedColumns(); } } /** * @return {?} */ addSelectToDisplayedColumns() { /** @type {?} */ const select = ['select']; if (this.columnsNameApi && this.columnsNameApi.length !== 0) { this.columnsNameApi = select.concat(this.columnsNameApi); this.displayedColumns = this.columnsNameApi; this.columnsToDisplay = this.displayedColumns.slice(); } else { this.displayedColumns = select.concat(Object.keys(this.data[0])); this.columnsToDisplay = this.displayedColumns.slice(); } } /** * @return {?} */ addActionsToDisplayedColumns() { /** @type {?} */ const actions = ['actions']; if (this.columnsNameApi && this.columnsNameApi.length !== 0) { this.columnsNameApi.push(actions[0]); this.displayedColumns = this.columnsNameApi; this.columnsToDisplay = this.displayedColumns.slice(); } else { this.displayedColumns = actions.concat(Object.keys(this.data[0])); this.columnsToDisplay = this.displayedColumns.slice(); } } /** * @param {?} columnNameApi * @return {?} */ verifyNameColumn(columnNameApi) { /** @type {?} */ const columnNameApiArray = this.columnNames.map((/** * @param {?} e * @return {?} */ e => e.columnNameApi)); /** @type {?} */ const indexcolumnNameApi = columnNameApiArray.indexOf(columnNameApi); if (indexcolumnNameApi >= 0) { return this.columnNames[indexcolumnNameApi].displayName; } else { return columnNameApi; } } /** * @return {?} */ addColumn() { /** @type {?} */ const randomColumn = Math.floor(Math.random() * this.displayedColumns.length); this.columnsToDisplay.push(this.displayedColumns[randomColumn]); } /** * @return {?} */ removeColumn() { if (this.columnsToDisplay.length) { this.columnsToDisplay.pop(); } } } DataTableComponent.decorators = [ { type: Component, args: [{ selector: 'sb-data-table', template: "<div>\r\n <div fxLayout fxLayoutAlign=\"space-between center\" class=\"mr-16 ml-16 mb-5\">\r\n <div #topButtonAction fxLayout=\"row wrap\" fxLayoutAlign=\"flex-start center\" fxLayoutGap=\"10px grid\">\r\n <sb-button\r\n *ngFor=\"let buttonElement of topActionButtons\"\r\n [materialTypeButton]=\"buttonElement.buttonType\"\r\n [color]=\"buttonElement.buttonColor\"\r\n [actionName]=\"buttonElement.actionName\"\r\n [customStyles]=\"topButtonStyle\"\r\n (buttonClick)=\"topButtonClick(buttonElement.eventSlug)\"\r\n ></sb-button>\r\n </div>\r\n <sb-filter-table (limpar)=\"filterLimparButtonClick()\" (pesquisa)=\"filterPesquisarButtonClick()\">\r\n <ng-content select=\".sb-data-table-content\"></ng-content>\r\n </sb-filter-table>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" style=\"width: 100%;\" class=\"table-striped table-hover\">\r\n <!-- Checkbox Column -->\r\n\r\n <ng-container [matColumnDef]=\"column\" *ngFor=\"let column of displayedColumns\">\r\n <div *ngIf=\"column == 'select'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n >\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </div>\r\n <div *ngIf=\"column !== 'select' && column !== 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n {{ verifyNameColumn(column) }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\">{{ element[column] }}</td>\r\n </div>\r\n <div *ngIf=\"column == 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>A\u00E7\u00F5es</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div fxLayout>\r\n <div *ngFor=\"let buttonElement of (element.actions | keyvalue)\">\r\n <button\r\n mat-icon-button\r\n *ngIf=\"!buttonElement.value.isDelete\"\r\n (click)=\"buttonRowClick(buttonElement.value.actionName, element.id)\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n >\r\n <mat-icon>{{ buttonElement.value.actionIcon }}</mat-icon>\r\n </button>\r\n <sb-popover\r\n *ngIf=\"buttonElement.value.isDelete\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n elementId=\"{{ element.id }}\"\r\n popoverTitle=\"{{ buttonElement.value.isDeleteTitle }}\"\r\n popoverDescription=\"{{ buttonElement.value.isDeleteDescription }}\"\r\n ></sb-popover>\r\n </div>\r\n </div>\r\n </td>\r\n </div>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: columnsToDisplay\" (click)=\"selection.toggle(row)\"></tr>\r\n </table>\r\n\r\n <div @flipInOut *ngIf=\"data.data.length == 0\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxLayoutGap=\"5px\" class=\"m-30\">\r\n <img src=\"../../../assets/img/nodata.svg\" />\r\n <p class=\" mat-caption\">\r\n Sem Registros\r\n </p>\r\n </div>\r\n\r\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 100]\" class=\"mt-10\"></mat-paginator>\r\n</div>\r\n", animations: [ trigger('flipInOut', [ transition('void => *', useAnimation(flipInX, { params: { timing: 0.3, delay: 0, a: '10px', b: '0' } })), transition('* => void', useAnimation(flipOutX, { params: { timing: 0.3, delay: 0 } })) ]) ], styles: ["td.mat-cell:last-of-type,td.mat-footer-cell:last-of-type,th.mat-header-cell:last-of-type{width:180px;text-align:center}"] }] } ]; /** @nocollapse */ DataTableComponent.ctorParameters = () => [ { type: DataTableService }, { type: PopoverService }, { type: Renderer2 } ]; DataTableComponent.propDecorators = { selectColumn: [{ type: Input }], columnNames: [{ type: Input }], actions: [{ type: Input }], inputData: [{ type: Input }], topActionButtons: [{ type: Input }], paginator: [{ type: ViewChild, args: [MatPaginator,] }] }; if (false) { /** @type {?} */ DataTableComponent.prototype.selectColumn; /** @type {?} */ DataTableComponent.prototype.columnNames; /** @type {?} */ DataTableComponent.prototype.actions; /** @type {?} */ DataTableComponent.prototype.inputData; /** @type {?} */ DataTableComponent.prototype.topActionButtons; /** @type {?} */ DataTableComponent.prototype.paginator; /** @type {?} */ DataTableComponent.prototype.data; /** @type {?} */ DataTableComponent.prototype.displayedColumns; /** @type {?} */ DataTableComponent.prototype.columnsToDisplay; /** @type {?} */ DataTableComponent.prototype.selection; /** @type {?} */ DataTableComponent.prototype.columnsNameApi; /** @type {?} */ DataTableComponent.prototype.noData; /** @type {?} */ DataTableComponent.prototype.topButtonStyle; /** * @type {?} * @private */ DataTableComponent.prototype.dataTableService; /** * @type {?} * @private */ DataTableComponent.prototype.popoverService; /** * @type {?} * @private */ DataTableComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVjYXNmZXJyZWlyYWxzZi9hbmd1bGFyLWZyb250ZW5kLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFzQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7O0FBRS9DLG1EQUdDOzs7SUFGQyxzREFBc0I7O0lBQ3RCLG9EQUFvQjs7Ozs7QUFHdEIsaURBR0M7OztJQUZDLHlDQUFXOztJQUNYLDhDQUFtQzs7Ozs7QUFHckMsK0NBUUM7OztJQVBDLCtDQUFtQjs7SUFDbkIsc0RBQTBCOztJQUMxQiwrQ0FBbUI7O0lBQ25CLG1EQUFvQjs7SUFDcEIsNkNBQW1COztJQUNuQixrREFBdUI7O0lBQ3ZCLHdEQUE2Qjs7Ozs7QUFHL0IsdURBS0M7OztJQUpDLHVEQUFtQjs7SUFDbkIsc0RBQWtCOztJQUNsQix1REFBbUI7O0lBQ25CLHdEQUFxQjs7QUF3QnZCLE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQXFCN0Is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QyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO3lCQUNyRCxDQUFDLENBQ0g7d0JBQ0QsVUFBVSxDQUNSLFdBQVcsRUFDWCxZQUFZLENBQUMsUUFBUSxFQUFFOzRCQUNyQixNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7eUJBQ2xDLENBQUMsQ0FDSDtxQkFDRixDQUFDO2lCQUNIOzthQUNGOzs7O1lBckRRLGdCQUFnQjtZQUVoQixjQUFjO1lBUnJCLFNBQVM7OzsyQkE2RFIsS0FBSzswQkFDTCxLQUFLO3NCQUNMLEtBQUs7d0JBQ0wsS0FBSzsrQkFDTCxLQUFLO3dCQUVMLFNBQVMsU0FBQyxZQUFZOzs7O0lBTnZCLDBDQUE4Qjs7SUFDOUIseUNBQTJEOztJQUMzRCxxQ0FBbUQ7O0lBQ25ELHVDQUF1RDs7SUFDdkQsOENBQW9FOztJQUVwRSx1Q0FBaUQ7O0lBRWpELGtDQUE4Qjs7SUFDOUIsOENBQWdDOztJQUNoQyw4Q0FBZ0M7O0lBQ2hDLHVDQUF5Qzs7SUFDekMsNENBQThCOztJQUM5QixvQ0FBTzs7SUFFUCw0Q0FHRTs7Ozs7SUFHQSw4Q0FBMEM7Ozs7O0lBQzFDLDRDQUFzQzs7Ozs7SUFDdEMsc0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBSZW5kZXJlcjIsXHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtdGFibGUuc2VydmljZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUG9wb3ZlclNlcnZpY2UgfSBmcm9tICcuL3BvcG92ZXIvcG9wb3Zlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGZsaXBJblgsIGZsaXBPdXRYIH0gZnJvbSAnbmctYW5pbWF0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZUNvbHVtbk5hbWVzSW50ZXJmYWNlIHtcclxuICBjb2x1bW5OYW1lQXBpOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVJbnB1dERhdGFJbnRlcmZhY2Uge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uc0ludGVyZmFjZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVBY3Rpb25zSW50ZXJmYWNlIHtcclxuICBhY3Rpb25OYW1lOiBzdHJpbmc7XHJcbiAgYWN0aW9uRGVzY3JpcHRpb246IHN0cmluZztcclxuICBhY3Rpb25JY29uOiBzdHJpbmc7XHJcbiAgYWN0aW9uRnVuY3Rpb246IGFueTtcclxuICBpc0RlbGV0ZT86IGJvb2xlYW47XHJcbiAgaXNEZWxldGVUaXRsZT86IHN0cmluZztcclxuICBpc0RlbGV0ZURlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZVRvcEFjdGlvbkJ1dHRvbkludGVyZmFjZSB7XHJcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xyXG4gIGV2ZW50U2x1Zzogc3RyaW5nO1xyXG4gIGJ1dHRvblR5cGU6IHN0cmluZztcclxuICBidXR0b25Db2xvcj86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYi1kYXRhLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ2ZsaXBJbk91dCcsIFtcclxuICAgICAgdHJhbnNpdGlvbihcclxuICAgICAgICAndm9pZCA9PiAqJyxcclxuICAgICAgICB1c2VBbmltYXRpb24oZmxpcEluWCwge1xyXG4gICAgICAgICAgcGFyYW1zOiB7IHRpbWluZzogMC4zLCBkZWxheTogMCwgYTogJzEwcHgnLCBiOiAnMCcgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zaXRpb24oXHJcbiAgICAgICAgJyogPT4gdm9pZCcsXHJcbiAgICAgICAgdXNlQW5pbWF0aW9uKGZsaXBPdXRYLCB7XHJcbiAgICAgICAgICBwYXJhbXM6IHsgdGltaW5nOiAwLjMsIGRlbGF5OiAwIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgc2VsZWN0Q29sdW1uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY29sdW1uTmFtZXM6IERhdGFUYWJsZUNvbHVtbk5hbWVzSW50ZXJmYWNlW10gPSBbXTtcclxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25zSW50ZXJmYWNlW10gPSBbXTtcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IERhdGFUYWJsZUlucHV0RGF0YUludGVyZmFjZVtdID0gW107XHJcbiAgQElucHV0KCkgdG9wQWN0aW9uQnV0dG9uczogRGF0YVRhYmxlVG9wQWN0aW9uQnV0dG9uSW50ZXJmYWNlW10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG5cclxuICBkYXRhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGNvbHVtbnNUb0Rpc3BsYXk6IHN0cmluZ1tdID0gW107XHJcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRydWUsIFtdKTtcclxuICBjb2x1bW5zTmFtZUFwaTogc3RyaW5nW10gPSBbXTtcclxuICBub0RhdGE7XHJcblxyXG4gIHRvcEJ1dHRvblN0eWxlOiB7fSA9IHtcclxuICAgIGhlaWdodDogJzMycHgnLFxyXG4gICAgJ2xpbmUtaGVpZ2h0JzogJzMycHgnXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGFUYWJsZVNlcnZpY2U6IERhdGFUYWJsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvcG92ZXJTZXJ2aWNlOiBQb3BvdmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc2V0RGF0YVNvdXJjZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICB0aGlzLmNvbHVtbnNOYW1lQXBpID0gdGhpcy5jb2x1bW5OYW1lcy5tYXAoZSA9PiBlLmNvbHVtbk5hbWVBcGkpO1xyXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1ucygpO1xyXG4gICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmlucHV0RGF0YUV2ZW50LnN1YnNjcmliZShpbnB1dERhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxvYWQoaW5wdXREYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZChpbnB1dERhdGEpIHtcclxuICAgIHRoaXMuaW5wdXREYXRhID0gaW5wdXREYXRhO1xyXG4gICAgdGhpcy5jb2x1bW5zTmFtZUFwaSA9IHRoaXMuY29sdW1uTmFtZXMubWFwKGUgPT4gZS5jb2x1bW5OYW1lQXBpKTtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5zZXREYXRhU291cmNlKHRoaXMuaW5wdXREYXRhKTtcclxuICAgIHRoaXMubm9EYXRhID0gdGhpcy5kYXRhLmNvbm5lY3QoKS5waXBlKG1hcChkYXRhID0+IGRhdGEubGVuZ3RoID09PSAwKSk7XHJcbiAgICB0aGlzLmRhdGEucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB0aGlzLmFkZEFjdGlvbnNUb0RhdGEoKTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMoKTtcclxuICAgIHRoaXMucG9wb3ZlclNlcnZpY2UuYnV0dG9uQ2xpY2tFdmVudC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLmJ1dHRvblJvd0NsaWNrKGV2ZW50LmV2ZW50LCBldmVudC5lbGVtZW50SWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJMaW1wYXJCdXR0b25DbGljaygpIHtcclxuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5maWx0ZXJMaW1wYXJCdXR0b25DbGljaygpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUGVzcXVpc2FyQnV0dG9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZmlsdGVyUGVzcXVpc2FyQnV0dG9uQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIHRvcEJ1dHRvbkNsaWNrKGV2ZW50U2x1Zzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UudG9wQnV0dG9uQ2xpY2soZXZlbnRTbHVnKTtcclxuICB9XHJcblxyXG4gIGJ1dHRvblJvd0NsaWNrKGV2ZW50OiBzdHJpbmcsIGluZGV4KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhgYnV0dG9uUm93Q2xpY2s6ICR7ZXZlbnQudG9Mb3dlckNhc2UoKX0sICR7aW5kZXgudG9Mb3dlckNhc2UoKX1gKTtcclxuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5idXR0b25Sb3dDbGljayhldmVudC50b0xvd2VyQ2FzZSgpLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRBY3Rpb25zVG9EYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhLmRhdGEubWFwKGUgPT4ge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXN0cmluZy1saXRlcmFsXHJcbiAgICAgIGVbJ2FjdGlvbnMnXSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYWN0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGEuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICBtYXN0ZXJUb2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKVxyXG4gICAgICA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKClcclxuICAgICAgOiB0aGlzLmRhdGEuZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5Q29sdW1ucygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdENvbHVtbikge1xyXG4gICAgICB0aGlzLmFkZFNlbGVjdFRvRGlzcGxheWVkQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFjdGlvbnMubGVuZ3RoID49IDApIHtcclxuICAgICAgdGhpcy5hZGRBY3Rpb25zVG9EaXNwbGF5ZWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRTZWxlY3RUb0Rpc3BsYXllZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBbJ3NlbGVjdCddO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnNOYW1lQXBpICYmIHRoaXMuY29sdW1uc05hbWVBcGkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc05hbWVBcGkgPSBzZWxlY3QuY29uY2F0KHRoaXMuY29sdW1uc05hbWVBcGkpO1xyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNOYW1lQXBpO1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkgPSB0aGlzLmRpc3BsYXllZENvbHVtbnMuc2xpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHNlbGVjdC5jb25jYXQoT2JqZWN0LmtleXModGhpcy5kYXRhWzBdKSk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQWN0aW9uc1RvRGlzcGxheWVkQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGFjdGlvbnMgPSBbJ2FjdGlvbnMnXTtcclxuXHJcbiAgICBpZiAodGhpcy5jb2x1bW5zTmFtZUFwaSAmJiB0aGlzLmNvbHVtbnNOYW1lQXBpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNOYW1lQXBpLnB1c2goYWN0aW9uc1swXSk7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc05hbWVBcGk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gYWN0aW9ucy5jb25jYXQoT2JqZWN0LmtleXModGhpcy5kYXRhWzBdKSk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmVyaWZ5TmFtZUNvbHVtbihjb2x1bW5OYW1lQXBpKSB7XHJcbiAgICBjb25zdCBjb2x1bW5OYW1lQXBpQXJyYXk6IHN0cmluZ1tdID0gdGhpcy5jb2x1bW5OYW1lcy5tYXAoXHJcbiAgICAgIGUgPT4gZS5jb2x1bW5OYW1lQXBpXHJcbiAgICApO1xyXG4gICAgY29uc3QgaW5kZXhjb2x1bW5OYW1lQXBpOiBudW1iZXIgPSBjb2x1bW5OYW1lQXBpQXJyYXkuaW5kZXhPZihcclxuICAgICAgY29sdW1uTmFtZUFwaVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaW5kZXhjb2x1bW5OYW1lQXBpID49IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTmFtZXNbaW5kZXhjb2x1bW5OYW1lQXBpXS5kaXNwbGF5TmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBjb2x1bW5OYW1lQXBpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQ29sdW1uKCkge1xyXG4gICAgY29uc3QgcmFuZG9tQ29sdW1uID0gTWF0aC5mbG9vcihcclxuICAgICAgTWF0aC5yYW5kb20oKSAqIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5sZW5ndGhcclxuICAgICk7XHJcbiAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkucHVzaCh0aGlzLmRpc3BsYXllZENvbHVtbnNbcmFuZG9tQ29sdW1uXSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDb2x1bW4oKSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zVG9EaXNwbGF5Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkucG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==