UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

668 lines (667 loc) 45.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { LoaderStatus } from './LoaderStatus'; import { EventUtils } from '../share/utils/EventUtils'; import { PAUSE_EVENT, RESUME_EVENT, STOP_EVENT } from '../share/CustomEventType'; var LoadProcessor = /** @class */ (function () { function LoadProcessor(continueOnReject) { this.status = LoaderStatus.STOPPED; this.processes = []; this.processed = []; this.disabled = false; this.isFirstStarted = false; this.successResult = {}; this.rejectResult = {}; this.processCompleteEvent = new EventEmitter(); this.processResolveEvent = new EventEmitter(); this.processRejectEvent = new EventEmitter(); this.taskStartEvent = new EventEmitter(); this.taskCompleteEvent = new EventEmitter(); this.taskResolveEvent = new EventEmitter(); this.taskRejectEvent = new EventEmitter(); this.pauseEvent = new EventEmitter(); this.resumeEvent = new EventEmitter(); this.startEvent = new EventEmitter(); this.stopEvent = new EventEmitter(); if (continueOnReject === null || typeof continueOnReject !== 'boolean') { this.continueOnReject = true; } else { this.continueOnReject = continueOnReject; } } /** * @param {?} type * @param {?} success * @param {?} error * @return {?} */ LoadProcessor.prototype.getCustomEventObject = /** * @param {?} type * @param {?} success * @param {?} error * @return {?} */ function (type, success, error) { var /** @type {?} */ successCount = Object.keys(this.successResult).length; var /** @type {?} */ errorCount = Object.keys(this.rejectResult).length; var /** @type {?} */ totalCount = this.processes.length + this.processed.length; var /** @type {?} */ percent = 0; if (totalCount > 0) { percent = this.processes.length * (100 / totalCount); } var /** @type {?} */ wrapData = { success: success, error: error, percent: percent, totalCount: totalCount, processed: successCount + errorCount, successCount: successCount, errorCount: errorCount }; var /** @type {?} */ ev = EventUtils.newCustomEvent(type, null, wrapData, null); return ev; }; /** * @return {?} */ LoadProcessor.prototype.startNextProcess = /** * @return {?} */ function () { var _this = this; if (this.processes.length > 0) { var /** @type {?} */ firstProccess_1 = this.processes[0]; var /** @type {?} */ processName_1 = firstProccess_1.getName(); return firstProccess_1.start().then(function (result) { _this.successResult[processName_1] = result; // remove first & insert processed // remove first & insert processed _this.remove(0); _this.processed.push(firstProccess_1); return _this.startNextProcess(); }, function (rejResult) { _this.rejectResult[processName_1] = rejResult; // remove first & insert processed // remove first & insert processed _this.remove(0); _this.processed.push(firstProccess_1); if (_this.continueOnReject) { return _this.startNextProcess(); } return Promise.reject(rejResult); }); } return Promise.resolve(); }; /** * @param {?} disabled * @return {?} */ LoadProcessor.prototype.setDisabled = /** * @param {?} disabled * @return {?} */ function (disabled) { this.disabled = disabled; if (this.processes !== null) { try { for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) { var process_1 = _b.value; process_1.setDisabled(this.disabled); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } } var e_1, _c; }; /** * @return {?} */ LoadProcessor.prototype.isDisabled = /** * @return {?} */ function () { return this.disabled; }; /** * @return {?} */ LoadProcessor.prototype.getRunningProcess = /** * @return {?} */ function () { try { for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) { var loadProcess = _b.value; if (loadProcess.isRunning() || loadProcess.isPaused()) { return loadProcess; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_2) throw e_2.error; } } return null; var e_2, _c; }; /** * @return {?} */ LoadProcessor.prototype.getRunningPercent = /** * @return {?} */ function () { var /** @type {?} */ runningProcess = this.getRunningProcess(); if (runningProcess !== null && runningProcess !== undefined) { return runningProcess.getPercent(); } return 0; }; /** * @return {?} */ LoadProcessor.prototype.getRunningTaskCount = /** * @return {?} */ function () { var /** @type {?} */ runningProcess = this.getRunningProcess(); if (runningProcess !== null && runningProcess !== undefined) { return runningProcess.getTaskCount(); } return 0; }; /** * @param {?} process * @return {?} */ LoadProcessor.prototype.addProcess = /** * @param {?} process * @return {?} */ function (process) { var _this = this; if (process !== null && process !== undefined) { process.setContinueOnReject(this.continueOnReject); process.getTaskRejectEvent().subscribe(function (event) { _this.taskRejectEvent.emit(event); }); process.getTaskResolveEvent().subscribe(function (event) { _this.taskResolveEvent.emit(event); }); process.getTaskCompleteEvent().subscribe(function (event) { _this.taskCompleteEvent.emit(event); }); process.getTaskStartEvent().subscribe(function (event) { _this.taskStartEvent.emit(event); }); this.processes.push(process); } return this; }; /** * @param {?} process * @return {?} */ LoadProcessor.prototype.removeProcess = /** * @param {?} process * @return {?} */ function (process) { var /** @type {?} */ index = this.processes.indexOf(process); return this.remove(index); }; /** * @param {?} index * @return {?} */ LoadProcessor.prototype.remove = /** * @param {?} index * @return {?} */ function (index) { if (index < this.processes.length) { this.processes.splice(index, 1); } return this; }; /** * @return {?} */ LoadProcessor.prototype.start = /** * @return {?} */ function () { var _this = this; if (this.disabled) { throw new Error('Process is disabled'); } if (this.isFirstStarted) { throw new Error('Process was started or has been process'); } if (this.isStopped()) { this.status = LoaderStatus.RUNNING; this.isFirstStarted = true; } // promise start return new Promise(function (resolve, reject) { _this.startNextProcess().then(function (result) { resolve(_this.successResult); }, function (rejectResult) { reject(_this.rejectResult); }); }); }; /** * @return {?} */ LoadProcessor.prototype.pause = /** * @return {?} */ function () { if (this.disabled) { throw new Error('Process is disabled'); } if (this.isRunning()) { this.status = LoaderStatus.PAUSED; } var /** @type {?} */ ev = this.getCustomEventObject(PAUSE_EVENT, null, null); this.pauseEvent.emit(ev); var /** @type {?} */ runningProcess = this.getRunningProcess(); if (runningProcess !== null && runningProcess !== undefined) { runningProcess.pause(); } }; /** * @return {?} */ LoadProcessor.prototype.resume = /** * @return {?} */ function () { if (this.disabled) { throw new Error('Process is disabled'); } if (this.isPaused()) { this.status = LoaderStatus.RUNNING; } var /** @type {?} */ ev = this.getCustomEventObject(RESUME_EVENT, null, null); this.resumeEvent.emit(ev); var /** @type {?} */ runningProcess = this.getRunningProcess(); if (runningProcess !== null && runningProcess !== undefined) { runningProcess.resume(); } }; /** * @return {?} */ LoadProcessor.prototype.stop = /** * @return {?} */ function () { if (this.disabled) { throw new Error('Process is disabled'); } if (this.isRunning() || this.isPaused()) { this.status = LoaderStatus.STOPPED; } var /** @type {?} */ ev = this.getCustomEventObject(STOP_EVENT, null, null); this.stopEvent.emit(ev); var /** @type {?} */ runningProcess = this.getRunningProcess(); if (runningProcess !== null && runningProcess !== undefined) { runningProcess.stop(); } }; /** * @return {?} */ LoadProcessor.prototype.getState = /** * @return {?} */ function () { return this.status; }; /** * @return {?} */ LoadProcessor.prototype.isRunning = /** * @return {?} */ function () { return this.status === LoaderStatus.RUNNING; }; /** * @return {?} */ LoadProcessor.prototype.isPaused = /** * @return {?} */ function () { return this.status === LoaderStatus.PAUSED; }; /** * @return {?} */ LoadProcessor.prototype.isStopped = /** * @return {?} */ function () { return this.status === LoaderStatus.STOPPED; }; /** * @return {?} */ LoadProcessor.prototype.getContinueOnReject = /** * @return {?} */ function () { return this.continueOnReject; }; /** * @param {?} continueOnReject * @return {?} */ LoadProcessor.prototype.setContinueOnReject = /** * @param {?} continueOnReject * @return {?} */ function (continueOnReject) { if (this.isFirstStarted) { throw new Error('Process was started or has been process'); } this.continueOnReject = continueOnReject; if (this.processes !== null && this.processes !== undefined) { try { for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) { var process_2 = _b.value; process_2.setContinueOnReject(this.continueOnReject); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_3) throw e_3.error; } } } var e_3, _c; }; /** * @return {?} */ LoadProcessor.prototype.getPauseEvent = /** * @return {?} */ function () { return this.pauseEvent; }; /** * @param {?} pauseEvent * @return {?} */ LoadProcessor.prototype.setPauseEvent = /** * @param {?} pauseEvent * @return {?} */ function (pauseEvent) { this.pauseEvent = pauseEvent; }; /** * @return {?} */ LoadProcessor.prototype.getResumeEvent = /** * @return {?} */ function () { return this.resumeEvent; }; /** * @param {?} resumeEvent * @return {?} */ LoadProcessor.prototype.setResumeEvent = /** * @param {?} resumeEvent * @return {?} */ function (resumeEvent) { this.resumeEvent = resumeEvent; }; /** * @return {?} */ LoadProcessor.prototype.getStartEvent = /** * @return {?} */ function () { return this.startEvent; }; /** * @param {?} startEvent * @return {?} */ LoadProcessor.prototype.setStartEvent = /** * @param {?} startEvent * @return {?} */ function (startEvent) { this.startEvent = startEvent; }; /** * @return {?} */ LoadProcessor.prototype.getStopEvent = /** * @return {?} */ function () { return this.stopEvent; }; /** * @param {?} stopEvent * @return {?} */ LoadProcessor.prototype.setStopEvent = /** * @param {?} stopEvent * @return {?} */ function (stopEvent) { this.stopEvent = stopEvent; }; /** * @return {?} */ LoadProcessor.prototype.getProcessCompleteEvent = /** * @return {?} */ function () { return this.processCompleteEvent; }; /** * @param {?} processCompleteEvent * @return {?} */ LoadProcessor.prototype.setProcessCompleteEvent = /** * @param {?} processCompleteEvent * @return {?} */ function (processCompleteEvent) { this.processCompleteEvent = processCompleteEvent; }; /** * @return {?} */ LoadProcessor.prototype.getProcessResolveEvent = /** * @return {?} */ function () { return this.processResolveEvent; }; /** * @param {?} processResolveEvent * @return {?} */ LoadProcessor.prototype.setProcessResolveEvent = /** * @param {?} processResolveEvent * @return {?} */ function (processResolveEvent) { this.processResolveEvent = processResolveEvent; }; /** * @return {?} */ LoadProcessor.prototype.getProcessRejectEvent = /** * @return {?} */ function () { return this.processRejectEvent; }; /** * @param {?} processRejectEvent * @return {?} */ LoadProcessor.prototype.setProcessRejectEvent = /** * @param {?} processRejectEvent * @return {?} */ function (processRejectEvent) { this.processRejectEvent = processRejectEvent; }; /** * @return {?} */ LoadProcessor.prototype.getTaskStartEvent = /** * @return {?} */ function () { return this.taskStartEvent; }; /** * @param {?} taskStartEvent * @return {?} */ LoadProcessor.prototype.setTaskStartEvent = /** * @param {?} taskStartEvent * @return {?} */ function (taskStartEvent) { this.taskStartEvent = taskStartEvent; }; /** * @return {?} */ LoadProcessor.prototype.getTaskCompleteEvent = /** * @return {?} */ function () { return this.taskCompleteEvent; }; /** * @param {?} taskCompleteEvent * @return {?} */ LoadProcessor.prototype.setTaskCompleteEvent = /** * @param {?} taskCompleteEvent * @return {?} */ function (taskCompleteEvent) { this.taskCompleteEvent = taskCompleteEvent; }; /** * @return {?} */ LoadProcessor.prototype.getTaskResolveEvent = /** * @return {?} */ function () { return this.taskResolveEvent; }; /** * @param {?} taskResolveEvent * @return {?} */ LoadProcessor.prototype.setTaskResolveEvent = /** * @param {?} taskResolveEvent * @return {?} */ function (taskResolveEvent) { this.taskResolveEvent = taskResolveEvent; }; /** * @return {?} */ LoadProcessor.prototype.getTaskRejectEvent = /** * @return {?} */ function () { return this.taskRejectEvent; }; /** * @param {?} taskRejectEvent * @return {?} */ LoadProcessor.prototype.setTaskRejectEvent = /** * @param {?} taskRejectEvent * @return {?} */ function (taskRejectEvent) { this.taskRejectEvent = taskRejectEvent; }; return LoadProcessor; }()); export { LoadProcessor }; function LoadProcessor_tsickle_Closure_declarations() { /** @type {?} */ LoadProcessor.prototype.processes; /** @type {?} */ LoadProcessor.prototype.processed; /** @type {?} */ LoadProcessor.prototype.disabled; /** @type {?} */ LoadProcessor.prototype.status; /** @type {?} */ LoadProcessor.prototype.isFirstStarted; /** @type {?} */ LoadProcessor.prototype.continueOnReject; /** @type {?} */ LoadProcessor.prototype.successResult; /** @type {?} */ LoadProcessor.prototype.rejectResult; /** @type {?} */ LoadProcessor.prototype.processCompleteEvent; /** @type {?} */ LoadProcessor.prototype.processResolveEvent; /** @type {?} */ LoadProcessor.prototype.processRejectEvent; /** @type {?} */ LoadProcessor.prototype.taskStartEvent; /** @type {?} */ LoadProcessor.prototype.taskCompleteEvent; /** @type {?} */ LoadProcessor.prototype.taskResolveEvent; /** @type {?} */ LoadProcessor.prototype.taskRejectEvent; /** @type {?} */ LoadProcessor.prototype.pauseEvent; /** @type {?} */ LoadProcessor.prototype.resumeEvent; /** @type {?} */ LoadProcessor.prototype.startEvent; /** @type {?} */ LoadProcessor.prototype.stopEvent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9Mb2FkUHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFDdEMsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxJQUFBO0lBdUJFLHVCQUFZLGdCQUEwQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlB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QyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Ozs7OztJQUd6Qiw0Q0FBb0I7Ozs7Y0FBQyxpQkFBb0M7UUFDOUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDOzs7OztJQUd0QywyQ0FBbUI7Ozs7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Ozs7O0lBR3hCLDJDQUFtQjs7OztjQUFDLGdCQUFtQztRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7Ozs7O0lBR3BDLDBDQUFrQjs7OztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7O0lBR3ZCLDBDQUFrQjs7OztjQUFDLGVBQWtDO1FBQzFELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDOzt3QkFwWTNDO0lBc1lDLENBQUE7QUE3WEQseUJBNlhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJTG9hZGVyIH0gZnJvbSAnLi9JTG9hZGVyJztcbmltcG9ydCB7IExvYWRlclN0YXR1cyB9IGZyb20gJy4vTG9hZGVyU3RhdHVzJztcbmltcG9ydCB7IExvYWRQcm9jZXNzIH0gZnJvbSAnLi9Mb2FkUHJvY2Vzcyc7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQge1xuICBQQVVTRV9FVkVOVCwgUkVTVU1FX0VWRU5ULCBTVE9QX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBMb2FkUHJvY2Vzc29yIGltcGxlbWVudHMgSUxvYWRlciB7XG5cbiAgcHJpdmF0ZSBwcm9jZXNzZXM6IExvYWRQcm9jZXNzW107XG4gIHByaXZhdGUgcHJvY2Vzc2VkOiBMb2FkUHJvY2Vzc1tdO1xuICBwcml2YXRlIGRpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHN0YXR1czogTG9hZGVyU3RhdHVzO1xuICBwcml2YXRlIGlzRmlyc3RTdGFydGVkOiBib29sZWFuO1xuICBwcml2YXRlIGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgc3VjY2Vzc1Jlc3VsdDogYW55O1xuICBwcml2YXRlIHJlamVjdFJlc3VsdDogYW55O1xuICBwcml2YXRlIHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcml2YXRlIHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSB0YXNrQ29tcGxldGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1JlamVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSByZXN1bWVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RvcEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuXG4gIGNvbnN0cnVjdG9yKGNvbnRpbnVlT25SZWplY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuU1RPUFBFRDtcbiAgICB0aGlzLnByb2Nlc3NlcyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkID0gW107XG4gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNGaXJzdFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NSZXN1bHQgPSB7fTtcbiAgICB0aGlzLnJlamVjdFJlc3VsdCA9IHt9O1xuXG4gICAgdGhpcy5wcm9jZXNzQ29tcGxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy50YXNrU3RhcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnBhdXNlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5yZXN1bWVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBpZiAoY29udGludWVPblJlamVjdCA9PT0gbnVsbCB8fCB0eXBlb2YgY29udGludWVPblJlamVjdCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRXZlbnRPYmplY3QodHlwZTogYW55LCBzdWNjZXNzOiBhbnksIGVycm9yOiBhbnkpOiBhbnkge1xuICAgIGxldCBzdWNjZXNzQ291bnQgPSBPYmplY3Qua2V5cyh0aGlzLnN1Y2Nlc3NSZXN1bHQpLmxlbmd0aDtcbiAgICBsZXQgZXJyb3JDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMucmVqZWN0UmVzdWx0KS5sZW5ndGg7XG4gICAgbGV0IHRvdGFsQ291bnQgPSB0aGlzLnByb2Nlc3Nlcy5sZW5ndGggKyB0aGlzLnByb2Nlc3NlZC5sZW5ndGg7XG4gICAgbGV0IHBlcmNlbnQgPSAwO1xuICAgIGlmICh0b3RhbENvdW50ID4gMCkge1xuICAgICAgcGVyY2VudCA9IHRoaXMucHJvY2Vzc2VzLmxlbmd0aCAqICgxMDAgLyB0b3RhbENvdW50KTtcbiAgICB9XG5cbiAgICBsZXQgd3JhcERhdGEgPSB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgcGVyY2VudDogcGVyY2VudCxcbiAgICAgIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQsXG4gICAgICBwcm9jZXNzZWQ6IHN1Y2Nlc3NDb3VudCArIGVycm9yQ291bnQsXG4gICAgICBzdWNjZXNzQ291bnQ6IHN1Y2Nlc3NDb3VudCxcbiAgICAgIGVycm9yQ291bnQ6IGVycm9yQ291bnRcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQodHlwZSwgbnVsbCwgd3JhcERhdGEsIG51bGwpO1xuXG4gICAgcmV0dXJuIGV2O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydE5leHRQcm9jZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmaXJzdFByb2NjZXNzID0gdGhpcy5wcm9jZXNzZXNbMF07XG4gICAgICBsZXQgcHJvY2Vzc05hbWUgPSBmaXJzdFByb2NjZXNzLmdldE5hbWUoKTtcblxuICAgICAgcmV0dXJuIGZpcnN0UHJvY2Nlc3Muc3RhcnQoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Y2Nlc3NSZXN1bHRbcHJvY2Vzc05hbWVdID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCAmIGluc2VydCBwcm9jZXNzZWRcbiAgICAgICAgdGhpcy5yZW1vdmUoMCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkLnB1c2goZmlyc3RQcm9jY2Vzcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnROZXh0UHJvY2VzcygpO1xuICAgICAgfSwgKHJlalJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucmVqZWN0UmVzdWx0W3Byb2Nlc3NOYW1lXSA9IHJlalJlc3VsdDtcblxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgJiBpbnNlcnQgcHJvY2Vzc2VkXG4gICAgICAgIHRoaXMucmVtb3ZlKDApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZC5wdXNoKGZpcnN0UHJvY2Nlc3MpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRpbnVlT25SZWplY3QpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE5leHRQcm9jZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVqUmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIGlmIGlzRGlzYWJsZSBhbGwgYWN0aW9uXG4gIHB1YmxpYyBzZXREaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcblxuICAgIGlmICh0aGlzLnByb2Nlc3NlcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgcHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgICBwcm9jZXNzLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIGdldFJ1bm5pbmdQcm9jZXNzKCk6IExvYWRQcm9jZXNzIHtcbiAgICBmb3IgKGxldCBsb2FkUHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgaWYgKGxvYWRQcm9jZXNzLmlzUnVubmluZygpIHx8IGxvYWRQcm9jZXNzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9jZXNzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJ1bm5pbmdQcm9jZXNzLmdldFBlcmNlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nVGFza0NvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcnVubmluZ1Byb2Nlc3MuZ2V0VGFza0NvdW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvY2Vzcyhwcm9jZXNzOiBMb2FkUHJvY2Vzcyk6IExvYWRQcm9jZXNzb3Ige1xuICAgIGlmIChwcm9jZXNzICE9PSBudWxsICYmIHByb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tSZWplY3RFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tSZWplY3RFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrUmVzb2x2ZUV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1Jlc29sdmVFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrQ29tcGxldGVFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tTdGFydEV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1N0YXJ0RXZlbnQuZW1pdChldmVudCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wcm9jZXNzZXMucHVzaChwcm9jZXNzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQcm9jZXNzKHByb2Nlc3M6IExvYWRQcm9jZXNzKTogTG9hZFByb2Nlc3NvciB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5wcm9jZXNzZXMuaW5kZXhPZihwcm9jZXNzKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmUoaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZShpbmRleDogbnVtYmVyKTogTG9hZFByb2Nlc3NvciB7XG4gICAgaWYgKGluZGV4IDwgdGhpcy5wcm9jZXNzZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByb2Nlc3Nlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvY2VzcyBpcyBkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmlyc3RTdGFydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3Mgd2FzIHN0YXJ0ZWQgb3IgaGFzIGJlZW4gcHJvY2VzcycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3RvcHBlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgICAgdGhpcy5pc0ZpcnN0U3RhcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvbWlzZSBzdGFydFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0TmV4dFByb2Nlc3MoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuc3VjY2Vzc1Jlc3VsdCk7XG4gICAgICB9LCAocmVqZWN0UmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgcmVqZWN0KHRoaXMucmVqZWN0UmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhdXNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUEFVU0VfRVZFTlQsIG51bGwsIG51bGwpO1xuICAgIHRoaXMucGF1c2VFdmVudC5lbWl0KGV2KTtcblxuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVubmluZ1Byb2Nlc3MucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdW1lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUkVTVU1FX0VWRU5ULCBudWxsLCBudWxsKTtcbiAgICB0aGlzLnJlc3VtZUV2ZW50LmVtaXQoZXYpO1xuXG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydW5uaW5nUHJvY2Vzcy5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKCkgfHwgdGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoU1RPUF9FVkVOVCwgbnVsbCwgbnVsbCk7XG4gICAgdGhpcy5zdG9wRXZlbnQuZW1pdChldik7XG5cbiAgICBsZXQgcnVubmluZ1Byb2Nlc3MgPSB0aGlzLmdldFJ1bm5pbmdQcm9jZXNzKCk7XG4gICAgaWYgKHJ1bm5pbmdQcm9jZXNzICE9PSBudWxsICYmIHJ1bm5pbmdQcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bm5pbmdQcm9jZXNzLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKTogTG9hZGVyU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXM7XG4gIH1cblxuICBwdWJsaWMgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLlJVTk5JTkc7XG4gIH1cblxuICBwdWJsaWMgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICB9XG5cbiAgcHVibGljIGlzU3RvcHBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRpbnVlT25SZWplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGludWVPblJlamVjdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250aW51ZU9uUmVqZWN0KGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0U3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIHdhcyBzdGFydGVkIG9yIGhhcyBiZWVuIHByb2Nlc3MnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuXG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzICE9PSBudWxsICYmIHRoaXMucHJvY2Vzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IHByb2Nlc3Mgb2YgdGhpcy5wcm9jZXNzZXMpIHtcbiAgICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFBhdXNlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0UGF1c2VFdmVudChwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucGF1c2VFdmVudCA9IHBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdW1lRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3VtZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFJlc3VtZUV2ZW50KHJlc3VtZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucmVzdW1lRXZlbnQgPSByZXN1bWVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGFydEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0RXZlbnQoc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFN0b3BFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0b3BFdmVudChzdG9wRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBzdG9wRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvY2Vzc0NvbXBsZXRlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NDb21wbGV0ZUV2ZW50KHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzc0NvbXBsZXRlRXZlbnQgPSBwcm9jZXNzQ29tcGxldGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9jZXNzUmVzb2x2ZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZXNvbHZlRXZlbnQocHJvY2Vzc1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBwcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFByb2Nlc3NSZWplY3RFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlamVjdEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZWplY3RFdmVudChwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBwcm9jZXNzUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1N0YXJ0RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tTdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFRhc2tTdGFydEV2ZW50KHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1N0YXJ0RXZlbnQgPSB0YXNrU3RhcnRFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrQ29tcGxldGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudGFza0NvbXBsZXRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza0NvbXBsZXRlRXZlbnQodGFza0NvbXBsZXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy50YXNrQ29tcGxldGVFdmVudCA9IHRhc2tDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFRhc2tSZXNvbHZlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1Jlc29sdmVFdmVudCh0YXNrUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IHRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1JlamVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy50YXNrUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1JlamVjdEV2ZW50KHRhc2tSZWplY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IHRhc2tSZWplY3RFdmVudDtcbiAgfVxufVxuIl19