ng2-bs3-modal
Version:
Angular Boostrap 3 Modal Component
501 lines (500 loc) • 40.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, NgZone } from '@angular/core';
import { Observable, Subject, of as observableOf, fromEvent, merge, zip } from 'rxjs';
import { take, filter, tap, share, map } from 'rxjs/operators';
import { BsModalHideType, BsModalSize } from './models';
import { BsModalService } from './modal.service';
/** @type {?} */
var EVENT_SUFFIX = 'ng2-bs3-modal';
/** @type {?} */
var SHOW_EVENT_NAME = "show.bs.modal." + EVENT_SUFFIX;
/** @type {?} */
var SHOWN_EVENT_NAME = "shown.bs.modal." + EVENT_SUFFIX;
/** @type {?} */
var HIDE_EVENT_NAME = "hide.bs.modal." + EVENT_SUFFIX;
/** @type {?} */
var HIDDEN_EVENT_NAME = "hidden.bs.modal." + EVENT_SUFFIX;
/** @type {?} */
var LOADED_EVENT_NAME = "loaded.bs.modal." + EVENT_SUFFIX;
/** @type {?} */
var DATA_KEY = 'bs.modal';
var BsModalComponent = /** @class */ (function () {
function BsModalComponent(element, service, zone) {
var _this = this;
this.element = element;
this.service = service;
this.zone = zone;
this.overrideSize = null;
this.onInternalClose$ = new Subject();
this.subscriptions = [];
this.visible = false;
this.showing = false;
this.hiding = false;
this.animation = true;
this.backdrop = true;
this.keyboard = true;
this.onShow = new EventEmitter();
this.onOpen = new EventEmitter();
this.onHide = new EventEmitter();
this.onClose = new EventEmitter();
this.onDismiss = new EventEmitter();
this.onLoaded = new EventEmitter();
this.setVisible = function (isVisible) {
return function () {
_this.visible = isVisible;
_this.showing = false;
_this.hiding = false;
};
};
this.setOptions = function (options) {
/** @type {?} */
var backdrop = options.backdrop;
if (typeof backdrop === 'string' && backdrop !== 'static') {
backdrop = true;
}
if (options.backdrop !== undefined) {
_this.options.backdrop = backdrop;
}
if (options.keyboard !== undefined) {
_this.options.keyboard = options.keyboard;
}
};
this.service.add(this);
this.init();
}
Object.defineProperty(BsModalComponent.prototype, "options", {
get: /**
* @return {?}
*/
function () {
if (!this.$modal) {
this.init();
}
return this.$modal.data(DATA_KEY).options;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BsModalComponent.prototype, "fadeClass", {
get: /**
* @return {?}
*/
function () { return this.animation; },
enumerable: true,
configurable: true
});
Object.defineProperty(BsModalComponent.prototype, "modalClass", {
get: /**
* @return {?}
*/
function () { return true; },
enumerable: true,
configurable: true
});
Object.defineProperty(BsModalComponent.prototype, "roleAttr", {
get: /**
* @return {?}
*/
function () { return 'dialog'; },
enumerable: true,
configurable: true
});
Object.defineProperty(BsModalComponent.prototype, "tabindexAttr", {
get: /**
* @return {?}
*/
function () { return '-1'; },
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
BsModalComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.wireUpEventEmitters();
};
/**
* @return {?}
*/
BsModalComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.$dialog = this.$modal.find('.modal-dialog');
};
/**
* @return {?}
*/
BsModalComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.setOptions({
backdrop: this.backdrop,
keyboard: this.keyboard
});
};
/**
* @return {?}
*/
BsModalComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.onInternalClose$.next(BsModalHideType.Destroy);
return this.destroy();
};
/**
* @return {?}
*/
BsModalComponent.prototype.focus = /**
* @return {?}
*/
function () {
this.$modal.trigger('focus');
};
/**
* @return {?}
*/
BsModalComponent.prototype.routerCanDeactivate = /**
* @return {?}
*/
function () {
this.onInternalClose$.next(BsModalHideType.RouteChange);
return this.destroy();
};
/**
* @param {?=} size
* @return {?}
*/
BsModalComponent.prototype.open = /**
* @param {?=} size
* @return {?}
*/
function (size) {
this.overrideSize = null;
if (BsModalSize.isValidSize(size)) {
this.overrideSize = size;
}
return this.show().toPromise();
};
/**
* @param {?=} value
* @return {?}
*/
BsModalComponent.prototype.close = /**
* @param {?=} value
* @return {?}
*/
function (value) {
var _this = this;
this.onInternalClose$.next(BsModalHideType.Close);
return this.hide().pipe(tap(function () { return _this.onClose.emit(value); })).toPromise().then(function () { return value; });
};
/**
* @return {?}
*/
BsModalComponent.prototype.dismiss = /**
* @return {?}
*/
function () {
this.onInternalClose$.next(BsModalHideType.Dismiss);
return this.hide().toPromise();
};
/**
* @return {?}
*/
BsModalComponent.prototype.getCssClasses = /**
* @return {?}
*/
function () {
/** @type {?} */
var classes = [];
if (this.isSmall()) {
classes.push('modal-sm');
}
if (this.isLarge()) {
classes.push('modal-lg');
}
if (this.cssClass) {
classes.push(this.cssClass);
}
return classes.join(' ');
};
/**
* @return {?}
*/
BsModalComponent.prototype.isSmall = /**
* @return {?}
*/
function () {
return this.overrideSize !== BsModalSize.Large
&& this.size === BsModalSize.Small
|| this.overrideSize === BsModalSize.Small;
};
/**
* @return {?}
*/
BsModalComponent.prototype.isLarge = /**
* @return {?}
*/
function () {
return this.overrideSize !== BsModalSize.Small
&& this.size === BsModalSize.Large
|| this.overrideSize === BsModalSize.Large;
};
/**
* @return {?}
*/
BsModalComponent.prototype.show = /**
* @return {?}
*/
function () {
var _this = this;
if (this.visible && !this.hiding) {
return observableOf(null);
}
this.showing = true;
return Observable.create(function (o) {
_this.onShown$.pipe(take(1)).subscribe(function (next) {
o.next(next);
o.complete();
});
_this.transitionFix();
_this.$modal.modal('show');
});
};
/**
* @return {?}
*/
BsModalComponent.prototype.transitionFix = /**
* @return {?}
*/
function () {
var _this = this;
// Fix for shown.bs.modal not firing when .fade is present
// https://github.com/twbs/bootstrap/issues/11793
if (this.animation) {
setTimeout(function () {
_this.$modal.trigger('focus').trigger(SHOWN_EVENT_NAME);
}, jQuery.fn.modal['Constructor'].TRANSITION_DURATION);
}
};
/**
* @return {?}
*/
BsModalComponent.prototype.hide = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.visible && !this.showing) {
return observableOf(null);
}
this.hiding = true;
return Observable.create(function (o) {
_this.onHidden$.pipe(take(1)).subscribe(function (next) {
o.next(next);
o.complete();
});
_this.$modal.modal('hide');
});
};
/**
* @return {?}
*/
BsModalComponent.prototype.init = /**
* @return {?}
*/
function () {
var _this = this;
this.$modal = jQuery(this.element.nativeElement);
this.$modal.appendTo(document.body);
this.$modal.modal({
show: false
});
this.onShowEvent$ = fromEvent(this.$modal, SHOW_EVENT_NAME);
this.onShownEvent$ = fromEvent(this.$modal, SHOWN_EVENT_NAME);
this.onHideEvent$ = fromEvent(this.$modal, HIDE_EVENT_NAME);
this.onHiddenEvent$ = fromEvent(this.$modal, HIDDEN_EVENT_NAME);
this.onLoadedEvent$ = fromEvent(this.$modal, LOADED_EVENT_NAME);
/** @type {?} */
var onClose$ = merge(this.onInternalClose$, this.service.onBackdropClose$, this.service.onKeyboardClose$);
this.onHide$ = zip(this.onHideEvent$, onClose$).pipe(map(function (x) { return ({ event: x[0], type: x[1] }); }));
this.onHidden$ = zip(this.onHiddenEvent$, onClose$).pipe(map(function (x) { return x[1]; }), tap(this.setVisible(false)), tap(function () { return _this.service.focusNext(); }), share());
this.onShown$ = this.onShownEvent$.pipe(tap(this.setVisible(true)), share());
this.onDismiss$ = this.onHidden$.pipe(filter(function (x) { return x !== BsModalHideType.Close; }));
// Start watching for events
// Start watching for events
(_a = this.subscriptions).push.apply(_a, tslib_1.__spread([
this.onShown$.subscribe(function () { }),
this.onHidden$.subscribe(function () { }),
this.service.onModalStack$.subscribe(function () { })
]));
var _a;
};
/**
* @return {?}
*/
BsModalComponent.prototype.wireUpEventEmitters = /**
* @return {?}
*/
function () {
this.wireUpEventEmitter(this.onShow, this.onShowEvent$);
this.wireUpEventEmitter(this.onOpen, this.onShown$);
this.wireUpEventEmitter(this.onHide, this.onHide$);
this.wireUpEventEmitter(this.onDismiss, this.onDismiss$);
this.wireUpEventEmitter(this.onLoaded, this.onLoadedEvent$);
};
/**
* @template T
* @param {?} emitter
* @param {?} stream$
* @return {?}
*/
BsModalComponent.prototype.wireUpEventEmitter = /**
* @template T
* @param {?} emitter
* @param {?} stream$
* @return {?}
*/
function (emitter, stream$) {
var _this = this;
if (emitter.observers.length === 0) {
return;
}
/** @type {?} */
var sub = stream$.subscribe(function (next) {
_this.zone.run(function () {
emitter.next(next);
});
});
this.subscriptions.push(sub);
};
/**
* @return {?}
*/
BsModalComponent.prototype.destroy = /**
* @return {?}
*/
function () {
var _this = this;
return this.hide().pipe(tap(function () {
_this.service.remove(_this);
_this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
_this.subscriptions = [];
if (_this.$modal) {
_this.$modal.data(DATA_KEY, null);
_this.$modal.remove();
_this.$modal = null;
}
})).toPromise();
};
BsModalComponent.decorators = [
{ type: Component, args: [{
selector: 'bs-modal',
template: "\n <div class=\"modal-dialog\" [ngClass]=\"getCssClasses()\">\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n </div>\n "
},] },
];
/** @nocollapse */
BsModalComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: BsModalService },
{ type: NgZone }
]; };
BsModalComponent.propDecorators = {
animation: [{ type: Input }],
backdrop: [{ type: Input }],
keyboard: [{ type: Input }],
size: [{ type: Input }],
cssClass: [{ type: Input }],
onShow: [{ type: Output }],
onOpen: [{ type: Output }],
onHide: [{ type: Output }],
onClose: [{ type: Output }],
onDismiss: [{ type: Output }],
onLoaded: [{ type: Output }],
fadeClass: [{ type: HostBinding, args: ['class.fade',] }],
modalClass: [{ type: HostBinding, args: ['class.modal',] }],
roleAttr: [{ type: HostBinding, args: ['attr.role',] }],
tabindexAttr: [{ type: HostBinding, args: ['attr.tabindex',] }]
};
return BsModalComponent;
}());
export { BsModalComponent };
if (false) {
/** @type {?} */
BsModalComponent.prototype.overrideSize;
/** @type {?} */
BsModalComponent.prototype.$modal;
/** @type {?} */
BsModalComponent.prototype.$dialog;
/** @type {?} */
BsModalComponent.prototype.onShowEvent$;
/** @type {?} */
BsModalComponent.prototype.onShownEvent$;
/** @type {?} */
BsModalComponent.prototype.onHideEvent$;
/** @type {?} */
BsModalComponent.prototype.onHiddenEvent$;
/** @type {?} */
BsModalComponent.prototype.onLoadedEvent$;
/** @type {?} */
BsModalComponent.prototype.onShown$;
/** @type {?} */
BsModalComponent.prototype.onInternalClose$;
/** @type {?} */
BsModalComponent.prototype.onDismiss$;
/** @type {?} */
BsModalComponent.prototype.onHide$;
/** @type {?} */
BsModalComponent.prototype.onHidden$;
/** @type {?} */
BsModalComponent.prototype.subscriptions;
/** @type {?} */
BsModalComponent.prototype.visible;
/** @type {?} */
BsModalComponent.prototype.showing;
/** @type {?} */
BsModalComponent.prototype.hiding;
/** @type {?} */
BsModalComponent.prototype.animation;
/** @type {?} */
BsModalComponent.prototype.backdrop;
/** @type {?} */
BsModalComponent.prototype.keyboard;
/** @type {?} */
BsModalComponent.prototype.size;
/** @type {?} */
BsModalComponent.prototype.cssClass;
/** @type {?} */
BsModalComponent.prototype.onShow;
/** @type {?} */
BsModalComponent.prototype.onOpen;
/** @type {?} */
BsModalComponent.prototype.onHide;
/** @type {?} */
BsModalComponent.prototype.onClose;
/** @type {?} */
BsModalComponent.prototype.onDismiss;
/** @type {?} */
BsModalComponent.prototype.onLoaded;
/** @type {?} */
BsModalComponent.prototype.setVisible;
/** @type {?} */
BsModalComponent.prototype.setOptions;
/** @type {?} */
BsModalComponent.prototype.element;
/** @type {?} */
BsModalComponent.prototype.service;
/** @type {?} */
BsModalComponent.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcyLWJzMy1tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsL21vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFDSCxTQUFTLEVBS1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBWSxPQUFPLEVBQWdCLEVBQUUsSUFBSSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUcsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQW9CLGVBQWUsRUFBa0IsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFakQsSUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDOztBQUNyQyxJQUFNLGVBQWUsR0FBRyxtQkFBaUIsWUFBYyxDQUFDOztBQUN4RCxJQUFNLGdCQUFnQixHQUFHLG9CQUFrQixZQUFjLENBQUM7O0FBQzFELElBQU0sZUFBZSxHQUFHLG1CQUFpQixZQUFjLENBQUM7O0FBQ3hELElBQU0saUJBQWlCLEdBQUcscUJBQW1CLFlBQWMsQ0FBQzs7QUFDNUQsSUFBTSxpQkFBaUIsR0FBRyxxQkFBbUIsWUFBYyxDQUFDOztBQUM1RCxJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7O0lBZ0V4QiwwQkFBb0IsT0FBbUIsRUFBVSxPQUF1QixFQUFVLElBQVk7UUFBOUYsaUJBR0M7UUFIbUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQVUs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QzFCLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFmLENBQWUsQ0FBQyxDQUFDO1lBQ2pELEtBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDdEI7U0FDSixDQUFDLENBQ0wsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7O2dCQXRTckIsU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSxVQUFVO29CQUNwQixRQUFRLEVBQUUsc01BTVQ7aUJBQ0o7Ozs7Z0JBM0JHLFVBQVU7Z0JBUUwsY0FBYztnQkFObkIsTUFBTTs7OzRCQXFETCxLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzt1QkFDTCxLQUFLOzJCQUNMLEtBQUs7eUJBRUwsTUFBTTt5QkFDTixNQUFNO3lCQUNOLE1BQU07MEJBQ04sTUFBTTs0QkFDTixNQUFNOzJCQUNOLE1BQU07NEJBRU4sV0FBVyxTQUFDLFlBQVk7NkJBR3hCLFdBQVcsU0FBQyxhQUFhOzJCQUd6QixXQUFXLFNBQUMsV0FBVzsrQkFHdkIsV0FBVyxTQUFDLGVBQWU7OzJCQXZGaEM7O1NBc0NhLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOm5vLW91dHB1dC1vbi1wcmVmaXhcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIE5nWm9uZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIGFzIG9ic2VydmFibGVPZiwgZnJvbUV2ZW50LCBtZXJnZSwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCBmaWx0ZXIsIHRhcCwgc2hhcmUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQnNNb2RhbEhpZGVFdmVudCwgQnNNb2RhbEhpZGVUeXBlLCBCc01vZGFsT3B0aW9ucywgQnNNb2RhbFNpemUgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJy4vbW9kYWwuc2VydmljZSc7XG5cbmNvbnN0IEVWRU5UX1NVRkZJWCA9ICduZzItYnMzLW1vZGFsJztcbmNvbnN0IFNIT1dfRVZFTlRfTkFNRSA9IGBzaG93LmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBTSE9XTl9FVkVOVF9OQU1FID0gYHNob3duLmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBISURFX0VWRU5UX05BTUUgPSBgaGlkZS5icy5tb2RhbC4ke0VWRU5UX1NVRkZJWH1gO1xuY29uc3QgSElEREVOX0VWRU5UX05BTUUgPSBgaGlkZGVuLmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBMT0FERURfRVZFTlRfTkFNRSA9IGBsb2FkZWQuYnMubW9kYWwuJHtFVkVOVF9TVUZGSVh9YDtcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm1vZGFsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdicy1tb2RhbCcsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIFtuZ0NsYXNzXT1cImdldENzc0NsYXNzZXMoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIG92ZXJyaWRlU2l6ZTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlICRtb2RhbDogSlF1ZXJ5O1xuICAgIHByaXZhdGUgJGRpYWxvZzogSlF1ZXJ5O1xuICAgIHByaXZhdGUgb25TaG93RXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uU2hvd25FdmVudCQ6IE9ic2VydmFibGU8RXZlbnQ+O1xuICAgIHByaXZhdGUgb25IaWRlRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uSGlkZGVuRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uTG9hZGVkRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uU2hvd24kOiBPYnNlcnZhYmxlPHt9PjtcbiAgICBwcml2YXRlIG9uSW50ZXJuYWxDbG9zZSQ6IFN1YmplY3Q8QnNNb2RhbEhpZGVUeXBlPiA9IG5ldyBTdWJqZWN0PEJzTW9kYWxIaWRlVHlwZT4oKTtcbiAgICBwcml2YXRlIG9uRGlzbWlzcyQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVUeXBlPjtcbiAgICBwcml2YXRlIG9uSGlkZSQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVFdmVudD47XG4gICAgcHJpdmF0ZSBvbkhpZGRlbiQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVUeXBlPjtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLiRtb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vZGFsLmRhdGEoREFUQV9LRVkpLm9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuICAgIHNob3dpbmcgPSBmYWxzZTtcbiAgICBoaWRpbmcgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGFuaW1hdGlvbiA9IHRydWU7XG4gICAgQElucHV0KCkgYmFja2Ryb3A6IHN0cmluZyB8IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGtleWJvYXJkID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaXplOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcblxuICAgIEBPdXRwdXQoKSBvblNob3cgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBvbk9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25IaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25EaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjxCc01vZGFsSGlkZVR5cGU+KCk7XG4gICAgQE91dHB1dCgpIG9uTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZhZGUnKVxuICAgIGdldCBmYWRlQ2xhc3MoKSB7IHJldHVybiB0aGlzLmFuaW1hdGlvbjsgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tb2RhbCcpXG4gICAgZ2V0IG1vZGFsQ2xhc3MoKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgZ2V0IHJvbGVBdHRyKCkgeyByZXR1cm4gJ2RpYWxvZyc7IH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgZ2V0IHRhYmluZGV4QXR0cigpIHsgcmV0dXJuICctMSc7IH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSBzZXJ2aWNlOiBCc01vZGFsU2VydmljZSwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVycygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy4kZGlhbG9nID0gdGhpcy4kbW9kYWwuZmluZCgnLm1vZGFsLWRpYWxvZycpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMoe1xuICAgICAgICAgICAgYmFja2Ryb3A6IHRoaXMuYmFja2Ryb3AsXG4gICAgICAgICAgICBrZXlib2FyZDogdGhpcy5rZXlib2FyZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5vbkludGVybmFsQ2xvc2UkLm5leHQoQnNNb2RhbEhpZGVUeXBlLkRlc3Ryb3kpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuJG1vZGFsLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgfVxuXG4gICAgcm91dGVyQ2FuRGVhY3RpdmF0ZSgpOiBhbnkge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuUm91dGVDaGFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihzaXplPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVTaXplID0gbnVsbDtcbiAgICAgICAgaWYgKEJzTW9kYWxTaXplLmlzVmFsaWRTaXplKHNpemUpKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlU2l6ZSA9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdygpLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGNsb3NlKHZhbHVlPzogYW55KTogUHJvbWlzZTx7fT4ge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuQ2xvc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5oaWRlKCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLm9uQ2xvc2UuZW1pdCh2YWx1ZSkpLFxuICAgICAgICApLnRvUHJvbWlzZSgpLnRoZW4oKCkgPT4gdmFsdWUpO1xuICAgIH1cblxuICAgIGRpc21pc3MoKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuRGlzbWlzcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGUoKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXRDc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTbWFsbCgpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ21vZGFsLXNtJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xhcmdlKCkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbW9kYWwtbGcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5jc3NDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZVNpemUgIT09IEJzTW9kYWxTaXplLkxhcmdlXG4gICAgICAgICAgICAmJiB0aGlzLnNpemUgPT09IEJzTW9kYWxTaXplLlNtYWxsXG4gICAgICAgICAgICB8fCB0aGlzLm92ZXJyaWRlU2l6ZSA9PT0gQnNNb2RhbFNpemUuU21hbGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZVNpemUgIT09IEJzTW9kYWxTaXplLlNtYWxsXG4gICAgICAgICAgICAmJiB0aGlzLnNpemUgPT09IEJzTW9kYWxTaXplLkxhcmdlXG4gICAgICAgICAgICB8fCB0aGlzLm92ZXJyaWRlU2l6ZSA9PT0gQnNNb2RhbFNpemUuTGFyZ2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUgJiYgIXRoaXMuaGlkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd2luZyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKChvOiBPYnNlcnZlcjxhbnk+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU2hvd24kLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICAgICAgICAgIG8ubmV4dChuZXh0KTtcbiAgICAgICAgICAgICAgICBvLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uRml4KCk7XG4gICAgICAgICAgICB0aGlzLiRtb2RhbC5tb2RhbCgnc2hvdycpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyYW5zaXRpb25GaXgoKSB7XG4gICAgICAgIC8vIEZpeCBmb3Igc2hvd24uYnMubW9kYWwgbm90IGZpcmluZyB3aGVuIC5mYWRlIGlzIHByZXNlbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTc5M1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnRyaWdnZXIoJ2ZvY3VzJykudHJpZ2dlcihTSE9XTl9FVkVOVF9OQU1FKTtcbiAgICAgICAgICAgIH0sIGpRdWVyeS5mbi5tb2RhbFsnQ29uc3RydWN0b3InXS5UUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZSgpOiBPYnNlcnZhYmxlPEJzTW9kYWxIaWRlVHlwZT4ge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSAmJiAhdGhpcy5zaG93aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mPEJzTW9kYWxIaWRlVHlwZT4obnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSgobzogT2JzZXJ2ZXI8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkhpZGRlbiQucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICBvLm5leHQobmV4dCk7XG4gICAgICAgICAgICAgICAgby5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuJG1vZGFsLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy4kbW9kYWwgPSBqUXVlcnkodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLiRtb2RhbC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgdGhpcy4kbW9kYWwubW9kYWwoe1xuICAgICAgICAgICAgc2hvdzogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vblNob3dFdmVudCQgPSBmcm9tRXZlbnQodGhpcy4kbW9kYWwsIFNIT1dfRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25TaG93bkV2ZW50JCA9IGZyb21FdmVudCh0aGlzLiRtb2RhbCwgU0hPV05fRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25IaWRlRXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBISURFX0VWRU5UX05BTUUpO1xuICAgICAgICB0aGlzLm9uSGlkZGVuRXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBISURERU5fRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25Mb2FkZWRFdmVudCQgPSBmcm9tRXZlbnQodGhpcy4kbW9kYWwsIExPQURFRF9FVkVOVF9OQU1FKTtcblxuICAgICAgICBjb25zdCBvbkNsb3NlJCA9IG1lcmdlKHRoaXMub25JbnRlcm5hbENsb3NlJCwgdGhpcy5zZXJ2aWNlLm9uQmFja2Ryb3BDbG9zZSQsIHRoaXMuc2VydmljZS5vbktleWJvYXJkQ2xvc2UkKTtcblxuICAgICAgICB0aGlzLm9uSGlkZSQgPSB6aXAodGhpcy5vbkhpZGVFdmVudCQsIG9uQ2xvc2UkKS5waXBlKFxuICAgICAgICAgICAgbWFwKHggPT4gPEJzTW9kYWxIaWRlRXZlbnQ+eyBldmVudDogeFswXSwgdHlwZTogeFsxXSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9uSGlkZGVuJCA9IHppcDxCc01vZGFsSGlkZVR5cGU+KHRoaXMub25IaWRkZW5FdmVudCQsIG9uQ2xvc2UkKS5waXBlKFxuICAgICAgICAgICAgbWFwKHggPT4geFsxXSksXG4gICAgICAgICAgICB0YXAodGhpcy5zZXRWaXNpYmxlKGZhbHNlKSksXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmZvY3VzTmV4dCgpKSxcbiAgICAgICAgICAgIHNoYXJlKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vblNob3duJCA9IHRoaXMub25TaG93bkV2ZW50JC5waXBlKFxuICAgICAgICAgICAgdGFwKHRoaXMuc2V0VmlzaWJsZSh0cnVlKSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbkRpc21pc3MkID0gdGhpcy5vbkhpZGRlbiQucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4geCAhPT0gQnNNb2RhbEhpZGVUeXBlLkNsb3NlKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciBldmVudHNcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goLi4uW1xuICAgICAgICAgICAgdGhpcy5vblNob3duJC5zdWJzY3JpYmUoKCkgPT4geyB9KSxcbiAgICAgICAgICAgIHRoaXMub25IaWRkZW4kLnN1YnNjcmliZSgoKSA9PiB7IH0pLFxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm9uTW9kYWxTdGFjayQuc3Vic2NyaWJlKCgpID0+IHsgfSlcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3aXJlVXBFdmVudEVtaXR0ZXJzKCkge1xuXG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25TaG93LCB0aGlzLm9uU2hvd0V2ZW50JCk7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25PcGVuLCB0aGlzLm9uU2hvd24kKTtcbiAgICAgICAgdGhpcy53aXJlVXBFdmVudEVtaXR0ZXIodGhpcy5vbkhpZGUsIHRoaXMub25IaWRlJCk7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25EaXNtaXNzLCB0aGlzLm9uRGlzbWlzcyQpO1xuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcih0aGlzLm9uTG9hZGVkLCB0aGlzLm9uTG9hZGVkRXZlbnQkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdpcmVVcEV2ZW50RW1pdHRlcjxUPihlbWl0dGVyOiBFdmVudEVtaXR0ZXI8VD4sIHN0cmVhbSQ6IE9ic2VydmFibGU8VD4pIHtcbiAgICAgICAgaWYgKGVtaXR0ZXIub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViID0gc3RyZWFtJC5zdWJzY3JpYmUoKG5leHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXR0ZXIubmV4dChuZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VmlzaWJsZSA9IChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGlzVmlzaWJsZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE9wdGlvbnMgPSAob3B0aW9uczogQnNNb2RhbE9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IGJhY2tkcm9wID0gb3B0aW9ucy5iYWNrZHJvcDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYWNrZHJvcCA9PT0gJ3N0cmluZycgJiYgYmFja2Ryb3AgIT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgICBiYWNrZHJvcCA9IHRydWU7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmJhY2tkcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5iYWNrZHJvcCA9IGJhY2tkcm9wO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmtleWJvYXJkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5rZXlib2FyZCA9IG9wdGlvbnMua2V5Ym9hcmQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3koKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGUoKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kbW9kYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuZGF0YShEQVRBX0tFWSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKS50b1Byb21pc2UoKTtcbiAgICB9XG59XG4iXX0=