UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

597 lines (596 loc) 50.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { AsiPaginationService } from './../../services/asi-pagination.service'; import { AsiTableSelectionModel } from './asi-table-config'; import { AsiTableRequest } from './asi-table-request'; import { AsiTableData } from './asi-table-data'; import { AsiTableColumn } from './asi-table-column.directive'; import { Component, QueryList, ContentChildren, Input, ViewChild, ElementRef } from '@angular/core'; import * as nh from '../../native-helper'; /** * @template T */ var AsiTable = /** @class */ (function () { function AsiTable(paginateService) { this.paginateService = paginateService; /** * Sorte table automatically */ this.autoSort = false; /** * Auto paginate the table */ this.autoPaginate = false; /** * Nb element by page */ this.nbElementParPage = 25; /** * Define a selection model */ this.selectionModel = new AsiTableSelectionModel('id', false); /** * Will call onRequestData when init */ this.fireRefreshOnInit = true; /** * Focus to the top of the table when page chanched */ this.changePageOnTop = false; this.columns = new Array(); this.data = new AsiTableData(); this.searchDone = false; this.loading = false; // Show allcheck checkbox allchecked this.allChecked = false; } /** * @return {?} */ AsiTable.prototype.getColumns = /** * @return {?} */ function () { var _this = this; return nh.filter(this.columns, function (column) { return _this.filtreColumn(column) && !column.inlineColumn; }); }; /** * @return {?} */ AsiTable.prototype.getInlineColumns = /** * @return {?} */ function () { var _this = this; return nh.filter(this.columns, function (column) { return _this.filtreColumn(column) && column.inlineColumn; }); }; /** * @param {?} column * @return {?} */ AsiTable.prototype.filtreColumn = /** * @param {?} column * @return {?} */ function (column) { return (column.showIf == null || column.showIf) && (column.hideIf == null || !column.hideIf); }; /** * @param {?} column * @return {?} */ AsiTable.prototype.getHeaderClass = /** * @param {?} column * @return {?} */ function (column) { /** @type {?} */ var columnClass = {}; if (column.columnClass) { if (column.columnClass instanceof Object) { // Copy columnClass = tslib_1.__assign({}, column.columnClass); } else if (typeof column.columnClass === 'string') { columnClass['' + column.columnClass] = true; } } columnClass.sortable = column.sortable; columnClass.asc = column.asc; columnClass.desc = column.asc === false; return columnClass; }; /** * @return {?} */ AsiTable.prototype.fireRefresh = /** * @return {?} */ function () { this.data.pageIndex = 1; this.requestData(); }; /** * @param {?} data * @return {?} */ AsiTable.prototype.updateData = /** * @param {?} data * @return {?} */ function (data) { this.data = data; if (this.autoPaginate) { this.noPaginateResults = data.results; this.paginateDatas(); } else { this.initCheckbox(); } if (this.autoSort) { this.sortDatas(); } }; /** * @param {?} column * @return {?} */ AsiTable.prototype.onSort = /** * @param {?} column * @return {?} */ function (column) { if (column.sortable) { if (this.sortedColumn != null && this.sortedColumn !== column) { this.sortedColumn.unsort(); } this.sortedColumn = column; column.toggleSort(); if (this.autoSort) { this.sortDatas(); } else { this.requestData(); } } }; /** * @param {?} pagination * @return {?} */ AsiTable.prototype.onPaginationChanged = /** * @param {?} pagination * @return {?} */ function (pagination) { this.data.pageIndex = pagination; if (this.autoPaginate) { this.paginateDatas(); } else { this.requestData(); } if (this.changePageOnTop) { this.topElement.nativeElement.scrollIntoView(); } }; /** * @return {?} */ AsiTable.prototype.paginateDatas = /** * @return {?} */ function () { this.data.results = this.paginateService.getPage(this.noPaginateResults, this.nbElementParPage, this.data.pageIndex); this.data.totalPages = this.paginateService.getNbPages(this.noPaginateResults, this.nbElementParPage); this.data.totalElements = this.noPaginateResults.length; this.initCheckbox(); }; /** * @return {?} */ AsiTable.prototype.requestData = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var request = this.getAsiTableRequest(); if (this.onRequestData) { if (this.requestDataSubcription != null) { // Ignore previous request this.requestDataSubcription.unsubscribe(); } this.requestDataSubcription = nh.observe(this.onRequestData(request)).subscribe(function (data) { _this.updateData(data); }); } }; /** * @return {?} */ AsiTable.prototype.getAsiTableRequest = /** * @return {?} */ function () { /** @type {?} */ var request = new AsiTableRequest(); request.pageIndex = this.data.pageIndex; request.nbElementsParPage = this.nbElementParPage; if (this.sortedColumn != null) { request.tri = this.sortedColumn.getSortName(); request.asc = this.sortedColumn.getAsc(); } return request; }; /** * @return {?} */ AsiTable.prototype.sortDatas = /** * @return {?} */ function () { if (this.sortedColumn != null) { if (!this.autoPaginate) { this.data.results = this.internalSortData(this.data.results); } else { this.noPaginateResults = this.internalSortData(this.noPaginateResults); this.paginateDatas(); } this.loading = false; } }; /** * @param {?} data * @return {?} */ AsiTable.prototype.internalSortData = /** * @param {?} data * @return {?} */ function (data) { /** @type {?} */ var sortInformation = { sort: this.sortedColumn.getSortName(), asc: this.sortedColumn.getAsc() }; if (this.sortedColumn.customSort) { this.sortedColumn.customSort(data, sortInformation); } else if (this.customSort) { this.customSort(data, sortInformation); } else { nh.orderByWithoutCase(data, this.sortedColumn.getSortName(), this.sortedColumn.getAsc() ? 'asc' : 'desc'); } return data; }; /** Recupere la valeur à afficher pour une cellule */ /** * Recupere la valeur à afficher pour une cellule * @param {?} row * @param {?} column * @return {?} */ AsiTable.prototype.getCellValue = /** * Recupere la valeur à afficher pour une cellule * @param {?} row * @param {?} column * @return {?} */ function (row, column) { return this.getProperty(row, column.name); }; /** * @param {?} object * @param {?} path * @return {?} */ AsiTable.prototype.getProperty = /** * @param {?} object * @param {?} path * @return {?} */ function (object, path) { return nh.get(object, path); }; /** * @return {?} */ AsiTable.prototype.initCheckbox = /** * @return {?} */ function () { var _this = this; this.columns.forEach(function (column) { if (column.type === 'checkbox') { if (_this.selectionModel.allChecked) { // If we are in allcheck mode we unselect excluded lines nh.forEach(_this.data.results, function (item) { /** @type {?} */ var itemId = _this.getProperty(item, _this.selectionModel.config.selectionId); /** @type {?} */ var excluded = nh.find(_this.selectionModel.itemsExcluded, function (excludeditem) { return _this.matchRow(itemId, excludeditem); }) != null; item.checked = !excluded; }); } else { // Else we select included lines nh.forEach(_this.data.results, function (item) { /** @type {?} */ var itemId = _this.getProperty(item, _this.selectionModel.config.selectionId); /** @type {?} */ var included = nh.find(_this.selectionModel.itemsIncluded, function (includedItem) { return _this.matchRow(itemId, includedItem); }) != null; item.checked = included; }); } } }); }; /** * @param {?} column * @return {?} */ AsiTable.prototype.onAllChecked = /** * @param {?} column * @return {?} */ function (column) { var _this = this; this.selectionModel.allChecked = this.allChecked; this.selectionModel.itemsIncluded = []; this.selectionModel.itemsExcluded = []; nh.forEach(this.data.results, function (data) { data.checked = _this.selectionModel.allChecked; }); if (this.selectionModel.allChecked) { if (this.selectionModel.config.multipage) { this.selectionModel.nbItemsSelected = this.data.totalElements; } else { this.selectionModel.nbItemsSelected = this.data.results.length; } } else { this.selectionModel.nbItemsSelected = 0; } column.onAllChecked.emit(this.selectionModel.allChecked); }; /** * @param {?} row * @param {?} column * @return {?} */ AsiTable.prototype.onChecked = /** * @param {?} row * @param {?} column * @return {?} */ function (row, column) { var _this = this; /** @type {?} */ var rowId = this.getProperty(row, this.selectionModel.config.selectionId); if (this.selectionModel.allChecked) { if (row.checked) { nh.remove(this.selectionModel.itemsExcluded, function (item) { return _this.matchRow(rowId, item); }); this.selectionModel.nbItemsSelected++; } else { this.selectionModel.itemsExcluded.push(row); this.selectionModel.nbItemsSelected--; } } else { if (row.checked) { this.selectionModel.itemsIncluded.push(row); this.selectionModel.nbItemsSelected++; } else { nh.remove(this.selectionModel.itemsIncluded, function (item) { return _this.matchRow(rowId, item); }); this.selectionModel.nbItemsSelected--; } } column.onChecked.emit(row); this.updateAllChecked(); }; /** * @param {?} rowId * @param {?} rowToMatch * @return {?} */ AsiTable.prototype.matchRow = /** * @param {?} rowId * @param {?} rowToMatch * @return {?} */ function (rowId, rowToMatch) { return rowId === this.getProperty(rowToMatch, this.selectionModel.config.selectionId); }; /** * @return {?} */ AsiTable.prototype.updateAllChecked = /** * @return {?} */ function () { if (this.selectionModel.config.multipage) { this.allChecked = this.selectionModel.nbItemsSelected > 0 && this.selectionModel.nbItemsSelected === this.data.totalElements; } else { this.allChecked = this.selectionModel.nbItemsSelected > 0 && this.selectionModel.nbItemsSelected === this.data.results.length; } }; /** * @param {?} row * @return {?} */ AsiTable.prototype.getRowClass = /** * @param {?} row * @return {?} */ function (row) { if (row != null && this.rowClass != null) { if (this.isFunction(this.rowClass)) { return this.rowClass(row); } else { /** @type {?} */ var rowClassStr = JSON.stringify(this.rowClass); rowClassStr = nh.replace(rowClassStr, new RegExp('{row}', 'g'), 'row'); // tslint:disable-next-line:quotemark rowClassStr = nh.replace(rowClassStr, new RegExp("'", 'g'), '"'); /** @type {?} */ var jsonRowClass = JSON.parse(rowClassStr); for (var key in jsonRowClass) { if (jsonRowClass.hasOwnProperty(key)) { // tslint:disable-next-line:no-eval jsonRowClass[key] = eval(jsonRowClass[key]); } } return jsonRowClass; } } }; /** * @param {?} functionToCheck * @return {?} */ AsiTable.prototype.isFunction = /** * @param {?} functionToCheck * @return {?} */ function (functionToCheck) { /** @type {?} */ var getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; }; /** * @return {?} */ AsiTable.prototype.ngAfterContentInit = /** * @return {?} */ function () { var _this = this; this.queryColumns.forEach(function (column) { _this.columns.push(column); }); if (this.fireRefreshOnInit) { this.requestData(); } }; AsiTable.decorators = [ { type: Component, args: [{ selector: 'asi-table', host: { 'class': 'asi-component asi-table' }, template: "<table #table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of getColumns()\" [ngClass]=\"getHeaderClass(column)\" (click)=\"onSort(column)\">\r\n <ng-container *ngIf=\"column.type == 'text'\">\r\n <span class=\"header\">\r\n <span *ngIf=\"!column.headerDef\">{{column.libelle | translate}}</span>\r\n <ng-template *ngIf=\"column.headerDef\" [ngTemplateOutlet]=\"column.headerDef.template\" [ngTemplateOutletContext]=\"{$implicit : column}\"></ng-template>\r\n <span class=\"sortIconDesc\" [innerHtml]=\"'&#9660;'\"></span>\r\n <span class=\"sortIconAsc\" [innerHtml]=\"'&#9650;'\"></span>\r\n </span>\r\n </ng-container>\r\n <asi-checkbox *ngIf=\"column.type == 'checkbox'\" [(ngModel)]=\"allChecked\" (onValueChange)=\"onAllChecked(column)\"></asi-checkbox>\r\n </th>\r\n </tr>\r\n </thead>\r\n <ng-container *ngFor=\"let row of data?.results\">\r\n <tbody [ngClass]=\"getRowClass(row)\">\r\n <tr>\r\n <td *ngFor=\"let column of getColumns()\" [ngClass]=\"column.columnClass\">\r\n <ng-container *ngIf=\"column.type == 'text'\">\r\n <span *ngIf=\"!column.cellDef\">{{getCellValue(row, column)}}</span>\r\n <ng-template *ngIf=\"column.cellDef\" [ngTemplateOutlet]=\"column.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </ng-container>\r\n <asi-checkbox *ngIf=\"column.type == 'checkbox'\" [(ngModel)]=\"row.checked\" (onValueChange)=\"onChecked(row, column)\"></asi-checkbox>\r\n </td>\r\n </tr>\r\n <tr *ngFor=\"let inlineColumn of getInlineColumns()\" class=\"inlined\" [ngClass]=\"inlineColumn.columnClass\">\r\n <td *ngIf=\"inlineColumn.inliners.length == 0\" [attr.colspan]=\"getColumns().length\" class=\"inlined\">\r\n <span *ngIf=\"!inlineColumn.cellDef\">{{getCellValue(row, inlineColumn)}}</span>\r\n <ng-template *ngIf=\"inlineColumn.cellDef\" [ngTemplateOutlet]=\"inlineColumn.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </td>\r\n <ng-container *ngIf=\"inlineColumn.inliners.length > 0\">\r\n <td *ngFor=\"let inliner of inlineColumn.inliners\" [attr.colspan]=\"inliner.colSpan\" [ngClass]=\"inliner.columnClass\">\r\n <span *ngIf=\"!inliner.cellDef\">{{getCellValue(row, inlineColumn)}}</span>\r\n <ng-template *ngIf=\"inliner.cellDef\" [ngTemplateOutlet]=\"inliner.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n</table>\r\n<asi-pagination *ngIf=\"data.paginate\" [nbElements]=\"data.totalPages\" [nbVisibleElements]=\"6\" [selectedPagination]=\"data.pageIndex\"\r\n (onPaginationChanged)=\"onPaginationChanged($event)\"></asi-pagination>\r\n" }] } ]; /** @nocollapse */ AsiTable.ctorParameters = function () { return [ { type: AsiPaginationService } ]; }; AsiTable.propDecorators = { queryColumns: [{ type: ContentChildren, args: [AsiTableColumn,] }], autoSort: [{ type: Input }], autoPaginate: [{ type: Input }], nbElementParPage: [{ type: Input }], selectionModel: [{ type: Input }], rowClass: [{ type: Input }], fireRefreshOnInit: [{ type: Input }], changePageOnTop: [{ type: Input }], onRequestData: [{ type: Input }], customSort: [{ type: Input }], topElement: [{ type: ViewChild, args: ['table',] }] }; return AsiTable; }()); export { AsiTable }; if (false) { /** @type {?} */ AsiTable.prototype.queryColumns; /** * Sorte table automatically * @type {?} */ AsiTable.prototype.autoSort; /** * Auto paginate the table * @type {?} */ AsiTable.prototype.autoPaginate; /** * Nb element by page * @type {?} */ AsiTable.prototype.nbElementParPage; /** * Define a selection model * @type {?} */ AsiTable.prototype.selectionModel; /** * Use a ngClass expression to add a class on a row * @type {?} */ AsiTable.prototype.rowClass; /** * Will call onRequestData when init * @type {?} */ AsiTable.prototype.fireRefreshOnInit; /** * Focus to the top of the table when page chanched * @type {?} */ AsiTable.prototype.changePageOnTop; /** * (on init , on sort ( autoSort is false), on page changed (autoPaginate is false) * @type {?} */ AsiTable.prototype.onRequestData; /** * If this function is define it's used to define a custom sort on table * @type {?} */ AsiTable.prototype.customSort; /** @type {?} */ AsiTable.prototype.topElement; /** @type {?} */ AsiTable.prototype.columns; /** @type {?} */ AsiTable.prototype.data; /** @type {?} */ AsiTable.prototype.searchDone; /** @type {?} */ AsiTable.prototype.loading; /** @type {?} */ AsiTable.prototype.sortedColumn; /** @type {?} */ AsiTable.prototype.noPaginateResults; /** @type {?} */ AsiTable.prototype.allChecked; /** @type {?} */ AsiTable.prototype.requestDataSubcription; /** @type {?} */ AsiTable.prototype.paginateService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktdGFibGUvYXNpLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBb0IsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7SUEwRHhDLGtCQUFvQixlQUFxQztRQUFyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBc0I7Ozs7d0JBN0NyQyxLQUFLOzs7OzRCQUdELEtBQUs7Ozs7Z0NBR0QsRUFBRTs7Ozs4QkFHSixJQUFJLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7Ozs7aUNBTXBDLElBQUk7Ozs7K0JBR04sS0FBSzt1QkFXdEIsSUFBSSxLQUFLLEVBQWtCO29CQUU5QixJQUFJLFlBQVksRUFBRTswQkFFWixLQUFLO3VCQUNSLEtBQUs7OzBCQU9GLEtBQUs7S0FLakI7Ozs7SUFFRCw2QkFBVTs7O0lBQVY7UUFBQSxpQkFJQztRQUhDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBQyxNQUFNO1lBQ3BDLE1BQU0sQ0FBQyxLQUFJLENBQUMs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LENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDOzs7OztJQUczRixxQ0FBa0I7OztJQUFsQjtRQUFBLGlCQU9DO1FBTkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO1lBQzlCLEtBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQzFCLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0tBQ0Y7O2dCQTdVRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRTtvQkFDNUMsNjNGQUF1QztpQkFDeEM7Ozs7Z0JBYlEsb0JBQW9COzs7K0JBZ0IxQixlQUFlLFNBQUMsY0FBYzsyQkFHOUIsS0FBSzsrQkFHTCxLQUFLO21DQUdMLEtBQUs7aUNBR0wsS0FBSzsyQkFHTCxLQUFLO29DQUdMLEtBQUs7a0NBR0wsS0FBSztnQ0FJTCxLQUFLOzZCQUdMLEtBQUs7NkJBRUwsU0FBUyxTQUFDLE9BQU87O21CQTlDcEI7O1NBY2EsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzaVBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hc2ktcGFnaW5hdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXNpVGFibGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4vYXNpLXRhYmxlLWNvbmZpZyc7XHJcbmltcG9ydCB7IEFzaVRhYmxlUmVxdWVzdCB9IGZyb20gJy4vYXNpLXRhYmxlLXJlcXVlc3QnO1xyXG5pbXBvcnQgeyBBc2lUYWJsZURhdGEgfSBmcm9tICcuL2FzaS10YWJsZS1kYXRhJztcclxuaW1wb3J0IHsgQXNpVGFibGVDb2x1bW4gfSBmcm9tICcuL2FzaS10YWJsZS1jb2x1bW4uZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBRdWVyeUxpc3QsIENvbnRlbnRDaGlsZHJlbiwgQWZ0ZXJDb250ZW50SW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS10YWJsZScsXHJcbiAgaG9zdDogeyAnY2xhc3MnOiAnYXNpLWNvbXBvbmVudCBhc2ktdGFibGUnIH0sXHJcbiAgdGVtcGxhdGVVcmw6ICdhc2ktdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lUYWJsZTxUPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKEFzaVRhYmxlQ29sdW1uKSBxdWVyeUNvbHVtbnM6IFF1ZXJ5TGlzdDxBc2lUYWJsZUNvbHVtbj47XHJcblxyXG4gIC8qKiBTb3J0ZSB0YWJsZSBhdXRvbWF0aWNhbGx5ICovXHJcbiAgQElucHV0KCkgYXV0b1NvcnQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIEF1dG8gcGFnaW5hdGUgdGhlIHRhYmxlICovXHJcbiAgQElucHV0KCkgYXV0b1BhZ2luYXRlID0gZmFsc2U7XHJcblxyXG4gIC8qKiBOYiBlbGVtZW50IGJ5IHBhZ2UgKi9cclxuICBASW5wdXQoKSBuYkVsZW1lbnRQYXJQYWdlID0gMjU7XHJcblxyXG4gIC8qKiBEZWZpbmUgYSBzZWxlY3Rpb24gbW9kZWwgKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlbCA9IG5ldyBBc2lUYWJsZVNlbGVjdGlvbk1vZGVsKCdpZCcsIGZhbHNlKTtcclxuXHJcbiAgLyoqIFVzZSBhIG5nQ2xhc3MgZXhwcmVzc2lvbiB0byBhZGQgYSBjbGFzcyBvbiBhIHJvdyovXHJcbiAgQElucHV0KCkgcm93Q2xhc3M6IGFueTtcclxuXHJcbiAgLyoqIFdpbGwgY2FsbCBvblJlcXVlc3REYXRhIHdoZW4gaW5pdCAqL1xyXG4gIEBJbnB1dCgpIGZpcmVSZWZyZXNoT25Jbml0ID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEZvY3VzIHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlIHdoZW4gcGFnZSBjaGFuY2hlZCAqL1xyXG4gIEBJbnB1dCgpIGNoYW5nZVBhZ2VPblRvcCA9IGZhbHNlO1xyXG5cclxuICAvKiogTWV0aG9kIGNhbGxlZCB3aGVuIHRhYmxlIHdpbGwgYXNrIGZvciBkYXRhICovXHJcbiAgLyoqIChvbiBpbml0ICwgb24gc29ydCAoIGF1dG9Tb3J0IGlzIGZhbHNlKSwgb24gcGFnZSBjaGFuZ2VkIChhdXRvUGFnaW5hdGUgaXMgZmFsc2UpICovXHJcbiAgQElucHV0KCkgb25SZXF1ZXN0RGF0YTogRnVuY3Rpb247XHJcblxyXG4gIC8qKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZSBpdCdzIHVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIHNvcnQgb24gdGFibGUqL1xyXG4gIEBJbnB1dCgpIGN1c3RvbVNvcnQ6IEZ1bmN0aW9uO1xyXG5cclxuICBAVmlld0NoaWxkKCd0YWJsZScpIHRvcEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGNvbHVtbnMgPSBuZXcgQXJyYXk8QXNpVGFibGVDb2x1bW4+KCk7XHJcblxyXG4gIGRhdGEgPSBuZXcgQXNpVGFibGVEYXRhKCk7XHJcblxyXG4gIHNlYXJjaERvbmUgPSBmYWxzZTtcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIHNvcnRlZENvbHVtbjogQXNpVGFibGVDb2x1bW47XHJcblxyXG4gIG5vUGFnaW5hdGVSZXN1bHRzOiBBcnJheTxUPjtcclxuXHJcbiAgLy8gU2hvdyBhbGxjaGVjayBjaGVja2JveCBhbGxjaGVja2VkXHJcbiAgYWxsQ2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHJlcXVlc3REYXRhU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYWdpbmF0ZVNlcnZpY2U6IEFzaVBhZ2luYXRpb25TZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBnZXRDb2x1bW5zKCkge1xyXG4gICAgcmV0dXJuIG5oLmZpbHRlcih0aGlzLmNvbHVtbnMsIChjb2x1bW4pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmlsdHJlQ29sdW1uKGNvbHVtbikgJiYgIWNvbHVtbi5pbmxpbmVDb2x1bW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldElubGluZUNvbHVtbnMoKSB7XHJcbiAgICByZXR1cm4gbmguZmlsdGVyKHRoaXMuY29sdW1ucywgKGNvbHVtbikgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWx0cmVDb2x1bW4oY29sdW1uKSAmJiBjb2x1bW4uaW5saW5lQ29sdW1uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRyZUNvbHVtbihjb2x1bW46IEFzaVRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGNvbHVtbi5zaG93SWYgPT0gbnVsbCB8fCBjb2x1bW4uc2hvd0lmKSAmJiAoY29sdW1uLmhpZGVJZiA9PSBudWxsIHx8ICFjb2x1bW4uaGlkZUlmKTtcclxuICB9XHJcblxyXG4gIGdldEhlYWRlckNsYXNzKGNvbHVtbjogQXNpVGFibGVDb2x1bW4pIHtcclxuICAgIGxldCBjb2x1bW5DbGFzczogYW55ID0ge307XHJcbiAgICBpZiAoY29sdW1uLmNvbHVtbkNsYXNzKSB7XHJcbiAgICAgIGlmIChjb2x1bW4uY29sdW1uQ2xhc3MgaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAvLyBDb3B5XHJcbiAgICAgICAgY29sdW1uQ2xhc3MgPSB7IC4uLmNvbHVtbi5jb2x1bW5DbGFzcyB9XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbHVtbi5jb2x1bW5DbGFzcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb2x1bW5DbGFzc1snJyArIGNvbHVtbi5jb2x1bW5DbGFzc10gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb2x1bW5DbGFzcy5zb3J0YWJsZSA9IGNvbHVtbi5zb3J0YWJsZTtcclxuICAgIGNvbHVtbkNsYXNzLmFzYyA9IGNvbHVtbi5hc2M7XHJcbiAgICBjb2x1bW5DbGFzcy5kZXNjID0gY29sdW1uLmFzYyA9PT0gZmFsc2U7XHJcbiAgICByZXR1cm4gY29sdW1uQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlyZVJlZnJlc2goKSB7XHJcbiAgICB0aGlzLmRhdGEucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMucmVxdWVzdERhdGEoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IEFzaVRhYmxlRGF0YTxUPikge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIGlmICh0aGlzLmF1dG9QYWdpbmF0ZSkge1xyXG4gICAgICB0aGlzLm5vUGFnaW5hdGVSZXN1bHRzID0gZGF0YS5yZXN1bHRzO1xyXG4gICAgICB0aGlzLnBhZ2luYXRlRGF0YXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdENoZWNrYm94KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hdXRvU29ydCkge1xyXG4gICAgICB0aGlzLnNvcnREYXRhcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Tb3J0KGNvbHVtbjogQXNpVGFibGVDb2x1bW4pIHtcclxuICAgIGlmIChjb2x1bW4uc29ydGFibGUpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbiAhPSBudWxsICYmIHRoaXMuc29ydGVkQ29sdW1uICE9PSBjb2x1bW4pIHtcclxuICAgICAgICB0aGlzLnNvcnRlZENvbHVtbi51bnNvcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICAgIGNvbHVtbi50b2dnbGVTb3J0KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5hdXRvU29ydCkge1xyXG4gICAgICAgIHRoaXMuc29ydERhdGFzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0RGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5kYXRhLnBhZ2VJbmRleCA9IHBhZ2luYXRpb247XHJcbiAgICBpZiAodGhpcy5hdXRvUGFnaW5hdGUpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0ZURhdGFzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlcXVlc3REYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhbmdlUGFnZU9uVG9wKSB7XHJcbiAgICAgIHRoaXMudG9wRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhZ2luYXRlRGF0YXMoKSB7XHJcbiAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHRoaXMucGFnaW5hdGVTZXJ2aWNlLmdldFBhZ2UodGhpcy5ub1BhZ2luYXRlUmVzdWx0cywgdGhpcy5uYkVsZW1lbnRQYXJQYWdlLCB0aGlzLmRhdGEucGFnZUluZGV4KTtcclxuICAgIHRoaXMuZGF0YS50b3RhbFBhZ2VzID0gdGhpcy5wYWdpbmF0ZVNlcnZpY2UuZ2V0TmJQYWdlcyh0aGlzLm5vUGFnaW5hdGVSZXN1bHRzLCB0aGlzLm5iRWxlbWVudFBhclBhZ2UpO1xyXG4gICAgdGhpcy5kYXRhLnRvdGFsRWxlbWVudHMgPSB0aGlzLm5vUGFnaW5hdGVSZXN1bHRzLmxlbmd0aDtcclxuICAgIHRoaXMuaW5pdENoZWNrYm94KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3REYXRhKCkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSB0aGlzLmdldEFzaVRhYmxlUmVxdWVzdCgpO1xyXG4gICAgaWYgKHRoaXMub25SZXF1ZXN0RGF0YSkge1xyXG4gICAgICBpZiAodGhpcy5yZXF1ZXN0RGF0YVN1YmNyaXB0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAvLyBJZ25vcmUgcHJldmlvdXMgcmVxdWVzdFxyXG4gICAgICAgIHRoaXMucmVxdWVzdERhdGFTdWJjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVxdWVzdERhdGFTdWJjcmlwdGlvbiA9IG5oLm9ic2VydmUodGhpcy5vblJlcXVlc3REYXRhKHJlcXVlc3QpKS5zdWJzY3JpYmUoKGRhdGE6IEFzaVRhYmxlRGF0YTxUPikgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFzaVRhYmxlUmVxdWVzdCgpOiBBc2lUYWJsZVJlcXVlc3Qge1xyXG4gICAgbGV0IHJlcXVlc3Q6IEFzaVRhYmxlUmVxdWVzdCA9IG5ldyBBc2lUYWJsZVJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3QucGFnZUluZGV4ID0gdGhpcy5kYXRhLnBhZ2VJbmRleDtcclxuICAgIHJlcXVlc3QubmJFbGVtZW50c1BhclBhZ2UgPSB0aGlzLm5iRWxlbWVudFBhclBhZ2U7XHJcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gIT0gbnVsbCkge1xyXG4gICAgICByZXF1ZXN0LnRyaSA9IHRoaXMuc29ydGVkQ29sdW1uLmdldFNvcnROYW1lKCk7XHJcbiAgICAgIHJlcXVlc3QuYXNjID0gdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0QXNjKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydERhdGFzKCkge1xyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uICE9IG51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLmF1dG9QYWdpbmF0ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzID0gdGhpcy5pbnRlcm5hbFNvcnREYXRhKHRoaXMuZGF0YS5yZXN1bHRzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vUGFnaW5hdGVSZXN1bHRzID0gdGhpcy5pbnRlcm5hbFNvcnREYXRhKHRoaXMubm9QYWdpbmF0ZVJlc3VsdHMpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGVEYXRhcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlcm5hbFNvcnREYXRhKGRhdGE6IGFueVtdKTogYW55W10ge1xyXG4gICAgY29uc3Qgc29ydEluZm9ybWF0aW9uID0ge1xyXG4gICAgICBzb3J0OiB0aGlzLnNvcnRlZENvbHVtbi5nZXRTb3J0TmFtZSgpLFxyXG4gICAgICBhc2M6IHRoaXMuc29ydGVkQ29sdW1uLmdldEFzYygpXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uLmN1c3RvbVNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4uY3VzdG9tU29ydChkYXRhLCBzb3J0SW5mb3JtYXRpb24pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbVNvcnQpIHtcclxuICAgICAgdGhpcy5jdXN0b21Tb3J0KGRhdGEsIHNvcnRJbmZvcm1hdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuaC5vcmRlckJ5V2l0aG91dENhc2UoZGF0YSwgdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0U29ydE5hbWUoKSxcclxuICAgICAgICB0aGlzLnNvcnRlZENvbHVtbi5nZXRBc2MoKSA/ICdhc2MnIDogJ2Rlc2MnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlY3VwZXJlIGxhIHZhbGV1ciDDoCBhZmZpY2hlciBwb3VyIHVuZSBjZWxsdWxlICovXHJcbiAgZ2V0Q2VsbFZhbHVlKHJvdzogVCwgY29sdW1uOiBBc2lUYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShyb3csIGNvbHVtbi5uYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJvcGVydHkob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gbmguZ2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgfVxyXG5cclxuICBpbml0Q2hlY2tib3goKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQpIHtcclxuICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbGxjaGVjayBtb2RlIHdlIHVuc2VsZWN0IGV4Y2x1ZGVkIGxpbmVzXHJcbiAgICAgICAgICBuaC5mb3JFYWNoKHRoaXMuZGF0YS5yZXN1bHRzLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtSWQgPSB0aGlzLmdldFByb3BlcnR5KGl0ZW0sIHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLnNlbGVjdGlvbklkKTtcclxuICAgICAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBuaC5maW5kKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNFeGNsdWRlZCwgKGV4Y2x1ZGVkaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUm93KGl0ZW1JZCwgZXhjbHVkZWRpdGVtKTtcclxuICAgICAgICAgICAgfSkgIT0gbnVsbDtcclxuICAgICAgICAgICAgaXRlbS5jaGVja2VkID0gIWV4Y2x1ZGVkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEVsc2Ugd2Ugc2VsZWN0IGluY2x1ZGVkIGxpbmVzXHJcbiAgICAgICAgICBuaC5mb3JFYWNoKHRoaXMuZGF0YS5yZXN1bHRzLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtSWQgPSB0aGlzLmdldFByb3BlcnR5KGl0ZW0sIHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLnNlbGVjdGlvbklkKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBuaC5maW5kKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNJbmNsdWRlZCwgKGluY2x1ZGVkSXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUm93KGl0ZW1JZCwgaW5jbHVkZWRJdGVtKTtcclxuICAgICAgICAgICAgfSkgIT0gbnVsbDtcclxuICAgICAgICAgICAgaXRlbS5jaGVja2VkID0gaW5jbHVkZWQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25BbGxDaGVja2VkKGNvbHVtbjogQXNpVGFibGVDb2x1bW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuYWxsQ2hlY2tlZCA9IHRoaXMuYWxsQ2hlY2tlZDtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zSW5jbHVkZWQgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNFeGNsdWRlZCA9IFtdO1xyXG5cclxuICAgIG5oLmZvckVhY2godGhpcy5kYXRhLnJlc3VsdHMsIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgZGF0YS5jaGVja2VkID0gdGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuYWxsQ2hlY2tlZCkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5jb25maWcubXVsdGlwYWdlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQgPSB0aGlzLmRhdGEudG90YWxFbGVtZW50cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA9IHRoaXMuZGF0YS5yZXN1bHRzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbHVtbi5vbkFsbENoZWNrZWQuZW1pdCh0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQpO1xyXG4gIH1cclxuXHJcbiAgb25DaGVja2VkKHJvdzogYW55LCBjb2x1bW46IEFzaVRhYmxlQ29sdW1uKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHJvd0lkID0gdGhpcy5nZXRQcm9wZXJ0eShyb3csIHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLnNlbGVjdGlvbklkKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkKSB7XHJcbiAgICAgIGlmIChyb3cuY2hlY2tlZCkge1xyXG4gICAgICAgIG5oLnJlbW92ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFJvdyhyb3dJZCwgaXRlbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQucHVzaChyb3cpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkLS07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChyb3cuY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNJbmNsdWRlZC5wdXNoKHJvdyk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuaC5yZW1vdmUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0luY2x1ZGVkLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hSb3cocm93SWQsIGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkLS07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb2x1bW4ub25DaGVja2VkLmVtaXQocm93KTtcclxuICAgIHRoaXMudXBkYXRlQWxsQ2hlY2tlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaFJvdyhyb3dJZDogYW55LCByb3dUb01hdGNoOiBhbnkpIHtcclxuICAgIHJldHVybiByb3dJZCA9PT0gdGhpcy5nZXRQcm9wZXJ0eShyb3dUb01hdGNoLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUFsbENoZWNrZWQoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5jb25maWcubXVsdGlwYWdlKSB7XHJcbiAgICAgIHRoaXMuYWxsQ2hlY2tlZCA9IHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID4gMFxyXG4gICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID09PSB0aGlzLmRhdGEudG90YWxFbGVtZW50cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWxsQ2hlY2tlZCA9IHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID4gMFxyXG4gICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID09PSB0aGlzLmRhdGEucmVzdWx0cy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSb3dDbGFzcyhyb3c6IFQpIHtcclxuICAgIGlmIChyb3cgIT0gbnVsbCAmJiB0aGlzLnJvd0NsYXNzICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbih0aGlzLnJvd0NsYXNzKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0NsYXNzKHJvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHJvd0NsYXNzU3RyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dDbGFzcyk7XHJcbiAgICAgICAgcm93Q2xhc3NTdHIgPSBuaC5yZXBsYWNlKHJvd0NsYXNzU3RyLCBuZXcgUmVnRXhwKCd7cm93fScsICdnJyksICdyb3cnKTtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cXVvdGVtYXJrXHJcbiAgICAgICAgcm93Q2xhc3NTdHIgPSBuaC5yZXBsYWNlKHJvd0NsYXNzU3RyLCBuZXcgUmVnRXhwKFwiJ1wiLCAnZycpLCAnXCInKTtcclxuICAgICAgICBsZXQganNvblJvd0NsYXNzOiBhbnkgPSBKU09OLnBhcnNlKHJvd0NsYXNzU3RyKTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4ganNvblJvd0NsYXNzKSB7XHJcbiAgICAgICAgICBpZiAoanNvblJvd0NsYXNzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWV2YWxcclxuICAgICAgICAgICAganNvblJvd0NsYXNzW2tleV0gPSBldmFsKGpzb25Sb3dDbGFzc1trZXldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpzb25Sb3dDbGFzcztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjazogRnVuY3Rpb24pIHtcclxuICAgIGNvbnN0IGdldFR5cGUgPSB7fTtcclxuICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLnF1ZXJ5Q29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbilcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuZmlyZVJlZnJlc2