UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

541 lines (540 loc) 36.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractHasDataHelp } from './AbstractHasDataHelp'; import { Option } from '../decorator/Option.decorator'; import { EventUtils } from '../share/utils/EventUtils'; import { BEFORE_RESULT_CHANGE_EVENT, BEFORE_ERROR_CHANGE_EVENT, BEFORE_BUTTONS_CHANGE_EVENT, RESULT_CHANGE_EVENT, ERROR_CHANGE_EVENT, BUTTONS_CHANGE_EVENT } from '../share/CustomEventType'; /** * <p style="text-indent: 2em;"> * An abstract base class of [[IDialogController]] interface. All dialog component classes, including <code>custom component</code> * classes used in [[ComponentDialog]], should extend this class. Hence, if you want to build a <code>custom dialog</code>, you should * use this class as a base class for the custom <code>component type</code> being used as [[ComponentDialog]]'s body component. * </p> * * @author shiorin, tee4cute * @see [[PhloxDialog]] * @abstract */ var AbstractDialogController = /** @class */ (function (_super) { tslib_1.__extends(AbstractDialogController, _super); function AbstractDialogController(elementRef) { var _this = _super.call(this, elementRef) || this; _this.beforeResultChangeEvent = new EventEmitter(); _this.resultChangeEvent = new EventEmitter(); _this.beforeErrorChangeEvent = new EventEmitter(); _this.errorChangeEvent = new EventEmitter(); _this.beforeButtonsChangeEvent = new EventEmitter(); _this.buttonsChangeEvent = new EventEmitter(); return _this; } /** * @return {?} */ AbstractDialogController.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitBeforeResultChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_RESULT_CHANGE_EVENT, this, data, null); if (this.beforeResultChangeEvent !== null && this.beforeResultChangeEvent !== undefined) { this.beforeResultChangeEvent.emit(ev); } }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitResultChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(RESULT_CHANGE_EVENT, this, data, null); if (this.resultChangeEvent !== null && this.resultChangeEvent !== undefined) { this.resultChangeEvent.emit(ev); } }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitBeforeErrorChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_ERROR_CHANGE_EVENT, this, data, null); if (this.beforeErrorChangeEvent !== null && this.beforeErrorChangeEvent !== undefined) { this.beforeErrorChangeEvent.emit(ev); } }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitErrorChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(ERROR_CHANGE_EVENT, this, data, null); if (this.errorChangeEvent !== null && this.errorChangeEvent !== undefined) { this.errorChangeEvent.emit(ev); } }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitBeforeButtonsChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_BUTTONS_CHANGE_EVENT, this, data, null); if (this.beforeButtonsChangeEvent !== null && this.beforeButtonsChangeEvent !== undefined) { this.beforeButtonsChangeEvent.emit(ev); } }; /** * @param {?} oldValue * @param {?} newValue * @return {?} */ AbstractDialogController.prototype.emitButtonsChangeEvent = /** * @param {?} oldValue * @param {?} newValue * @return {?} */ function (oldValue, newValue) { var /** @type {?} */ data = { oldValue: oldValue, newValue: newValue }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BUTTONS_CHANGE_EVENT, this, data, null); if (this.buttonsChangeEvent !== null && this.buttonsChangeEvent !== undefined) { this.buttonsChangeEvent.emit(ev); } }; Object.defineProperty(AbstractDialogController.prototype, "result", { get: /** * @return {?} */ function () { return this._result; }, set: /** * @param {?} result * @return {?} */ function (result) { var _this = this; if (this._result === result) { return; } var /** @type {?} */ oldValue = this._result; EventUtils.handleBrowserEvent(this, 'beforeResultChangeEvent', undefined, true, function ($event) { // doEvent // doEvent _this._result = result; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeResultChangeEvent(oldValue, result); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitResultChangeEvent(oldValue, result); }, function ($event) { // doPrevented }); }, enumerable: true, configurable: true }); Object.defineProperty(AbstractDialogController.prototype, "error", { get: /** * @return {?} */ function () { return this._error; }, set: /** * @param {?} error * @return {?} */ function (error) { var _this = this; if (this._error === error) { return; } var /** @type {?} */ oldValue = this._error; EventUtils.handleBrowserEvent(this, 'beforeErrorChangeEvent', undefined, true, function ($event) { // doEvent // doEvent _this._error = error; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeErrorChangeEvent(oldValue, error); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitErrorChangeEvent(oldValue, error); }, function ($event) { // doPrevented }); }, enumerable: true, configurable: true }); Object.defineProperty(AbstractDialogController.prototype, "dialogButtons", { get: /** * @return {?} */ function () { return this._buttons; }, set: /** * @param {?} buttons * @return {?} */ function (buttons) { var _this = this; if (this._buttons === buttons) { return; } var /** @type {?} */ oldValue = this._buttons; EventUtils.handleBrowserEvent(this, 'beforeButtonsChangeEvent', undefined, true, function ($event) { // doEvent // doEvent _this._buttons = buttons; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeButtonsChangeEvent(oldValue, buttons); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitButtonsChangeEvent(oldValue, buttons); }, function ($event) { // doPrevented }); }, enumerable: true, configurable: true }); /** * @return {?} */ AbstractDialogController.prototype.getDialogResult = /** * @return {?} */ function () { return this.result; }; /** * @param {?} result * @return {?} */ AbstractDialogController.prototype.setDialogResult = /** * @param {?} result * @return {?} */ function (result) { this.result = result; }; /** * @return {?} */ AbstractDialogController.prototype.getDialogError = /** * @return {?} */ function () { return this.error; }; /** * @param {?} error * @return {?} */ AbstractDialogController.prototype.setDialogError = /** * @param {?} error * @return {?} */ function (error) { this.error = error; }; /** * @return {?} */ AbstractDialogController.prototype.getDialogButtons = /** * @return {?} */ function () { return this.dialogButtons; }; /** * @param {?} dialogButtons * @return {?} */ AbstractDialogController.prototype.setDialogButtons = /** * @param {?} dialogButtons * @return {?} */ function (dialogButtons) { this.dialogButtons = dialogButtons; }; /** * @return {?} */ AbstractDialogController.prototype.getBeforeResultChangeEvent = /** * @return {?} */ function () { return this.beforeResultChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setBeforeResultChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeResultChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.getResultChangeEvent = /** * @return {?} */ function () { return this.resultChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setResultChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.resultChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.getBeforeErrorChangeEvent = /** * @return {?} */ function () { return this.beforeErrorChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setBeforeErrorChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeErrorChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.getErrorChangeEvent = /** * @return {?} */ function () { return this.errorChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setErrorChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.errorChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.getBeforeButtonsChangeEvent = /** * @return {?} */ function () { return this.beforeButtonsChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setBeforeButtonsChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeButtonsChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.getButtonsChangeEvent = /** * @return {?} */ function () { return this.buttonsChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDialogController.prototype.setButtonsChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.buttonsChangeEvent = event; }; /** * @return {?} */ AbstractDialogController.prototype.doPreload = /** * @return {?} */ function () { return new Promise(function (resolve, reject) { resolve(null); }); }; /** * @return {?} */ AbstractDialogController.prototype.doLoaded = /** * @return {?} */ function () { }; /** * @return {?} */ AbstractDialogController.prototype.isSelfDataDirty = /** * @return {?} */ function () { return false; }; /** * @param {?} data * @return {?} */ AbstractDialogController.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { }; /** * @return {?} */ AbstractDialogController.prototype.selfResetData = /** * @return {?} */ function () { }; tslib_1.__decorate([ Option('beforeResultChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "beforeResultChangeEvent", void 0); tslib_1.__decorate([ Option('resultChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "resultChangeEvent", void 0); tslib_1.__decorate([ Option('beforeErrorChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "beforeErrorChangeEvent", void 0); tslib_1.__decorate([ Option('errorChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "errorChangeEvent", void 0); tslib_1.__decorate([ Option('beforeButtonsChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "beforeButtonsChangeEvent", void 0); tslib_1.__decorate([ Option('buttonsChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDialogController.prototype, "buttonsChangeEvent", void 0); return AbstractDialogController; }(AbstractHasDataHelp)); export { AbstractDialogController }; function AbstractDialogController_tsickle_Closure_declarations() { /** @type {?} */ AbstractDialogController.prototype._result; /** @type {?} */ AbstractDialogController.prototype._error; /** @type {?} */ AbstractDialogController.prototype._buttons; /** @type {?} */ AbstractDialogController.prototype.beforeResultChangeEvent; /** @type {?} */ AbstractDialogController.prototype.resultChangeEvent; /** @type {?} */ AbstractDialogController.prototype.beforeErrorChangeEvent; /** @type {?} */ AbstractDialogController.prototype.errorChangeEvent; /** @type {?} */ AbstractDialogController.prototype.beforeButtonsChangeEvent; /** @type {?} */ AbstractDialogController.prototype.buttonsChangeEvent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REaWFsb2dDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0Fic3RyYWN0RGlhbG9nQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBVSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFJakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsMkJBQTJCLEVBQ2xGLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUM5RCxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7O0lBWXFCLG9EQUFtQjtJQW1CeEUsa0NBQVksVUFBc0I7UUFBbEMsWUFDRSxrQkFBTSxVQUFVLENBQUMsU0FRbEI7UUFOQyxLQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRCxLQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QyxLQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqRCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuRCxLQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7S0FDOUM7Ozs7SUFFTSwyQ0FBUTs7OztRQUNiLGlCQUFNLFFBQVEsV0FBRSxDQUFDOzs7Ozs7O0lBR1QsOERBQTJCOzs7OztJQUFyQyxVQUFzQyxRQUFhLEVB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QUFZOzs7UUFDeEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDOzBDQUNNLFlBQVk7OztRQUM3QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUN2QyxNQUFNLENBQUMscUJBQXFCLENBQUM7MENBQ00sWUFBWTs7O1FBQy9DLE1BQU0sQ0FBQyxlQUFlLENBQUM7MENBQ00sWUFBWTs7bUNBdkM1QztFQXNCdUQsbUJBQW1CO1NBQXBELHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJRGlhbG9nQ29udHJvbGxlciB9IGZyb20gJy4vSURpYWxvZ0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRGlhbG9nTW9kZWwgfSBmcm9tICcuL21vZGVsL0RpYWxvZ01vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudERpYWxvZ01vZGVsLCBCdXR0b25Nb2RlbCB9IGZyb20gJy4vbW9kZWwvQ29tcG9uZW50RGlhbG9nTW9kZWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RIYXNEYXRhSGVscCB9IGZyb20gJy4vQWJzdHJhY3RIYXNEYXRhSGVscCc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQge1xuICBCRUZPUkVfUkVTVUxUX0NIQU5HRV9FVkVOVCwgQkVGT1JFX0VSUk9SX0NIQU5HRV9FVkVOVCwgQkVGT1JFX0JVVFRPTlNfQ0hBTkdFX0VWRU5ULFxuICBSRVNVTFRfQ0hBTkdFX0VWRU5ULCBFUlJPUl9DSEFOR0VfRVZFTlQsIEJVVFRPTlNfQ0hBTkdFX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBbW0lEaWFsb2dDb250cm9sbGVyXV0gaW50ZXJmYWNlLiBBbGwgZGlhbG9nIGNvbXBvbmVudCBjbGFzc2VzLCBpbmNsdWRpbmcgPGNvZGU+Y3VzdG9tIGNvbXBvbmVudDwvY29kZT5cbiAqIGNsYXNzZXMgdXNlZCBpbiBbW0NvbXBvbmVudERpYWxvZ11dLCBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MuIEhlbmNlLCBpZiB5b3Ugd2FudCB0byBidWlsZCBhIDxjb2RlPmN1c3RvbSBkaWFsb2c8L2NvZGU+LCB5b3Ugc2hvdWxkXG4gKiB1c2UgdGhpcyBjbGFzcyBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBjdXN0b20gPGNvZGU+Y29tcG9uZW50IHR5cGU8L2NvZGU+IGJlaW5nIHVzZWQgYXMgW1tDb21wb25lbnREaWFsb2ddXSdzIGJvZHkgY29tcG9uZW50LlxuICogPC9wPlxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqIEBzZWUgW1tQaGxveERpYWxvZ11dXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWxvZ0NvbnRyb2xsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhc0RhdGFIZWxwIGltcGxlbWVudHMgT25Jbml0LCBJRGlhbG9nQ29udHJvbGxlciB7XG5cbiAgcHJpdmF0ZSBfcmVzdWx0OiBhbnk7XG4gIHByaXZhdGUgX2Vycm9yOiBhbnk7XG4gIHByaXZhdGUgX2J1dHRvbnM6IEJ1dHRvbk1vZGVsW107XG5cbiAgQE9wdGlvbignYmVmb3JlUmVzdWx0Q2hhbmdlJylcbiAgcHJvdGVjdGVkIGJlZm9yZVJlc3VsdENoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbigncmVzdWx0Q2hhbmdlJylcbiAgcHJvdGVjdGVkIHJlc3VsdENoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlRXJyb3JDaGFuZ2UnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRXJyb3JDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2Vycm9yQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGVycm9yQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVCdXR0b25zQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2J1dHRvbnNDaGFuZ2UnKVxuICBwcm90ZWN0ZWQgYnV0dG9uc0NoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG5cbiAgICB0aGlzLmJlZm9yZVJlc3VsdENoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMucmVzdWx0Q2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVFcnJvckNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZXJyb3JDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgfVxuICBcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZVJlc3VsdENoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1JFU1VMVF9DSEFOR0VfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVSZXN1bHRDaGFuZ2VFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJlZm9yZVJlc3VsdENoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0UmVzdWx0Q2hhbmdlRXZlbnQob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChSRVNVTFRfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLnJlc3VsdENoYW5nZUV2ZW50ICE9PSBudWxsICYmIHRoaXMucmVzdWx0Q2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXN1bHRDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUVycm9yQ2hhbmdlRXZlbnQob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfRVJST1JfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUVycm9yQ2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVFcnJvckNoYW5nZUV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYmVmb3JlRXJyb3JDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEVycm9yQ2hhbmdlRXZlbnQob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChFUlJPUl9DSEFOR0VfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgaWYgKHRoaXMuZXJyb3JDaGFuZ2VFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmVycm9yQ2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lcnJvckNoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQnV0dG9uc0NoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0JVVFRPTlNfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJ1dHRvbnNDaGFuZ2VFdmVudChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH07XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJVVFRPTlNfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHJlc3VsdCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IHJlc3VsdChyZXN1bHQ6IGFueSkge1xuICAgIGlmICh0aGlzLl9yZXN1bHQgPT09IHJlc3VsdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvbGRWYWx1ZSA9IHRoaXMuX3Jlc3VsdDtcblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVSZXN1bHRDaGFuZ2VFdmVudCcsIHVuZGVmaW5lZCwgdHJ1ZSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IHJlc3VsdDtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICB0aGlzLmVtaXRCZWZvcmVSZXN1bHRDaGFuZ2VFdmVudChvbGRWYWx1ZSwgcmVzdWx0KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdFJlc3VsdENoYW5nZUV2ZW50KG9sZFZhbHVlLCByZXN1bHQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBlcnJvcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgZXJyb3IoZXJyb3I6IGFueSkge1xuICAgIGlmICh0aGlzLl9lcnJvciA9PT0gZXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgb2xkVmFsdWUgPSB0aGlzLl9lcnJvcjtcblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVFcnJvckNoYW5nZUV2ZW50JywgdW5kZWZpbmVkLCB0cnVlLCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICB0aGlzLmVtaXRCZWZvcmVFcnJvckNoYW5nZUV2ZW50KG9sZFZhbHVlLCBlcnJvcik7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRFcnJvckNoYW5nZUV2ZW50KG9sZFZhbHVlLCBlcnJvcik7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGRpYWxvZ0J1dHRvbnMoKTogQnV0dG9uTW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IGRpYWxvZ0J1dHRvbnMoYnV0dG9uczogQnV0dG9uTW9kZWxbXSkge1xuICAgIGlmICh0aGlzLl9idXR0b25zID09PSBidXR0b25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG9sZFZhbHVlID0gdGhpcy5fYnV0dG9ucztcblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQnLCB1bmRlZmluZWQsIHRydWUsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLl9idXR0b25zID0gYnV0dG9ucztcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICB0aGlzLmVtaXRCZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQob2xkVmFsdWUsIGJ1dHRvbnMpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0QnV0dG9uc0NoYW5nZUV2ZW50KG9sZFZhbHVlLCBidXR0b25zKTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9QcmV2ZW50ZWRcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREaWFsb2dSZXN1bHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0RGlhbG9nUmVzdWx0KHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGlhbG9nRXJyb3IoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaWFsb2dFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICB9XG5cbiAgcHVibGljIGdldERpYWxvZ0J1dHRvbnMoKTogQnV0dG9uTW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nQnV0dG9ucztcbiAgfVxuXG4gIHB1YmxpYyBzZXREaWFsb2dCdXR0b25zKGRpYWxvZ0J1dHRvbnM6IEJ1dHRvbk1vZGVsW10pOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ0J1dHRvbnMgPSBkaWFsb2dCdXR0b25zO1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZVJlc3VsdENoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVSZXN1bHRDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVSZXN1bHRDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZVJlc3VsdENoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdWx0Q2hhbmdlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENoYW5nZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFJlc3VsdENoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0Q2hhbmdlRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCZWZvcmVFcnJvckNoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVFcnJvckNoYW5nZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJlZm9yZUVycm9yQ2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5iZWZvcmVFcnJvckNoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFcnJvckNoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuZXJyb3JDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlQnV0dG9uc0NoYW5nZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJ1dHRvbnNDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uc0NoYW5nZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJ1dHRvbnNDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGRvUHJlbG9hZCgpOiBQcm9taXNlPGFueT4geyByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyByZXNvbHZlKG51bGwpOyB9KTsgfSBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XG4gIH1cblxuICAvLyBEZWZhdWx0IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnNcbiAgcHVibGljIGlzU2VsZkRhdGFEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIHNlbGZSZXNldERhdGEoKTogdm9pZCB7XG4gIH1cbn1cbiJdfQ==