@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
511 lines (510 loc) • 48.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
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
*/
export class AsiTable {
/**
* @param {?} paginateService
*/
constructor(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 {?}
*/
getColumns() {
return nh.filter(this.columns, (column) => {
return this.filtreColumn(column) && !column.inlineColumn;
});
}
/**
* @return {?}
*/
getInlineColumns() {
return nh.filter(this.columns, (column) => {
return this.filtreColumn(column) && column.inlineColumn;
});
}
/**
* @param {?} column
* @return {?}
*/
filtreColumn(column) {
return (column.showIf == null || column.showIf) && (column.hideIf == null || !column.hideIf);
}
/**
* @param {?} column
* @return {?}
*/
getHeaderClass(column) {
/** @type {?} */
let columnClass = {};
if (column.columnClass) {
if (column.columnClass instanceof Object) {
// Copy
columnClass = Object.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 {?}
*/
fireRefresh() {
this.data.pageIndex = 1;
this.requestData();
}
/**
* @param {?} data
* @return {?}
*/
updateData(data) {
this.data = data;
if (this.autoPaginate) {
this.noPaginateResults = data.results;
this.paginateDatas();
}
else {
this.initCheckbox();
}
if (this.autoSort) {
this.sortDatas();
}
}
/**
* @param {?} column
* @return {?}
*/
onSort(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 {?}
*/
onPaginationChanged(pagination) {
this.data.pageIndex = pagination;
if (this.autoPaginate) {
this.paginateDatas();
}
else {
this.requestData();
}
if (this.changePageOnTop) {
this.topElement.nativeElement.scrollIntoView();
}
}
/**
* @return {?}
*/
paginateDatas() {
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 {?}
*/
requestData() {
/** @type {?} */
let request = this.getAsiTableRequest();
if (this.onRequestData) {
if (this.requestDataSubcription != null) {
// Ignore previous request
this.requestDataSubcription.unsubscribe();
}
this.requestDataSubcription = nh.observe(this.onRequestData(request)).subscribe((data) => {
this.updateData(data);
});
}
}
/**
* @return {?}
*/
getAsiTableRequest() {
/** @type {?} */
let 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 {?}
*/
sortDatas() {
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 {?}
*/
internalSortData(data) {
/** @type {?} */
const 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
* @param {?} row
* @param {?} column
* @return {?}
*/
getCellValue(row, column) {
return this.getProperty(row, column.name);
}
/**
* @param {?} object
* @param {?} path
* @return {?}
*/
getProperty(object, path) {
return nh.get(object, path);
}
/**
* @return {?}
*/
initCheckbox() {
this.columns.forEach((column) => {
if (column.type === 'checkbox') {
if (this.selectionModel.allChecked) {
// If we are in allcheck mode we unselect excluded lines
nh.forEach(this.data.results, (item) => {
/** @type {?} */
let itemId = this.getProperty(item, this.selectionModel.config.selectionId);
/** @type {?} */
const excluded = nh.find(this.selectionModel.itemsExcluded, (excludeditem) => {
return this.matchRow(itemId, excludeditem);
}) != null;
item.checked = !excluded;
});
}
else {
// Else we select included lines
nh.forEach(this.data.results, (item) => {
/** @type {?} */
let itemId = this.getProperty(item, this.selectionModel.config.selectionId);
/** @type {?} */
const included = nh.find(this.selectionModel.itemsIncluded, (includedItem) => {
return this.matchRow(itemId, includedItem);
}) != null;
item.checked = included;
});
}
}
});
}
/**
* @param {?} column
* @return {?}
*/
onAllChecked(column) {
this.selectionModel.allChecked = this.allChecked;
this.selectionModel.itemsIncluded = [];
this.selectionModel.itemsExcluded = [];
/** @type {?} */
let nbItemsSelected = 0;
nh.forEach(this.data.results, (data) => {
if (!column.disabledCheckbox || !column.disabledCheckbox(data)) {
data.checked = this.selectionModel.allChecked;
nbItemsSelected++;
this.selectionModel.itemsIncluded.push(data);
}
else {
this.selectionModel.itemsExcluded.push(data);
}
});
if (this.selectionModel.allChecked) {
if (this.selectionModel.config.multipage) {
this.selectionModel.nbItemsSelected = this.data.totalElements;
}
else {
this.selectionModel.nbItemsSelected = nbItemsSelected;
}
}
else {
this.selectionModel.nbItemsSelected = 0;
}
column.onAllChecked.emit(this.selectionModel.allChecked);
}
/**
* @param {?} row
* @param {?} column
* @return {?}
*/
onChecked(row, column) {
/** @type {?} */
let rowId = this.getProperty(row, this.selectionModel.config.selectionId);
if (this.selectionModel.allChecked) {
if (row.checked) {
nh.remove(this.selectionModel.itemsExcluded, (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, (item) => {
return this.matchRow(rowId, item);
});
this.selectionModel.nbItemsSelected--;
}
}
column.onChecked.emit(row);
this.updateAllChecked();
}
/**
* @param {?} rowId
* @param {?} rowToMatch
* @return {?}
*/
matchRow(rowId, rowToMatch) {
return rowId === this.getProperty(rowToMatch, this.selectionModel.config.selectionId);
}
/**
* @return {?}
*/
updateAllChecked() {
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 {?}
*/
getRowClass(row) {
if (row != null && this.rowClass != null) {
if (this.isFunction(this.rowClass)) {
return this.rowClass(row);
}
else {
/** @type {?} */
let 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 {?} */
let jsonRowClass = JSON.parse(rowClassStr);
for (let key in jsonRowClass) {
if (jsonRowClass.hasOwnProperty(key)) {
// tslint:disable-next-line:no-eval
jsonRowClass[key] = eval(jsonRowClass[key]);
}
}
return jsonRowClass;
}
}
}
/**
* @param {?} functionToCheck
* @return {?}
*/
isFunction(functionToCheck) {
/** @type {?} */
const getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.queryColumns.forEach(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]=\"'▼'\"></span>\r\n <span class=\"sortIconAsc\" [innerHtml]=\"'▲'\"></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)\" [disabled]=\"column.disabledCheckbox && column.disabledCheckbox(row)\"></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 = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktdGFibGUvYXNpLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFvQixLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBUTFDLE1BQU07Ozs7SUFrREosWUFBb0IsZUFBcUM7UUFBckMsb0JBQWUsR0FBZixlQUFlLENBQXNCOzs7O3dCQTdDckMsS0FBSzs7Ozs0QkFHRCxLQUFLOzs7O2dDQUdELEVBQUU7Ozs7OEJBR0osSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDOzs7O2lDQU1wQyxJQUFJOzs7OytCQUdOLEtBQUs7dUJBV3RCLElBQUksS0FBSyxFQUFrQjtvQkFFOUIsSUFBSSxZQUFZLEVBQUU7MEJBRVosS0FBSzt1QkFDUixLQUFLOzswQkFPRixLQUFLO0tBS2pCOzs7O0lBRUQsVUFBVTtRQUNSLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFD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QUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUM3QztpQkFDRjtnQkFDRCxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3JCO1NBQ0Y7S0FDRjs7Ozs7SUFFTyxVQUFVLENBQUMsZUFBeUI7O1FBQzFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDOzs7OztJQUczRixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7S0FDRjs7O1lBcFZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsV0FBVztnQkFDckIsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFO2dCQUM1QyxvOEZBQXVDO2FBQ3hDOzs7O1lBYlEsb0JBQW9COzs7MkJBZ0IxQixlQUFlLFNBQUMsY0FBYzt1QkFHOUIsS0FBSzsyQkFHTCxLQUFLOytCQUdMLEtBQUs7NkJBR0wsS0FBSzt1QkFHTCxLQUFLO2dDQUdMLEtBQUs7OEJBR0wsS0FBSzs0QkFJTCxLQUFLO3lCQUdMLEtBQUs7eUJBRUwsU0FBUyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc2lQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYXNpLXBhZ2luYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFzaVRhYmxlU2VsZWN0aW9uTW9kZWwgfSBmcm9tICcuL2FzaS10YWJsZS1jb25maWcnO1xyXG5pbXBvcnQgeyBBc2lUYWJsZVJlcXVlc3QgfSBmcm9tICcuL2FzaS10YWJsZS1yZXF1ZXN0JztcclxuaW1wb3J0IHsgQXNpVGFibGVEYXRhIH0gZnJvbSAnLi9hc2ktdGFibGUtZGF0YSc7XHJcbmltcG9ydCB7IEFzaVRhYmxlQ29sdW1uIH0gZnJvbSAnLi9hc2ktdGFibGUtY29sdW1uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgUXVlcnlMaXN0LCBDb250ZW50Q2hpbGRyZW4sIEFmdGVyQ29udGVudEluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktdGFibGUnLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLXRhYmxlJyB9LFxyXG4gIHRlbXBsYXRlVXJsOiAnYXNpLXRhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNpVGFibGU8VD4gaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihBc2lUYWJsZUNvbHVtbikgcXVlcnlDb2x1bW5zOiBRdWVyeUxpc3Q8QXNpVGFibGVDb2x1bW4+O1xyXG5cclxuICAvKiogU29ydGUgdGFibGUgYXV0b21hdGljYWxseSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9Tb3J0ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBBdXRvIHBhZ2luYXRlIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9QYWdpbmF0ZSA9IGZhbHNlO1xyXG5cclxuICAvKiogTmIgZWxlbWVudCBieSBwYWdlICovXHJcbiAgQElucHV0KCkgbmJFbGVtZW50UGFyUGFnZSA9IDI1O1xyXG5cclxuICAvKiogRGVmaW5lIGEgc2VsZWN0aW9uIG1vZGVsICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZWwgPSBuZXcgQXNpVGFibGVTZWxlY3Rpb25Nb2RlbCgnaWQnLCBmYWxzZSk7XHJcblxyXG4gIC8qKiBVc2UgYSBuZ0NsYXNzIGV4cHJlc3Npb24gdG8gYWRkIGEgY2xhc3Mgb24gYSByb3cqL1xyXG4gIEBJbnB1dCgpIHJvd0NsYXNzOiBhbnk7XHJcblxyXG4gIC8qKiBXaWxsIGNhbGwgb25SZXF1ZXN0RGF0YSB3aGVuIGluaXQgKi9cclxuICBASW5wdXQoKSBmaXJlUmVmcmVzaE9uSW5pdCA9IHRydWU7XHJcblxyXG4gIC8qKiBGb2N1cyB0byB0aGUgdG9wIG9mIHRoZSB0YWJsZSB3aGVuIHBhZ2UgY2hhbmNoZWQgKi9cclxuICBASW5wdXQoKSBjaGFuZ2VQYWdlT25Ub3AgPSBmYWxzZTtcclxuXHJcbiAgLyoqIE1ldGhvZCBjYWxsZWQgd2hlbiB0YWJsZSB3aWxsIGFzayBmb3IgZGF0YSAqL1xyXG4gIC8qKiAob24gaW5pdCAsIG9uIHNvcnQgKCBhdXRvU29ydCBpcyBmYWxzZSksIG9uIHBhZ2UgY2hhbmdlZCAoYXV0b1BhZ2luYXRlIGlzIGZhbHNlKSAqL1xyXG4gIEBJbnB1dCgpIG9uUmVxdWVzdERhdGE6IEZ1bmN0aW9uO1xyXG5cclxuICAvKiogSWYgdGhpcyBmdW5jdGlvbiBpcyBkZWZpbmUgaXQncyB1c2VkIHRvIGRlZmluZSBhIGN1c3RvbSBzb3J0IG9uIHRhYmxlKi9cclxuICBASW5wdXQoKSBjdXN0b21Tb3J0OiBGdW5jdGlvbjtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0b3BFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBjb2x1bW5zID0gbmV3IEFycmF5PEFzaVRhYmxlQ29sdW1uPigpO1xyXG5cclxuICBkYXRhID0gbmV3IEFzaVRhYmxlRGF0YSgpO1xyXG5cclxuICBzZWFyY2hEb25lID0gZmFsc2U7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBzb3J0ZWRDb2x1bW46IEFzaVRhYmxlQ29sdW1uO1xyXG5cclxuICBub1BhZ2luYXRlUmVzdWx0czogQXJyYXk8VD47XHJcblxyXG4gIC8vIFNob3cgYWxsY2hlY2sgY2hlY2tib3ggYWxsY2hlY2tlZFxyXG4gIGFsbENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0RGF0YVN1YmNyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnaW5hdGVTZXJ2aWNlOiBBc2lQYWdpbmF0aW9uU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1ucygpIHtcclxuICAgIHJldHVybiBuaC5maWx0ZXIodGhpcy5jb2x1bW5zLCAoY29sdW1uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbHRyZUNvbHVtbihjb2x1bW4pICYmICFjb2x1bW4uaW5saW5lQ29sdW1uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRJbmxpbmVDb2x1bW5zKCkge1xyXG4gICAgcmV0dXJuIG5oLmZpbHRlcih0aGlzLmNvbHVtbnMsIChjb2x1bW4pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmlsdHJlQ29sdW1uKGNvbHVtbikgJiYgY29sdW1uLmlubGluZUNvbHVtbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0cmVDb2x1bW4oY29sdW1uOiBBc2lUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChjb2x1bW4uc2hvd0lmID09IG51bGwgfHwgY29sdW1uLnNob3dJZikgJiYgKGNvbHVtbi5oaWRlSWYgPT0gbnVsbCB8fCAhY29sdW1uLmhpZGVJZik7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJDbGFzcyhjb2x1bW46IEFzaVRhYmxlQ29sdW1uKSB7XHJcbiAgICBsZXQgY29sdW1uQ2xhc3M6IGFueSA9IHt9O1xyXG4gICAgaWYgKGNvbHVtbi5jb2x1bW5DbGFzcykge1xyXG4gICAgICBpZiAoY29sdW1uLmNvbHVtbkNsYXNzIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gQ29weVxyXG4gICAgICAgIGNvbHVtbkNsYXNzID0geyAuLi5jb2x1bW4uY29sdW1uQ2xhc3MgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2x1bW4uY29sdW1uQ2xhc3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29sdW1uQ2xhc3NbJycgKyBjb2x1bW4uY29sdW1uQ2xhc3NdID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29sdW1uQ2xhc3Muc29ydGFibGUgPSBjb2x1bW4uc29ydGFibGU7XHJcbiAgICBjb2x1bW5DbGFzcy5hc2MgPSBjb2x1bW4uYXNjO1xyXG4gICAgY29sdW1uQ2xhc3MuZGVzYyA9IGNvbHVtbi5hc2MgPT09IGZhbHNlO1xyXG4gICAgcmV0dXJuIGNvbHVtbkNsYXNzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpcmVSZWZyZXNoKCkge1xyXG4gICAgdGhpcy5kYXRhLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLnJlcXVlc3REYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShkYXRhOiBBc2lUYWJsZURhdGE8VD4pIHtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5hdXRvUGFnaW5hdGUpIHtcclxuICAgICAgdGhpcy5ub1BhZ2luYXRlUmVzdWx0cyA9IGRhdGEucmVzdWx0cztcclxuICAgICAgdGhpcy5wYWdpbmF0ZURhdGFzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRDaGVja2JveCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXV0b1NvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0RGF0YXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU29ydChjb2x1bW46IEFzaVRhYmxlQ29sdW1uKSB7XHJcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gIT0gbnVsbCAmJiB0aGlzLnNvcnRlZENvbHVtbiAhPT0gY29sdW1uKSB7XHJcbiAgICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4udW5zb3J0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0gY29sdW1uO1xyXG4gICAgICBjb2x1bW4udG9nZ2xlU29ydCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXV0b1NvcnQpIHtcclxuICAgICAgICB0aGlzLnNvcnREYXRhcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGF0YS5wYWdlSW5kZXggPSBwYWdpbmF0aW9uO1xyXG4gICAgaWYgKHRoaXMuYXV0b1BhZ2luYXRlKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGVEYXRhcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXF1ZXN0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYW5nZVBhZ2VPblRvcCkge1xyXG4gICAgICB0aGlzLnRvcEVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWdpbmF0ZURhdGFzKCkge1xyXG4gICAgdGhpcy5kYXRhLnJlc3VsdHMgPSB0aGlzLnBhZ2luYXRlU2VydmljZS5nZXRQYWdlKHRoaXMubm9QYWdpbmF0ZVJlc3VsdHMsIHRoaXMubmJFbGVtZW50UGFyUGFnZSwgdGhpcy5kYXRhLnBhZ2VJbmRleCk7XHJcbiAgICB0aGlzLmRhdGEudG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGVTZXJ2aWNlLmdldE5iUGFnZXModGhpcy5ub1BhZ2luYXRlUmVzdWx0cywgdGhpcy5uYkVsZW1lbnRQYXJQYWdlKTtcclxuICAgIHRoaXMuZGF0YS50b3RhbEVsZW1lbnRzID0gdGhpcy5ub1BhZ2luYXRlUmVzdWx0cy5sZW5ndGg7XHJcbiAgICB0aGlzLmluaXRDaGVja2JveCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0RGF0YSgpIHtcclxuICAgIGxldCByZXF1ZXN0ID0gdGhpcy5nZXRBc2lUYWJsZVJlcXVlc3QoKTtcclxuICAgIGlmICh0aGlzLm9uUmVxdWVzdERhdGEpIHtcclxuICAgICAgaWYgKHRoaXMucmVxdWVzdERhdGFTdWJjcmlwdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gSWdub3JlIHByZXZpb3VzIHJlcXVlc3RcclxuICAgICAgICB0aGlzLnJlcXVlc3REYXRhU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlcXVlc3REYXRhU3ViY3JpcHRpb24gPSBuaC5vYnNlcnZlKHRoaXMub25SZXF1ZXN0RGF0YShyZXF1ZXN0KSkuc3Vic2NyaWJlKChkYXRhOiBBc2lUYWJsZURhdGE8VD4pID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBc2lUYWJsZVJlcXVlc3QoKTogQXNpVGFibGVSZXF1ZXN0IHtcclxuICAgIGxldCByZXF1ZXN0OiBBc2lUYWJsZVJlcXVlc3QgPSBuZXcgQXNpVGFibGVSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LnBhZ2VJbmRleCA9IHRoaXMuZGF0YS5wYWdlSW5kZXg7XHJcbiAgICByZXF1ZXN0Lm5iRWxlbWVudHNQYXJQYWdlID0gdGhpcy5uYkVsZW1lbnRQYXJQYWdlO1xyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uICE9IG51bGwpIHtcclxuICAgICAgcmVxdWVzdC50cmkgPSB0aGlzLnNvcnRlZENvbHVtbi5nZXRTb3J0TmFtZSgpO1xyXG4gICAgICByZXF1ZXN0LmFzYyA9IHRoaXMuc29ydGVkQ29sdW1uLmdldEFzYygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhcygpIHtcclxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbiAhPSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5hdXRvUGFnaW5hdGUpIHtcclxuICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHRoaXMuaW50ZXJuYWxTb3J0RGF0YSh0aGlzLmRhdGEucmVzdWx0cyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ub1BhZ2luYXRlUmVzdWx0cyA9IHRoaXMuaW50ZXJuYWxTb3J0RGF0YSh0aGlzLm5vUGFnaW5hdGVSZXN1bHRzKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRlRGF0YXMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZXJuYWxTb3J0RGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHNvcnRJbmZvcm1hdGlvbiA9IHtcclxuICAgICAgc29ydDogdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0U29ydE5hbWUoKSxcclxuICAgICAgYXNjOiB0aGlzLnNvcnRlZENvbHVtbi5nZXRBc2MoKVxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbi5jdXN0b21Tb3J0KSB7XHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uLmN1c3RvbVNvcnQoZGF0YSwgc29ydEluZm9ybWF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21Tb3J0KSB7XHJcbiAgICAgIHRoaXMuY3VzdG9tU29ydChkYXRhLCBzb3J0SW5mb3JtYXRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmgub3JkZXJCeVdpdGhvdXRDYXNlKGRhdGEsIHRoaXMuc29ydGVkQ29sdW1uLmdldFNvcnROYW1lKCksXHJcbiAgICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0QXNjKCkgPyAnYXNjJyA6ICdkZXNjJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWN1cGVyZSBsYSB2YWxldXIgw6AgYWZmaWNoZXIgcG91ciB1bmUgY2VsbHVsZSAqL1xyXG4gIGdldENlbGxWYWx1ZShyb3c6IFQsIGNvbHVtbjogQXNpVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByb3BlcnR5KG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIG5oLmdldChvYmplY3QsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdENoZWNrYm94KCkge1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkKSB7XHJcbiAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYWxsY2hlY2sgbW9kZSB3ZSB1bnNlbGVjdCBleGNsdWRlZCBsaW5lc1xyXG4gICAgICAgICAgbmguZm9yRWFjaCh0aGlzLmRhdGEucmVzdWx0cywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXRlbUlkID0gdGhpcy5nZXRQcm9wZXJ0eShpdGVtLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gbmguZmluZCh0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQsIChleGNsdWRlZGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFJvdyhpdGVtSWQsIGV4Y2x1ZGVkaXRlbSk7XHJcbiAgICAgICAgICAgIH0pICE9IG51bGw7XHJcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9ICFleGNsdWRlZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBFbHNlIHdlIHNlbGVjdCBpbmNsdWRlZCBsaW5lc1xyXG4gICAgICAgICAgbmguZm9yRWFjaCh0aGlzLmRhdGEucmVzdWx0cywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXRlbUlkID0gdGhpcy5nZXRQcm9wZXJ0eShpdGVtLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gbmguZmluZCh0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zSW5jbHVkZWQsIChpbmNsdWRlZEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFJvdyhpdGVtSWQsIGluY2x1ZGVkSXRlbSk7XHJcbiAgICAgICAgICAgIH0pICE9IG51bGw7XHJcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGluY2x1ZGVkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWxsQ2hlY2tlZChjb2x1bW46IEFzaVRhYmxlQ29sdW1uKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQgPSB0aGlzLmFsbENoZWNrZWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0luY2x1ZGVkID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQgPSBbXTtcclxuXHJcbiAgICBsZXQgbmJJdGVtc1NlbGVjdGVkID0gMDtcclxuICAgIG5oLmZvckVhY2godGhpcy5kYXRhLnJlc3VsdHMsIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb2x1bW4uZGlzYWJsZWRDaGVja2JveCB8fCAhY29sdW1uLmRpc2FibGVkQ2hlY2tib3goZGF0YSkpIHtcclxuICAgICAgICBkYXRhLmNoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQ7XHJcbiAgICAgICAgbmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0luY2x1ZGVkLnB1c2goZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLm11bHRpcGFnZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID0gdGhpcy5kYXRhLnRvdGFsRWxlbWVudHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQgPSBuYkl0ZW1zU2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb2x1bW4ub25BbGxDaGVja2VkLmVtaXQodGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkKTtcclxuICB9XHJcblxyXG4gIG9uQ2hlY2tlZChyb3c6IGFueSwgY29sdW1uOiBBc2lUYWJsZUNvbHVtbik6IHZvaWQge1xyXG5cclxuICAgIGxldCByb3dJZCA9IHRoaXMuZ2V0UHJvcGVydHkocm93LCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuYWxsQ2hlY2tlZCkge1xyXG4gICAgICBpZiAocm93LmNoZWNrZWQpIHtcclxuICAgICAgICBuaC5yZW1vdmUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hSb3cocm93SWQsIGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLnB1c2gocm93KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZC0tO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocm93LmNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zSW5jbHVkZWQucHVzaChyb3cpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmgucmVtb3ZlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNJbmNsdWRlZCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUm93KHJvd0lkLCBpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZC0tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29sdW1uLm9uQ2hlY2tlZC5lbWl0KHJvdyk7XHJcbiAgICB0aGlzLnVwZGF0ZUFsbENoZWNrZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hSb3cocm93SWQ6IGFueSwgcm93VG9NYXRjaDogYW55KSB7XHJcbiAgICByZXR1cm4gcm93SWQgPT09IHRoaXMuZ2V0UHJvcGVydHkocm93VG9NYXRjaCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jb25maWcuc2VsZWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBbGxDaGVja2VkKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLm11bHRpcGFnZSkge1xyXG4gICAgICB0aGlzLmFsbENoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA+IDBcclxuICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA9PT0gdGhpcy5kYXRhLnRvdGFsRWxlbWVudHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFsbENoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA+IDBcclxuICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA9PT0gdGhpcy5kYXRhLnJlc3VsdHMubGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Um93Q2xhc3Mocm93OiBUKSB7XHJcbiAgICBpZiAocm93ICE9IG51bGwgJiYgdGhpcy5yb3dDbGFzcyAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24odGhpcy5yb3dDbGFzcykpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dDbGFzcyhyb3cpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByb3dDbGFzc1N0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMucm93Q2xhc3MpO1xyXG4gICAgICAgIHJvd0NsYXNzU3RyID0gbmgucmVwbGFjZShyb3dDbGFzc1N0ciwgbmV3IFJlZ0V4cCgne3Jvd30nLCAnZycpLCAncm93Jyk7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnF1b3RlbWFya1xyXG4gICAgICAgIHJvd0NsYXNzU3RyID0gbmgucmVwbGFjZShyb3dDbGFzc1N0ciwgbmV3IFJlZ0V4cChcIidcIiwgJ2cnKSwgJ1wiJyk7XHJcbiAgICAgICAgbGV0IGpzb25Sb3dDbGFzczogYW55ID0gSlNPTi5wYXJzZShyb3dDbGFzc1N0cik7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGpzb25Sb3dDbGFzcykge1xyXG4gICAgICAgICAgaWYgKGpzb25Sb3dDbGFzcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ldmFsXHJcbiAgICAgICAgICAgIGpzb25Sb3dDbGFzc1trZXldID0gZXZhbChqc29uUm93Q2xhc3Nba2V5XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqc29uUm93Q2xhc3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICBjb25zdCBnZXRUeXBlID0ge307XHJcbiAgICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5xdWVyeUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpcmVSZWZyZXNoT25Jbml0KSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19