UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

222 lines 32.9 kB
import { EventEmitter } from '@angular/core'; import { cloneValue } from '../../core/utils'; import { DataUtil } from '../../data-operations/data-util'; import { ExportUtilities } from './export-utilities'; import { TreeGridFilteringStrategy } from '../../grids/tree-grid/tree-grid.filtering.pipe'; var IgxBaseExporter = /** @class */ (function () { function IgxBaseExporter() { this.flatRecords = []; this._isTreeGrid = false; this._indexOfLastPinnedColumn = -1; this._sort = null; /** * This event is emitted when a row is exported. * ```typescript * this.exporterService.onRowExport.subscribe((args: IRowExportingEventArgs) => { * // put event handler code here * }); * ``` * @memberof IgxBaseExporter */ this.onRowExport = new EventEmitter(); /** * This event is emitted when a column is exported. * ```typescript * this.exporterService.onColumnExport.subscribe((args: IColumnExportingEventArgs) => { * // put event handler code here * }); * ``` * @memberof IgxBaseExporter */ this.onColumnExport = new EventEmitter(); } /** * Method for exporting IgxGrid component's data. * ```typescript * this.exporterService.export(this.igxGridForExport, this.exportOptions); * ``` * @memberof IgxBaseExporter */ IgxBaseExporter.prototype.export = function (grid, options) { var _this = this; if (options === undefined || options === null) { throw Error('No options provided!'); } var columns = grid.columnList.toArray(); this._columnList = new Array(columns.length); var hiddenColumns = []; var lastVisbleColumnIndex = -1; columns.forEach(function (column) { var columnHeader = column.header !== '' ? column.header : column.field; var exportColumn = !column.hidden || options.ignoreColumnsVisibility; var index = options.ignoreColumnsOrder ? column.index : column.visibleIndex; var columnInfo = { header: columnHeader, field: column.field, skip: !exportColumn, formatter: column.formatter, skipFormatter: false }; if (index !== -1) { _this._columnList[index] = columnInfo; lastVisbleColumnIndex = Math.max(lastVisbleColumnIndex, index); } else { hiddenColumns.push(columnInfo); } if (column.pinned && exportColumn) { _this._indexOfLastPinnedColumn++; } }); // Append the hidden columns to the end of the list hiddenColumns.forEach(function (hiddenColumn) { _this._columnList[++lastVisbleColumnIndex] = hiddenColumn; }); var data = this.prepareData(grid, options); this.exportData(data, options); }; /** * Method for exporting any kind of array data. * ```typescript * this.exporterService.exportData(this.arrayForExport, this.exportOptions); * ``` * @memberof IgxBaseExporter */ IgxBaseExporter.prototype.exportData = function (data, options) { var _this = this; if (options === undefined || options === null) { throw Error('No options provided!'); } if (!this._columnList || this._columnList.length === 0) { var keys = ExportUtilities.getKeysFromData(data); this._columnList = keys.map(function (k) { return ({ header: k, field: k, skip: false }); }); } var skippedPinnedColumnsCount = 0; var columnsWithoutHeaderCount = 1; this._columnList.forEach(function (column, index) { if (!column.skip) { var columnExportArgs = { header: ExportUtilities.isNullOrWhitespaces(column.header) ? 'Column' + columnsWithoutHeaderCount++ : column.header, field: column.field, columnIndex: index, cancel: false, skipFormatter: false }; _this.onColumnExport.emit(columnExportArgs); column.header = columnExportArgs.header; column.skip = columnExportArgs.cancel; column.skipFormatter = columnExportArgs.skipFormatter; if (column.skip && index <= _this._indexOfLastPinnedColumn) { skippedPinnedColumnsCount++; } if (_this._sort && _this._sort.fieldName === column.field) { if (column.skip) { _this._sort = null; } else { _this._sort.fieldName = column.header; } } } }); this._indexOfLastPinnedColumn -= skippedPinnedColumnsCount; var dataToExport = new Array(); var isSpecialData = ExportUtilities.isSpecialData(data); data.forEach(function (row, index) { _this.exportRow(dataToExport, row, index, isSpecialData); }); this.exportDataImplementation(dataToExport, options); this.resetDefaults(); }; IgxBaseExporter.prototype.exportRow = function (data, rowData, index, isSpecialData) { var _this = this; var row; if (!isSpecialData) { row = this._columnList.reduce(function (a, e) { if (!e.skip) { var rawValue = _this._isTreeGrid ? rowData.data[e.field] : rowData[e.field]; a[e.header] = e.formatter && !e.skipFormatter ? e.formatter(rawValue) : rawValue; } return a; }, {}); } else { row = this._isTreeGrid ? rowData.data : rowData; } var rowArgs = { rowData: row, rowIndex: index, cancel: false }; this.onRowExport.emit(rowArgs); if (!rowArgs.cancel) { data.push({ rowData: rowArgs.rowData, originalRowData: rowData }); } }; IgxBaseExporter.prototype.prepareData = function (grid, options) { this.flatRecords = []; var rootRecords = grid.rootRecords; this._isTreeGrid = rootRecords !== undefined; if (this._isTreeGrid) { this.prepareHierarchicalData(rootRecords); } var data = this._isTreeGrid ? this.flatRecords : grid.data; if (((grid.filteringExpressionsTree && grid.filteringExpressionsTree.filteringOperands.length > 0) || (grid.advancedFilteringExpressionsTree && grid.advancedFilteringExpressionsTree.filteringOperands.length > 0)) && !options.ignoreFiltering) { var filteringState = { expressionsTree: grid.filteringExpressionsTree, advancedExpressionsTree: grid.advancedFilteringExpressionsTree, logic: grid.filteringLogic }; if (this._isTreeGrid) { this.flatRecords = []; filteringState.strategy = (grid.filterStrategy) ? grid.filterStrategy : new TreeGridFilteringStrategy(); rootRecords = filteringState.strategy.filter(rootRecords, filteringState.expressionsTree, filteringState.advancedExpressionsTree); this.prepareHierarchicalData(rootRecords); data = this.flatRecords; } else { filteringState.strategy = grid.filterStrategy; data = DataUtil.filter(data, filteringState); } } if (grid.sortingExpressions && grid.sortingExpressions.length > 0 && !options.ignoreSorting) { this._sort = cloneValue(grid.sortingExpressions[0]); if (this._isTreeGrid) { this.flatRecords = []; rootRecords = DataUtil.treeGridSort(rootRecords, grid.sortingExpressions, grid.sortStrategy); this.prepareHierarchicalData(rootRecords); data = this.flatRecords; } else { data = DataUtil.sort(data, grid.sortingExpressions, grid.sortStrategy); } } return data; }; IgxBaseExporter.prototype.prepareHierarchicalData = function (records) { if (!records) { return; } for (var i = 0; i < records.length; i++) { var hierarchicalRecord = records[i]; this.flatRecords.push(hierarchicalRecord); this.prepareHierarchicalData(hierarchicalRecord.children); } }; IgxBaseExporter.prototype.resetDefaults = function () { this._columnList = []; this._indexOfLastPinnedColumn = -1; this._sort = null; this.flatRecords = []; }; return IgxBaseExporter; }()); export { IgxBaseExporter }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1leHBvcnQtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZXhwb3J0ZXItY29tbW9uL2Jhc2UtZXhwb3J0LXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHckQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUE0RDNGO0lBQUE7UUFFWSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUVmLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLDZCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLFVBQUssR0FBRyxJQUFJLENBQUM7UUFFdkI7Ozs7Ozs7O1dBUUc7UUFDSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRWhFOzs7Ozs7OztXQVFHO1FBQ0ksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztJQXdOMUUsQ0FBQztJQXRORzs7Ozs7O09BTUc7SUFDSSxnQ0FBTSxHQUFiLFVBQWMsSUFBUyxFQUFFLE9BQStCO1FBQXhELGlCQTJDQztRQTFDRyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUMzQyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFNLE9BQU8sQ0FBQyxN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RUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0gsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDMUU7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpREFBdUIsR0FBL0IsVUFBZ0MsT0FBMEI7UUFDdEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU87U0FDVjtRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdEO0lBQ0wsQ0FBQztJQUVPLHVDQUFhLEdBQXJCO1FBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUMsQUFwUEQsSUFvUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY2xvbmVWYWx1ZSwgSUJhc2VFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5cbmltcG9ydCB7IEV4cG9ydFV0aWxpdGllcyB9IGZyb20gJy4vZXhwb3J0LXV0aWxpdGllcyc7XG5pbXBvcnQgeyBJZ3hFeHBvcnRlck9wdGlvbnNCYXNlIH0gZnJvbSAnLi9leHBvcnRlci1vcHRpb25zLWJhc2UnO1xuaW1wb3J0IHsgSVRyZWVHcmlkUmVjb3JkIH0gZnJvbSAnLi4vLi4vZ3JpZHMvdHJlZS1ncmlkL3RyZWUtZ3JpZC5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRyZWVHcmlkRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9ncmlkcy90cmVlLWdyaWQvdHJlZS1ncmlkLmZpbHRlcmluZy5waXBlJztcblxuLyoqXG4gKiBvblJvd0V4cG9ydCBldmVudCBhcmd1bWVudHNcbiAqIHRoaXMuZXhwb3J0ZXJTZXJ2aWNlLm9uUm93RXhwb3J0LnN1YnNjcmliZSgoYXJnczogSVJvd0V4cG9ydGluZ0V2ZW50QXJncykgPT4ge1xuICogLy8gc2V0IGFyZ3MgcHJvcGVydGllcyBoZXJlXG4gKiB9KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3dFeHBvcnRpbmdFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGV4cG9ydGluZyByb3cgZGF0YVxuICAgICAqL1xuICAgIHJvd0RhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBleHBvcnRpbmcgcm93IGluZGV4XG4gICAgICovXG4gICAgcm93SW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNraXAgdGhlIGV4cG9ydGluZyByb3cgd2hlbiBzZXQgdG8gdHJ1ZVxuICAgICAqL1xuICAgIGNhbmNlbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gICAgKiBvbkNvbHVtbkV4cG9ydCBldmVudCBhcmd1bWVudHNcbiAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAqIHRoaXMuZXhwb3J0ZXJTZXJ2aWNlLm9uQ29sdW1uRXhwb3J0LnN1YnNjcmliZSgoYXJnczogSUNvbHVtbkV4cG9ydGluZ0V2ZW50QXJncykgPT4ge1xuICAgICogLy8gc2V0IGFyZ3MgcHJvcGVydGllcyBoZXJlXG4gICAgKiB9KTtcbiAgICAqIGBgYFxuICAgICovXG5leHBvcnQgaW50ZXJmYWNlIElDb2x1bW5FeHBvcnRpbmdFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGV4cG9ydGluZyBjb2x1bW4gaGVhZGVyXG4gICAgICovXG4gICAgaGVhZGVyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgZXhwb3J0aW5nIGNvbHVtbiBmaWVsZCBuYW1lXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBleHBvcnRpbmcgY29sdW1uIGluZGV4XG4gICAgICovXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNraXAgdGhlIGV4cG9ydGluZyBjb2x1bW4gd2hlbiBzZXQgdG8gdHJ1ZVxuICAgICAqL1xuICAgIGNhbmNlbDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEV4cG9ydCB0aGUgY29sdW1uJ3MgZGF0YSB3aXRob3V0IGFwcGx5aW5nIGl0cyBmb3JtYXR0ZXIsIHdoZW4gc2V0IHRvIHRydWVcbiAgICAgKi9cbiAgICBza2lwRm9ybWF0dGVyOiBib29sZWFuO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4QmFzZUV4cG9ydGVyIHtcbiAgICBwcml2YXRlIF9jb2x1bW5MaXN0OiBhbnlbXTtcbiAgICBwcml2YXRlIGZsYXRSZWNvcmRzID0gW107XG5cbiAgICBwcm90ZWN0ZWQgX2lzVHJlZUdyaWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2luZGV4T2ZMYXN0UGlubmVkQ29sdW1uID0gLTE7XG4gICAgcHJvdGVjdGVkIF9zb3J0ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZW1pdHRlZCB3aGVuIGEgcm93IGlzIGV4cG9ydGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmV4cG9ydGVyU2VydmljZS5vblJvd0V4cG9ydC5zdWJzY3JpYmUoKGFyZ3M6IElSb3dFeHBvcnRpbmdFdmVudEFyZ3MpID0+IHtcbiAgICAgKiAvLyBwdXQgZXZlbnQgaGFuZGxlciBjb2RlIGhlcmVcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4QmFzZUV4cG9ydGVyXG4gICAgICovXG4gICAgcHVibGljIG9uUm93RXhwb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RXhwb3J0aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgZXhwb3J0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZXhwb3J0ZXJTZXJ2aWNlLm9uQ29sdW1uRXhwb3J0LnN1YnNjcmliZSgoYXJnczogSUNvbHVtbkV4cG9ydGluZ0V2ZW50QXJncykgPT4ge1xuICAgICAqIC8vIHB1dCBldmVudCBoYW5kbGVyIGNvZGUgaGVyZVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hCYXNlRXhwb3J0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db2x1bW5FeHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5FeHBvcnRpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgZm9yIGV4cG9ydGluZyBJZ3hHcmlkIGNvbXBvbmVudCdzIGRhdGEuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZXhwb3J0ZXJTZXJ2aWNlLmV4cG9ydCh0aGlzLmlneEdyaWRGb3JFeHBvcnQsIHRoaXMuZXhwb3J0T3B0aW9ucyk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJhc2VFeHBvcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBleHBvcnQoZ3JpZDogYW55LCBvcHRpb25zOiBJZ3hFeHBvcnRlck9wdGlvbnNCYXNlKTogdm9pZCB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05vIG9wdGlvbnMgcHJvdmlkZWQhJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5zID0gZ3JpZC5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fY29sdW1uTGlzdCA9IG5ldyBBcnJheTxhbnk+KGNvbHVtbnMubGVuZ3RoKTtcblxuICAgICAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gW107XG4gICAgICAgIGxldCBsYXN0VmlzYmxlQ29sdW1uSW5kZXggPSAtMTtcblxuICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyID0gY29sdW1uLmhlYWRlciAhPT0gJycgPyBjb2x1bW4uaGVhZGVyIDogY29sdW1uLmZpZWxkO1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0Q29sdW1uID0gIWNvbHVtbi5oaWRkZW4gfHwgb3B0aW9ucy5pZ25vcmVDb2x1bW5zVmlzaWJpbGl0eTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5pZ25vcmVDb2x1bW5zT3JkZXIgPyBjb2x1bW4uaW5kZXggOiBjb2x1bW4udmlzaWJsZUluZGV4O1xuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmZvID0ge1xuICAgICAgICAgICAgICAgIGhlYWRlcjogY29sdW1uSGVhZGVyLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgc2tpcDogIWV4cG9ydENvbHVtbixcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGNvbHVtbi5mb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgc2tpcEZvcm1hdHRlcjogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5MaXN0W2luZGV4XSA9IGNvbHVtbkluZm87XG4gICAgICAgICAgICAgICAgbGFzdFZpc2JsZUNvbHVtbkluZGV4ID0gTWF0aC5tYXgobGFzdFZpc2JsZUNvbHVtbkluZGV4LCBpbmRleCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhpZGRlbkNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5waW5uZWQgJiYgZXhwb3J0Q29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5kZXhPZkxhc3RQaW5uZWRDb2x1bW4rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoaWRkZW4gY29sdW1ucyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaCgoaGlkZGVuQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5MaXN0WysrbGFzdFZpc2JsZUNvbHVtbkluZGV4XSA9IGhpZGRlbkNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucHJlcGFyZURhdGEoZ3JpZCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZXhwb3J0RGF0YShkYXRhLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgZm9yIGV4cG9ydGluZyBhbnkga2luZCBvZiBhcnJheSBkYXRhLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmV4cG9ydGVyU2VydmljZS5leHBvcnREYXRhKHRoaXMuYXJyYXlGb3JFeHBvcnQsIHRoaXMuZXhwb3J0T3B0aW9ucyk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJhc2VFeHBvcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBleHBvcnREYXRhKGRhdGE6IGFueVtdLCBvcHRpb25zOiBJZ3hFeHBvcnRlck9wdGlvbnNCYXNlKTogdm9pZCB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05vIG9wdGlvbnMgcHJvdmlkZWQhJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NvbHVtbkxpc3QgfHwgdGhpcy5fY29sdW1uTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBFeHBvcnRVdGlsaXRpZXMuZ2V0S2V5c0Zyb21EYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5fY29sdW1uTGlzdCA9IGtleXMubWFwKChrKSA9PiAoeyBoZWFkZXI6IGssIGZpZWxkOiBrLCBza2lwOiBmYWxzZSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2tpcHBlZFBpbm5lZENvbHVtbnNDb3VudCA9IDA7XG4gICAgICAgIGxldCBjb2x1bW5zV2l0aG91dEhlYWRlckNvdW50ID0gMTtcbiAgICAgICAgdGhpcy5fY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbHVtbi5za2lwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uRXhwb3J0QXJncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBFeHBvcnRVdGlsaXRpZXMuaXNOdWxsT3JXaGl0ZXNwYWNlcyhjb2x1bW4uaGVhZGVyKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29sdW1uJyArIGNvbHVtbnNXaXRob3V0SGVhZGVyQ291bnQrKyA6IGNvbHVtbi5oZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc2tpcEZvcm1hdHRlcjogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5FeHBvcnQuZW1pdChjb2x1bW5FeHBvcnRBcmdzKTtcblxuICAgICAgICAgICAgICAgIGNvbHVtbi5oZWFkZXIgPSBjb2x1bW5FeHBvcnRBcmdzLmhlYWRlcjtcbiAgICAgICAgICAgICAgICBjb2x1bW4uc2tpcCA9IGNvbHVtbkV4cG9ydEFyZ3MuY2FuY2VsO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5za2lwRm9ybWF0dGVyID0gY29sdW1uRXhwb3J0QXJncy5za2lwRm9ybWF0dGVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5za2lwICYmIGluZGV4IDw9IHRoaXMuX2luZGV4T2ZMYXN0UGlubmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWRQaW5uZWRDb2x1bW5zQ291bnQrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29ydCAmJiB0aGlzLl9zb3J0LmZpZWxkTmFtZSA9PT0gY29sdW1uLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3J0LmZpZWxkTmFtZSA9IGNvbHVtbi5oZWFkZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2luZGV4T2ZMYXN0UGlubmVkQ29sdW1uIC09IHNraXBwZWRQaW5uZWRDb2x1bW5zQ291bnQ7XG5cbiAgICAgICAgY29uc3QgZGF0YVRvRXhwb3J0ID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgICAgY29uc3QgaXNTcGVjaWFsRGF0YSA9IEV4cG9ydFV0aWxpdGllcy5pc1NwZWNpYWxEYXRhKGRhdGEpO1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBvcnRSb3coZGF0YVRvRXhwb3J0LCByb3csIGluZGV4LCBpc1NwZWNpYWxEYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5leHBvcnREYXRhSW1wbGVtZW50YXRpb24oZGF0YVRvRXhwb3J0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZXNldERlZmF1bHRzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGV4cG9ydERhdGFJbXBsZW1lbnRhdGlvbihkYXRhOiBhbnlbXSwgb3B0aW9uczogSWd4RXhwb3J0ZXJPcHRpb25zQmFzZSk6IHZvaWQ7XG5cbiAgICBwcml2YXRlIGV4cG9ydFJvdyhkYXRhOiBhbnlbXSwgcm93RGF0YTogYW55LCBpbmRleDogbnVtYmVyLCBpc1NwZWNpYWxEYXRhOiBib29sZWFuKSB7XG4gICAgICAgIGxldCByb3c7XG5cbiAgICAgICAgaWYgKCFpc1NwZWNpYWxEYXRhKSB7XG4gICAgICAgICAgICByb3cgPSB0aGlzLl9jb2x1bW5MaXN0LnJlZHVjZSgoYSwgZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZS5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5faXNUcmVlR3JpZCA/IHJvd0RhdGEuZGF0YVtlLmZpZWxkXSA6IHJvd0RhdGFbZS5maWVsZF07XG4gICAgICAgICAgICAgICAgICAgIGFbZS5oZWFkZXJdID0gZS5mb3JtYXR0ZXIgJiYgIWUuc2tpcEZvcm1hdHRlciA/IGUuZm9ybWF0dGVyKHJhd1ZhbHVlKSA6IHJhd1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuX2lzVHJlZUdyaWQgPyByb3dEYXRhLmRhdGEgOiByb3dEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93QXJncyA9IHtcbiAgICAgICAgICAgIHJvd0RhdGE6IHJvdyxcbiAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblJvd0V4cG9ydC5lbWl0KHJvd0FyZ3MpO1xuXG4gICAgICAgIGlmICghcm93QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh7IHJvd0RhdGE6IHJvd0FyZ3Mucm93RGF0YSwgb3JpZ2luYWxSb3dEYXRhOiByb3dEYXRhIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRGF0YShncmlkOiBhbnksIG9wdGlvbnM6IElneEV4cG9ydGVyT3B0aW9uc0Jhc2UpOiBhbnlbXSB7XG4gICAgICAgIHRoaXMuZmxhdFJlY29yZHMgPSBbXTtcbiAgICAgICAgbGV0IHJvb3RSZWNvcmRzID0gZ3JpZC5yb290UmVjb3JkcztcbiAgICAgICAgdGhpcy5faXNUcmVlR3JpZCA9IHJvb3RSZWNvcmRzICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzVHJlZUdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUhpZXJhcmNoaWNhbERhdGEocm9vdFJlY29yZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLl9pc1RyZWVHcmlkID8gdGhpcy5mbGF0UmVjb3JkcyA6IGdyaWQuZGF0YTtcblxuICAgICAgICBpZiAoKChncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSAmJlxuICAgICAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgIChncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlICYmXG4gICAgICAgICAgICBncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgIW9wdGlvbnMuaWdub3JlRmlsdGVyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZTogYW55ID0ge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZTogZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRFeHByZXNzaW9uc1RyZWU6IGdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgICAgICAgICAgbG9naWM6IGdyaWQuZmlsdGVyaW5nTG9naWNcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1RyZWVHcmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGF0UmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZpbHRlcmluZ1N0YXRlLnN0cmF0ZWd5ID0gKGdyaWQuZmlsdGVyU3RyYXRlZ3kpID8gZ3JpZC5maWx0ZXJTdHJhdGVneSA6IG5ldyBUcmVlR3JpZEZpbHRlcmluZ1N0cmF0ZWd5KCk7XG4gICAgICAgICAgICAgICAgcm9vdFJlY29yZHMgPSBmaWx0ZXJpbmdTdGF0ZS5zdHJhdGVneS5maWx0ZXIocm9vdFJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZ1N0YXRlLmV4cHJlc3Npb25zVHJlZSwgZmlsdGVyaW5nU3RhdGUuYWR2YW5jZWRFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZUhpZXJhcmNoaWNhbERhdGEocm9vdFJlY29yZHMpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmZsYXRSZWNvcmRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5zdHJhdGVneSA9IGdyaWQuZmlsdGVyU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgZGF0YSA9IERhdGFVdGlsLmZpbHRlcihkYXRhLCBmaWx0ZXJpbmdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3JpZC5zb3J0aW5nRXhwcmVzc2lvbnMgJiZcbiAgICAgICAgICAgIGdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICFvcHRpb25zLmlnbm9yZVNvcnRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnQgPSBjbG9uZVZhbHVlKGdyaWQuc29ydGluZ0V4cHJlc3Npb25zWzBdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzVHJlZUdyaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsYXRSZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgcm9vdFJlY29yZHMgPSBEYXRhVXRpbC50cmVlR3JpZFNvcnQocm9vdFJlY29yZHMsIGdyaWQuc29ydGluZ0V4cHJlc3Npb25zLCBncmlkLnNvcnRTdHJhdGVneSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlSGllcmFyY2hpY2FsRGF0YShyb290UmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZmxhdFJlY29yZHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBEYXRhVXRpbC5zb3J0KGRhdGEsIGdyaWQuc29ydGluZ0V4cHJlc3Npb25zLCBncmlkLnNvcnRTdHJhdGVneSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVIaWVyYXJjaGljYWxEYXRhKHJlY29yZHM6IElUcmVlR3JpZFJlY29yZFtdKSB7XG4gICAgICAgIGlmICghcmVjb3Jkcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGllcmFyY2hpY2FsUmVjb3JkID0gcmVjb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5mbGF0UmVjb3Jkcy5wdXNoKGhpZXJhcmNoaWNhbFJlY29yZCk7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVIaWVyYXJjaGljYWxEYXRhKGhpZXJhcmNoaWNhbFJlY29yZC5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5faW5kZXhPZkxhc3RQaW5uZWRDb2x1bW4gPSAtMTtcbiAgICAgICAgdGhpcy5fc29ydCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhdFJlY29yZHMgPSBbXTtcbiAgICB9XG59XG4iXX0=