com.phloxui
Version:
PhloxUI Ng2+ Framework
404 lines (403 loc) • 31.6 kB
JavaScript
/**
* @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
*/
export class AbstractDialogController extends AbstractHasDataHelp {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
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 {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
emitBeforeResultChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @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 {?}
*/
emitResultChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @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 {?}
*/
emitBeforeErrorChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @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 {?}
*/
emitErrorChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @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 {?}
*/
emitBeforeButtonsChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @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 {?}
*/
emitButtonsChangeEvent(oldValue, newValue) {
let /** @type {?} */ data = {
oldValue: oldValue,
newValue: newValue
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BUTTONS_CHANGE_EVENT, this, data, null);
if (this.buttonsChangeEvent !== null && this.buttonsChangeEvent !== undefined) {
this.buttonsChangeEvent.emit(ev);
}
}
/**
* @return {?}
*/
get result() {
return this._result;
}
/**
* @param {?} result
* @return {?}
*/
set result(result) {
if (this._result === result) {
return;
}
let /** @type {?} */ oldValue = this._result;
EventUtils.handleBrowserEvent(this, 'beforeResultChangeEvent', undefined, true, ($event) => {
// doEvent
this._result = result;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeResultChangeEvent(oldValue, result);
}, ($event) => {
// emitAfterEvent
this.emitResultChangeEvent(oldValue, result);
}, ($event) => {
// doPrevented
});
}
/**
* @return {?}
*/
get error() {
return this._error;
}
/**
* @param {?} error
* @return {?}
*/
set error(error) {
if (this._error === error) {
return;
}
let /** @type {?} */ oldValue = this._error;
EventUtils.handleBrowserEvent(this, 'beforeErrorChangeEvent', undefined, true, ($event) => {
// doEvent
this._error = error;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeErrorChangeEvent(oldValue, error);
}, ($event) => {
// emitAfterEvent
this.emitErrorChangeEvent(oldValue, error);
}, ($event) => {
// doPrevented
});
}
/**
* @return {?}
*/
get dialogButtons() {
return this._buttons;
}
/**
* @param {?} buttons
* @return {?}
*/
set dialogButtons(buttons) {
if (this._buttons === buttons) {
return;
}
let /** @type {?} */ oldValue = this._buttons;
EventUtils.handleBrowserEvent(this, 'beforeButtonsChangeEvent', undefined, true, ($event) => {
// doEvent
this._buttons = buttons;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeButtonsChangeEvent(oldValue, buttons);
}, ($event) => {
// emitAfterEvent
this.emitButtonsChangeEvent(oldValue, buttons);
}, ($event) => {
// doPrevented
});
}
/**
* @return {?}
*/
getDialogResult() {
return this.result;
}
/**
* @param {?} result
* @return {?}
*/
setDialogResult(result) {
this.result = result;
}
/**
* @return {?}
*/
getDialogError() {
return this.error;
}
/**
* @param {?} error
* @return {?}
*/
setDialogError(error) {
this.error = error;
}
/**
* @return {?}
*/
getDialogButtons() {
return this.dialogButtons;
}
/**
* @param {?} dialogButtons
* @return {?}
*/
setDialogButtons(dialogButtons) {
this.dialogButtons = dialogButtons;
}
/**
* @return {?}
*/
getBeforeResultChangeEvent() {
return this.beforeResultChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeResultChangeEvent(event) {
this.beforeResultChangeEvent = event;
}
/**
* @return {?}
*/
getResultChangeEvent() {
return this.resultChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setResultChangeEvent(event) {
this.resultChangeEvent = event;
}
/**
* @return {?}
*/
getBeforeErrorChangeEvent() {
return this.beforeErrorChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeErrorChangeEvent(event) {
this.beforeErrorChangeEvent = event;
}
/**
* @return {?}
*/
getErrorChangeEvent() {
return this.errorChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setErrorChangeEvent(event) {
this.errorChangeEvent = event;
}
/**
* @return {?}
*/
getBeforeButtonsChangeEvent() {
return this.beforeButtonsChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeButtonsChangeEvent(event) {
this.beforeButtonsChangeEvent = event;
}
/**
* @return {?}
*/
getButtonsChangeEvent() {
return this.buttonsChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setButtonsChangeEvent(event) {
this.buttonsChangeEvent = event;
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @return {?}
*/
isSelfDataDirty() {
return false;
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
}
/**
* @return {?}
*/
selfResetData() {
}
}
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);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REaWFsb2dDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0Fic3RyYWN0RGlhbG9nQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBVSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFJakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsMkJBQTJCLEVBQ2xGLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUM5RCxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7QUFZbEMsTUFBTSwrQkFBeUMsU0FBUSxtQkFBbUI7Ozs7SUFtQnhFLFlBQVksVUFBc0I7UUFDaEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBQzlDOzs7O0lBRU0sUUFBUTtRQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Ozs7OztJQUdULDJCQUEyQixDQUFDLFFB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dFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSURpYWxvZ0NvbnRyb2xsZXIgfSBmcm9tICcuL0lEaWFsb2dDb250cm9sbGVyJztcbmltcG9ydCB7IERpYWxvZ01vZGVsIH0gZnJvbSAnLi9tb2RlbC9EaWFsb2dNb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnREaWFsb2dNb2RlbCwgQnV0dG9uTW9kZWwgfSBmcm9tICcuL21vZGVsL0NvbXBvbmVudERpYWxvZ01vZGVsJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRGF0YUhlbHAgfSBmcm9tICcuL0Fic3RyYWN0SGFzRGF0YUhlbHAnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHtcbiAgQkVGT1JFX1JFU1VMVF9DSEFOR0VfRVZFTlQsIEJFRk9SRV9FUlJPUl9DSEFOR0VfRVZFTlQsIEJFRk9SRV9CVVRUT05TX0NIQU5HRV9FVkVOVCxcbiAgUkVTVUxUX0NIQU5HRV9FVkVOVCwgRVJST1JfQ0hBTkdFX0VWRU5ULCBCVVRUT05TX0NIQU5HRV9FVkVOVFxufSBmcm9tICcuLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuXG4vKipcbiAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDJlbTtcIj5cbiAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgW1tJRGlhbG9nQ29udHJvbGxlcl1dIGludGVyZmFjZS4gQWxsIGRpYWxvZyBjb21wb25lbnQgY2xhc3NlcywgaW5jbHVkaW5nIDxjb2RlPmN1c3RvbSBjb21wb25lbnQ8L2NvZGU+XG4gKiBjbGFzc2VzIHVzZWQgaW4gW1tDb21wb25lbnREaWFsb2ddXSwgc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzLiBIZW5jZSwgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSA8Y29kZT5jdXN0b20gZGlhbG9nPC9jb2RlPiwgeW91IHNob3VsZFxuICogdXNlIHRoaXMgY2xhc3MgYXMgYSBiYXNlIGNsYXNzIGZvciB0aGUgY3VzdG9tIDxjb2RlPmNvbXBvbmVudCB0eXBlPC9jb2RlPiBiZWluZyB1c2VkIGFzIFtbQ29tcG9uZW50RGlhbG9nXV0ncyBib2R5IGNvbXBvbmVudC5cbiAqIDwvcD5cbiAqXG4gKiBAYXV0aG9yIHNoaW9yaW4sIHRlZTRjdXRlXG4gKiBAc2VlIFtbUGhsb3hEaWFsb2ddXVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFsb2dDb250cm9sbGVyIGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhSGVscCBpbXBsZW1lbnRzIE9uSW5pdCwgSURpYWxvZ0NvbnRyb2xsZXIge1xuXG4gIHByaXZhdGUgX3Jlc3VsdDogYW55O1xuICBwcml2YXRlIF9lcnJvcjogYW55O1xuICBwcml2YXRlIF9idXR0b25zOiBCdXR0b25Nb2RlbFtdO1xuXG4gIEBPcHRpb24oJ2JlZm9yZVJlc3VsdENoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVSZXN1bHRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ3Jlc3VsdENoYW5nZScpXG4gIHByb3RlY3RlZCByZXN1bHRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUVycm9yQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUVycm9yQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdlcnJvckNoYW5nZScpXG4gIHByb3RlY3RlZCBlcnJvckNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlQnV0dG9uc0NoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdidXR0b25zQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGJ1dHRvbnNDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xuXG4gICAgdGhpcy5iZWZvcmVSZXN1bHRDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnJlc3VsdENoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlRXJyb3JDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVycm9yQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5idXR0b25zQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cbiAgXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVSZXN1bHRDaGFuZ2VFdmVudChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH07XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9SRVNVTFRfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLmJlZm9yZVJlc3VsdENoYW5nZUV2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVSZXN1bHRDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdFJlc3VsdENoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoUkVTVUxUX0NIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5yZXN1bHRDaGFuZ2VFdmVudCAhPT0gbnVsbCAmJiB0aGlzLnJlc3VsdENoYW5nZUV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVzdWx0Q2hhbmdlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVFcnJvckNoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0VSUk9SX0NIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5iZWZvcmVFcnJvckNoYW5nZUV2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlRXJyb3JDaGFuZ2VFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJlZm9yZUVycm9yQ2hhbmdlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRFcnJvckNoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoRVJST1JfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgIGlmICh0aGlzLmVycm9yQ2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5lcnJvckNoYW5nZUV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXJyb3JDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH07XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9CVVRUT05TX0NIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5iZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCdXR0b25zQ2hhbmdlRXZlbnQob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCVVRUT05TX0NIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5idXR0b25zQ2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5idXR0b25zQ2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5idXR0b25zQ2hhbmdlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByZXN1bHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldCByZXN1bHQocmVzdWx0OiBhbnkpIHtcbiAgICBpZiAodGhpcy5fcmVzdWx0ID09PSByZXN1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgb2xkVmFsdWUgPSB0aGlzLl9yZXN1bHQ7XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQnLCB1bmRlZmluZWQsIHRydWUsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLl9yZXN1bHQgPSByZXN1bHQ7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQob2xkVmFsdWUsIHJlc3VsdCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRSZXN1bHRDaGFuZ2VFdmVudChvbGRWYWx1ZSwgcmVzdWx0KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9QcmV2ZW50ZWRcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZXJyb3IoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IGVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBpZiAodGhpcy5fZXJyb3IgPT09IGVycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG9sZFZhbHVlID0gdGhpcy5fZXJyb3I7XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlRXJyb3JDaGFuZ2VFdmVudCcsIHVuZGVmaW5lZCwgdHJ1ZSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIHRoaXMuX2Vycm9yID0gZXJyb3I7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlRXJyb3JDaGFuZ2VFdmVudChvbGRWYWx1ZSwgZXJyb3IpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0RXJyb3JDaGFuZ2VFdmVudChvbGRWYWx1ZSwgZXJyb3IpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBkaWFsb2dCdXR0b25zKCk6IEJ1dHRvbk1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLl9idXR0b25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldCBkaWFsb2dCdXR0b25zKGJ1dHRvbnM6IEJ1dHRvbk1vZGVsW10pIHtcbiAgICBpZiAodGhpcy5fYnV0dG9ucyA9PT0gYnV0dG9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvbGRWYWx1ZSA9IHRoaXMuX2J1dHRvbnM7XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlQnV0dG9uc0NoYW5nZUV2ZW50JywgdW5kZWZpbmVkLCB0cnVlLCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5fYnV0dG9ucyA9IGJ1dHRvbnM7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlQnV0dG9uc0NoYW5nZUV2ZW50KG9sZFZhbHVlLCBidXR0b25zKTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJ1dHRvbnNDaGFuZ2VFdmVudChvbGRWYWx1ZSwgYnV0dG9ucyk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGlhbG9nUmVzdWx0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHNldERpYWxvZ1Jlc3VsdChyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldERpYWxvZ0Vycm9yKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc2V0RGlhbG9nRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXREaWFsb2dCdXR0b25zKCk6IEJ1dHRvbk1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZ0J1dHRvbnM7XG4gIH1cblxuICBwdWJsaWMgc2V0RGlhbG9nQnV0dG9ucyhkaWFsb2dCdXR0b25zOiBCdXR0b25Nb2RlbFtdKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dCdXR0b25zID0gZGlhbG9nQnV0dG9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXRCZWZvcmVSZXN1bHRDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlUmVzdWx0Q2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5iZWZvcmVSZXN1bHRDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdENoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRSZXN1bHRDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdENoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlRXJyb3JDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlRXJyb3JDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVFcnJvckNoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlRXJyb3JDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEVycm9yQ2hhbmdlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmVycm9yQ2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0RXJyb3JDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yQ2hhbmdlRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUJ1dHRvbnNDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5iZWZvcmVCdXR0b25zQ2hhbmdlRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCdXR0b25zQ2hhbmdlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbnNDaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCdXR0b25zQ2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5idXR0b25zQ2hhbmdlRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgcmVzb2x2ZShudWxsKTsgfSk7IH0gcHVibGljIGRvTG9hZGVkKCk6IHZvaWQge1xuICB9XG5cbiAgLy8gRGVmYXVsdCBtZXRob2QgaW1wbGVtZW50YXRpb25zXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xuICB9XG59XG4iXX0=