UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

514 lines 29.5 kB
/** * @fileoverview added by tsickle * Generated from: base.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __assign, __read, __spread } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ComponentPortal } from '@angular/cdk/portal'; import { EventEmitter } from '@angular/core'; import { Subject } from 'rxjs'; /** @type {?} */ var globalCounter = 0; /** * @abstract */ var /** * @abstract */ NzMNService = /** @class */ (function () { function NzMNService(nzSingletonService, overlay, injector) { this.nzSingletonService = nzSingletonService; this.overlay = overlay; this.injector = injector; } /** * @param {?=} id * @return {?} */ NzMNService.prototype.remove = /** * @param {?=} id * @return {?} */ function (id) { if (id) { this.container.remove(id); } else { this.container.removeAll(); } }; /** * @protected * @return {?} */ NzMNService.prototype.getInstanceId = /** * @protected * @return {?} */ function () { return this.componentPrefix + "-" + globalCounter++; }; /** * @protected * @template T * @param {?} ctor * @return {?} */ NzMNService.prototype.withContainer = /** * @protected * @template T * @param {?} ctor * @return {?} */ function (ctor) { /** @type {?} */ var containerInstance = this.nzSingletonService.getSingletonWithKey(this.componentPrefix); if (containerInstance) { return (/** @type {?} */ (containerInstance)); } /** @type {?} */ var overlayRef = this.overlay.create({ hasBackdrop: false, scrollStrategy: this.overlay.scrollStrategies.noop(), positionStrategy: this.overlay.position().global() }); /** @type {?} */ var componentPortal = new ComponentPortal(ctor, null, this.injector); /** @type {?} */ var componentRef = overlayRef.attach(componentPortal); /** @type {?} */ var overlayPane = overlayRef.overlayElement; overlayPane.style.zIndex = '1010'; if (!containerInstance) { this.container = containerInstance = componentRef.instance; this.nzSingletonService.registerSingletonWithKey(this.componentPrefix, containerInstance); } return (/** @type {?} */ (containerInstance)); }; return NzMNService; }()); /** * @abstract */ export { NzMNService }; if (false) { /** * @type {?} * @protected */ NzMNService.prototype.componentPrefix; /** * @type {?} * @protected */ NzMNService.prototype.container; /** * @type {?} * @protected */ NzMNService.prototype.nzSingletonService; /** * @type {?} * @protected */ NzMNService.prototype.overlay; /** * @type {?} * @private */ NzMNService.prototype.injector; } /** * @abstract */ var /** * @abstract */ NzMNContainerComponent = /** @class */ (function () { function NzMNContainerComponent(cdr, nzConfigService) { this.cdr = cdr; this.nzConfigService = nzConfigService; this.instances = []; this.destroy$ = new Subject(); this.updateConfig(); } /** * @return {?} */ NzMNContainerComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.subscribeConfigChange(); }; /** * @return {?} */ NzMNContainerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); }; /** * @param {?} data * @return {?} */ NzMNContainerComponent.prototype.create = /** * @param {?} data * @return {?} */ function (data) { /** @type {?} */ var instance = this.onCreate(data); if (this.instances.length >= this.config.nzMaxStack) { this.instances = this.instances.slice(1); } this.instances = __spread(this.instances, [instance]); this.readyInstances(); return instance; }; /** * @param {?} id * @param {?=} userAction * @return {?} */ NzMNContainerComponent.prototype.remove = /** * @param {?} id * @param {?=} userAction * @return {?} */ function (id, userAction) { var _this = this; if (userAction === void 0) { userAction = false; } this.instances.some((/** * @param {?} instance * @param {?} index * @return {?} */ function (instance, index) { if (instance.messageId === id) { _this.instances.splice(index, 1); _this.instances = __spread(_this.instances); _this.onRemove(instance, userAction); _this.readyInstances(); return true; } return false; })); }; /** * @return {?} */ NzMNContainerComponent.prototype.removeAll = /** * @return {?} */ function () { var _this = this; this.instances.forEach((/** * @param {?} i * @return {?} */ function (i) { return _this.onRemove(i, false); })); this.instances = []; this.readyInstances(); }; /** * @protected * @param {?} instance * @return {?} */ NzMNContainerComponent.prototype.onCreate = /** * @protected * @param {?} instance * @return {?} */ function (instance) { instance.options = this.mergeOptions(instance.options); instance.onClose = new Subject(); return (/** @type {?} */ (instance)); }; /** * @protected * @param {?} instance * @param {?} userAction * @return {?} */ NzMNContainerComponent.prototype.onRemove = /** * @protected * @param {?} instance * @param {?} userAction * @return {?} */ function (instance, userAction) { instance.onClose.next(userAction); instance.onClose.complete(); }; /** * @protected * @return {?} */ NzMNContainerComponent.prototype.readyInstances = /** * @protected * @return {?} */ function () { this.cdr.detectChanges(); }; /** * @protected * @param {?=} options * @return {?} */ NzMNContainerComponent.prototype.mergeOptions = /** * @protected * @param {?=} options * @return {?} */ function (options) { var _a = this.config, nzDuration = _a.nzDuration, nzAnimate = _a.nzAnimate, nzPauseOnHover = _a.nzPauseOnHover; return __assign({ nzDuration: nzDuration, nzAnimate: nzAnimate, nzPauseOnHover: nzPauseOnHover }, options); }; return NzMNContainerComponent; }()); /** * @abstract */ export { NzMNContainerComponent }; if (false) { /** @type {?} */ NzMNContainerComponent.prototype.config; /** @type {?} */ NzMNContainerComponent.prototype.instances; /** * @type {?} * @protected */ NzMNContainerComponent.prototype.destroy$; /** * @type {?} * @protected */ NzMNContainerComponent.prototype.cdr; /** * @type {?} * @protected */ NzMNContainerComponent.prototype.nzConfigService; /** * @abstract * @protected * @return {?} */ NzMNContainerComponent.prototype.updateConfig = function () { }; /** * @abstract * @protected * @return {?} */ NzMNContainerComponent.prototype.subscribeConfigChange = function () { }; } /** * @abstract */ var /** * @abstract */ NzMNComponent = /** @class */ (function () { function NzMNComponent(cdr) { this.cdr = cdr; this.destroyed = new EventEmitter(); this.eraseTimer = null; } /** * @return {?} */ NzMNComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.options = (/** @type {?} */ (this.instance.options)); if (this.options.nzAnimate) { this.instance.state = 'enter'; } this.autoClose = this.options.nzDuration > 0; if (this.autoClose) { this.initErase(); this.startEraseTimeout(); } }; /** * @return {?} */ NzMNComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.autoClose) { this.clearEraseTimeout(); } }; /** * @return {?} */ NzMNComponent.prototype.onEnter = /** * @return {?} */ function () { if (this.autoClose && this.options.nzPauseOnHover) { this.clearEraseTimeout(); this.updateTTL(); } }; /** * @return {?} */ NzMNComponent.prototype.onLeave = /** * @return {?} */ function () { if (this.autoClose && this.options.nzPauseOnHover) { this.startEraseTimeout(); } }; /** * @protected * @param {?=} userAction * @return {?} */ NzMNComponent.prototype.destroy = /** * @protected * @param {?=} userAction * @return {?} */ function (userAction) { var _this = this; if (userAction === void 0) { userAction = false; } if (this.options.nzAnimate) { this.instance.state = 'leave'; this.cdr.detectChanges(); setTimeout((/** * @return {?} */ function () { _this.destroyed.next({ id: _this.instance.messageId, userAction: userAction }); }), 200); } else { this.destroyed.next({ id: this.instance.messageId, userAction: userAction }); } }; /** * @private * @return {?} */ NzMNComponent.prototype.initErase = /** * @private * @return {?} */ function () { this.eraseTTL = this.options.nzDuration; this.eraseTimingStart = Date.now(); }; /** * @private * @return {?} */ NzMNComponent.prototype.updateTTL = /** * @private * @return {?} */ function () { if (this.autoClose) { this.eraseTTL -= Date.now() - this.eraseTimingStart; } }; /** * @private * @return {?} */ NzMNComponent.prototype.startEraseTimeout = /** * @private * @return {?} */ function () { var _this = this; if (this.eraseTTL > 0) { this.clearEraseTimeout(); this.eraseTimer = setTimeout((/** * @return {?} */ function () { return _this.destroy(); }), this.eraseTTL); this.eraseTimingStart = Date.now(); } else { this.destroy(); } }; /** * @private * @return {?} */ NzMNComponent.prototype.clearEraseTimeout = /** * @private * @return {?} */ function () { if (this.eraseTimer !== null) { clearTimeout(this.eraseTimer); this.eraseTimer = null; } }; return NzMNComponent; }()); /** * @abstract */ export { NzMNComponent }; if (false) { /** @type {?} */ NzMNComponent.prototype.instance; /** @type {?} */ NzMNComponent.prototype.index; /** @type {?} */ NzMNComponent.prototype.destroyed; /** * @type {?} * @protected */ NzMNComponent.prototype.options; /** * @type {?} * @protected */ NzMNComponent.prototype.autoClose; /** * @type {?} * @protected */ NzMNComponent.prototype.eraseTimer; /** * @type {?} * @protected */ NzMNComponent.prototype.eraseTimingStart; /** * @type {?} * @protected */ NzMNComponent.prototype.eraseTTL; /** * @type {?} * @protected */ NzMNComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvbWVzc2FnZS8iLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLFlBQVksRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFHN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7SUFJM0IsYUFBYSxHQUFHLENBQUM7Ozs7QUFFckI7Ozs7SUFJRSxxQkFBc0Isa0JBQXNDLEVBQVksT0FBZ0IsRUFBVSxRQUFrQjtRQUE5Rix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7SUFBRyxDQUFDOzs7OztJQUV4SCw0QkFBTTs7OztJQUFOLFVBQU8sRUFBVztRQUNoQixJQUFJLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQzs7Ozs7SUFFUyxtQ0FBYTs7OztJQUF2QjtRQUNFLE9BQVUsSUFBSSxDQUFDLGVBQWUsU0FBSSxhQUFhLEVBQUksQ0FBQztJQUN0RCxDQUFDOzs7Ozs7O0lBRVMsbUNBQWE7Ozs7OztJQUF2QixVQUEwRCxJQUFzQjs7WUFDMUUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekYsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixPQUFPLG1CQUFBLGlCQUFpQixFQUFLLENBQUM7U0FDL0I7O1lBRUssVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lB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U0FDckQ7SUFDSCxDQUFDOzs7OztJQUVPLHlDQUFpQjs7OztJQUF6QjtRQUFBLGlCQVFDO1FBUEMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVU7OztZQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsT0FBTyxFQUFFLEVBQWQsQ0FBYyxHQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3BDO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDOzs7OztJQUVPLHlDQUFpQjs7OztJQUF6QjtRQUNFLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDNUIsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFDSCxvQkFBQztBQUFELENBQUMsQUF2RkQsSUF1RkM7Ozs7Ozs7SUF0RkMsaUNBQWtDOztJQUNsQyw4QkFBYzs7SUFFZCxrQ0FBNkU7Ozs7O0lBRTdFLGdDQUFrRDs7Ozs7SUFDbEQsa0NBQTZCOzs7OztJQUM3QixtQ0FBMkM7Ozs7O0lBQzNDLHlDQUFtQzs7Ozs7SUFDbkMsaUNBQTJCOzs7OztJQUVmLDRCQUFnQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lc3NhZ2VDb25maWcsIE56Q29uZmlnU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpTaW5nbGV0b25TZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTnpNZXNzYWdlRGF0YSwgTnpNZXNzYWdlRGF0YU9wdGlvbnMgfSBmcm9tICcuL3R5cGluZ3MnO1xuXG5sZXQgZ2xvYmFsQ291bnRlciA9IDA7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOek1OU2VydmljZSB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjb21wb25lbnRQcmVmaXg6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbnRhaW5lcjogTnpNTkNvbnRhaW5lckNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbnpTaW5nbGV0b25TZXJ2aWNlOiBOelNpbmdsZXRvblNlcnZpY2UsIHByb3RlY3RlZCBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICByZW1vdmUoaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29tcG9uZW50UHJlZml4fS0ke2dsb2JhbENvdW50ZXIrK31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdpdGhDb250YWluZXI8VCBleHRlbmRzIE56TU5Db250YWluZXJDb21wb25lbnQ+KGN0b3I6IENvbXBvbmVudFR5cGU8VD4pOiBUIHtcbiAgICBsZXQgY29udGFpbmVySW5zdGFuY2UgPSB0aGlzLm56U2luZ2xldG9uU2VydmljZS5nZXRTaW5nbGV0b25XaXRoS2V5KHRoaXMuY29tcG9uZW50UHJlZml4KTtcbiAgICBpZiAoY29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBjb250YWluZXJJbnN0YW5jZSBhcyBUO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ub29wKCksXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBvbmVudFBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoY3RvciwgbnVsbCwgdGhpcy5pbmplY3Rvcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gb3ZlcmxheVJlZi5hdHRhY2goY29tcG9uZW50UG9ydGFsKTtcbiAgICBjb25zdCBvdmVybGF5UGFuZSA9IG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQ7XG4gICAgb3ZlcmxheVBhbmUuc3R5bGUuekluZGV4ID0gJzEwMTAnO1xuXG4gICAgaWYgKCFjb250YWluZXJJbnN0YW5jZSkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXJJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIHRoaXMubnpTaW5nbGV0b25TZXJ2aWNlLnJlZ2lzdGVyU2luZ2xldG9uV2l0aEtleSh0aGlzLmNvbXBvbmVudFByZWZpeCwgY29udGFpbmVySW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXJJbnN0YW5jZSBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOek1OQ29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjb25maWc6IFJlcXVpcmVkPE1lc3NhZ2VDb25maWc+O1xuICBpbnN0YW5jZXM6IEFycmF5PFJlcXVpcmVkPE56TWVzc2FnZURhdGE+PiA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBuekNvbmZpZ1NlcnZpY2U6IE56Q29uZmlnU2VydmljZSkge1xuICAgIHRoaXMudXBkYXRlQ29uZmlnKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmliZUNvbmZpZ0NoYW5nZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IE56TWVzc2FnZURhdGEpOiBSZXF1aXJlZDxOek1lc3NhZ2VEYXRhPiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLm9uQ3JlYXRlKGRhdGEpO1xuXG4gICAgaWYgKHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA+PSB0aGlzLmNvbmZpZy5uek1heFN0YWNrKSB7XG4gICAgICB0aGlzLmluc3RhbmNlcyA9IHRoaXMuaW5zdGFuY2VzLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VzID0gWy4uLnRoaXMuaW5zdGFuY2VzLCBpbnN0YW5jZV07XG5cbiAgICB0aGlzLnJlYWR5SW5zdGFuY2VzKCk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICByZW1vdmUoaWQ6IHN0cmluZywgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5pbnN0YW5jZXMuc29tZSgoaW5zdGFuY2UsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2UubWVzc2FnZUlkID09PSBpZCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFsuLi50aGlzLmluc3RhbmNlc107XG4gICAgICAgIHRoaXMub25SZW1vdmUoaW5zdGFuY2UsIHVzZXJBY3Rpb24pO1xuICAgICAgICB0aGlzLnJlYWR5SW5zdGFuY2VzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFuY2VzLmZvckVhY2goaSA9PiB0aGlzLm9uUmVtb3ZlKGksIGZhbHNlKSk7XG4gICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcblxuICAgIHRoaXMucmVhZHlJbnN0YW5jZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNyZWF0ZShpbnN0YW5jZTogTnpNZXNzYWdlRGF0YSk6IFJlcXVpcmVkPE56TWVzc2FnZURhdGE+IHtcbiAgICBpbnN0YW5jZS5vcHRpb25zID0gdGhpcy5tZXJnZU9wdGlvbnMoaW5zdGFuY2Uub3B0aW9ucyk7XG4gICAgaW5zdGFuY2Uub25DbG9zZSA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcmV0dXJuIGluc3RhbmNlIGFzIFJlcXVpcmVkPE56TWVzc2FnZURhdGE+O1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlKGluc3RhbmNlOiBSZXF1aXJlZDxOek1lc3NhZ2VEYXRhPiwgdXNlckFjdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGluc3RhbmNlLm9uQ2xvc2UubmV4dCh1c2VyQWN0aW9uKTtcbiAgICBpbnN0YW5jZS5vbkNsb3NlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZHlJbnN0YW5jZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZUNvbmZpZygpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdWJzY3JpYmVDb25maWdDaGFuZ2UoKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgbWVyZ2VPcHRpb25zKG9wdGlvbnM/OiBOek1lc3NhZ2VEYXRhT3B0aW9ucyk6IE56TWVzc2FnZURhdGFPcHRpb25zIHtcbiAgICBjb25zdCB7IG56RHVyYXRpb24sIG56QW5pbWF0ZSwgbnpQYXVzZU9uSG92ZXIgfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiB7IG56RHVyYXRpb24sIG56QW5pbWF0ZSwgbnpQYXVzZU9uSG92ZXIsIC4uLm9wdGlvbnMgfTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTnpNTkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgaW5zdGFuY2U6IFJlcXVpcmVkPE56TWVzc2FnZURhdGE+O1xuICBpbmRleDogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGRlc3Ryb3llZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyB1c2VyQWN0aW9uOiBib29sZWFuIH0+KCk7XG5cbiAgcHJvdGVjdGVkIG9wdGlvbnM6IFJlcXVpcmVkPE56TWVzc2FnZURhdGFPcHRpb25zPjtcbiAgcHJvdGVjdGVkIGF1dG9DbG9zZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGVyYXNlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgZXJhc2VUaW1pbmdTdGFydDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZXJhc2VUVEw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMgYXMgUmVxdWlyZWQ8TnpNZXNzYWdlRGF0YU9wdGlvbnM+O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5uekFuaW1hdGUpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2Uuc3RhdGUgPSAnZW50ZXInO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b0Nsb3NlID0gdGhpcy5vcHRpb25zLm56RHVyYXRpb24gPiAwO1xuXG4gICAgaWYgKHRoaXMuYXV0b0Nsb3NlKSB7XG4gICAgICB0aGlzLmluaXRFcmFzZSgpO1xuICAgICAgdGhpcy5zdGFydEVyYXNlVGltZW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9DbG9zZSkge1xuICAgICAgdGhpcy5jbGVhckVyYXNlVGltZW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0Nsb3NlICYmIHRoaXMub3B0aW9ucy5uelBhdXNlT25Ib3Zlcikge1xuICAgICAgdGhpcy5jbGVhckVyYXNlVGltZW91dCgpO1xuICAgICAgdGhpcy51cGRhdGVUVEwoKTtcbiAgICB9XG4gIH1cblxuICBvbkxlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9DbG9zZSAmJiB0aGlzLm9wdGlvbnMubnpQYXVzZU9uSG92ZXIpIHtcbiAgICAgIHRoaXMuc3RhcnRFcmFzZVRpbWVvdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveSh1c2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm56QW5pbWF0ZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZS5zdGF0ZSA9ICdsZWF2ZSc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCh7IGlkOiB0aGlzLmluc3RhbmNlLm1lc3NhZ2VJZCwgdXNlckFjdGlvbjogdXNlckFjdGlvbiB9KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveWVkLm5leHQoeyBpZDogdGhpcy5pbnN0YW5jZS5tZXNzYWdlSWQsIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RXJhc2UoKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZVRUTCA9IHRoaXMub3B0aW9ucy5uekR1cmF0aW9uO1xuICAgIHRoaXMuZXJhc2VUaW1pbmdTdGFydCA9IERhdGUubm93KCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRUTCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvQ2xvc2UpIHtcbiAgICAgIHRoaXMuZXJhc2VUVEwgLT0gRGF0ZS5ub3coKSAtIHRoaXMuZXJhc2VUaW1pbmdTdGFydDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RXJhc2VUaW1lb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVyYXNlVFRMID4gMCkge1xuICAgICAgdGhpcy5jbGVhckVyYXNlVGltZW91dCgpO1xuICAgICAgdGhpcy5lcmFzZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmRlc3Ryb3koKSwgdGhpcy5lcmFzZVRUTCk7XG4gICAgICB0aGlzLmVyYXNlVGltaW5nU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyRXJhc2VUaW1lb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVyYXNlVGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVyYXNlVGltZXIpO1xuICAgICAgdGhpcy5lcmFzZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==