fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
505 lines • 35.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ApplicationRef, ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostListener, Injector, Input, Output, Renderer2 } from '@angular/core';
import { PopoverContainer } from './popover-container';
import Popper from 'popper.js';
var PopoverDirective = /** @class */ (function () {
function PopoverDirective(elRef, cdRef, resolver, injector, appRef, renderer) {
this.elRef = elRef;
this.cdRef = cdRef;
this.resolver = resolver;
this.injector = injector;
this.appRef = appRef;
this.renderer = renderer;
this.isOpen = false;
this.triggers = ['click'];
this.defaultArrow = false;
this.focusTrapped = false;
this.closeOnEscapeKey = true;
this.disabled = false;
this.closeOnOutsideClick = true;
this.appendTo = 'body';
this.options = {
placement: 'bottom-start',
modifiers: {
preventOverflow: {
enabled: true,
escapeWithReference: true,
boundariesElement: 'scrollParent'
}
}
};
this.fillControl = false;
this.isOpenChange = new EventEmitter();
this.eventRef = [];
this.isSetup = false;
}
/**
* @return {?}
*/
PopoverDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.isOpen) {
this.open();
}
this.initFillControl();
this.initPlacement();
this.addTriggerListeners();
this.isSetup = true;
};
/**
* @return {?}
*/
PopoverDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.popper) {
this.popper.destroy();
}
if (this.containerRef) {
this.destroyContainer();
}
this.destroyTriggerListeners();
};
/**
* @param {?} changes
* @return {?}
*/
PopoverDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
if (!this.isSetup) {
return;
}
if (changes.triggers) {
setTimeout((/**
* @return {?}
*/
function () {
_this.destroyTriggerListeners();
_this.addTriggerListeners();
}));
}
if (changes.isOpen) {
if (changes.isOpen.currentValue) {
setTimeout((/**
* @return {?}
*/
function () {
_this.isOpen = false;
_this.open(false);
}));
}
else {
setTimeout((/**
* @return {?}
*/
function () {
_this.isOpen = true;
_this.close(false);
}));
}
}
if (changes.placement) {
setTimeout((/**
* @return {?}
*/
function () {
_this.initPlacement();
}));
}
if (changes.fillControl) {
setTimeout((/**
* @return {?}
*/
function () {
_this.initFillControl();
}));
}
};
/**
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.toggle = /**
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (this.isOpen) {
this.close(fireEvent);
}
else {
this.open(fireEvent);
}
};
/**
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.open = /**
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (!this.isOpen && !this.disabled) {
this.createContainer();
this.isOpen = true;
if (fireEvent) {
this.isOpenChange.emit(this.isOpen);
}
}
};
/**
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.close = /**
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (this.isOpen) {
this.destroyContainer();
this.isOpen = false;
if (fireEvent) {
this.isOpenChange.emit(this.isOpen);
}
}
};
/**
* @return {?}
*/
PopoverDirective.prototype.updatePopper = /**
* @return {?}
*/
function () {
if (this.popper) {
this.popper.scheduleUpdate();
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.createContainer = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.containerRef) {
return;
}
/** @type {?} */
var factory = this.resolver.resolveComponentFactory(PopoverContainer);
this.containerRef = factory.create(this.injector);
// Set instance properties
this.containerRef.instance.context = this;
this.containerRef.instance.content = this.content;
this.containerRef.instance.focusTrapped = this.focusTrapped;
this.containerRef.instance.defaultArrow = this.defaultArrow;
this.containerRef.instance.closeOnEscapeKey = this.closeOnEscapeKey;
if (!this.defaultArrow) {
this.containerRef.location.nativeElement.style.margin = 0;
}
this.appRef.attachView(this.containerRef.hostView);
/** @type {?} */
var setupRef = this.containerRef.instance.isSetup.subscribe((/**
* @return {?}
*/
function () {
_this.createPopper();
setupRef.unsubscribe();
}));
/** @type {?} */
var containerEl = (/** @type {?} */ (((/** @type {?} */ (this.containerRef.hostView))).rootNodes[0]));
if (this.appendTo === 'body') {
document.body.appendChild(containerEl);
}
else {
this.appendTo.appendChild(containerEl);
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.destroyTriggerListeners = /**
* @private
* @return {?}
*/
function () {
if (this.eventRef && this.eventRef.length > 0) {
this.eventRef.forEach((/**
* @param {?} event
* @return {?}
*/
function (event) {
event();
}));
this.eventRef = [];
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.addTriggerListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.triggers && this.triggers.length > 0) {
this.triggers.forEach((/**
* @param {?} trigger
* @return {?}
*/
function (trigger) {
_this.eventRef.push(_this.renderer.listen(_this.elRef.nativeElement, trigger, (/**
* @return {?}
*/
function () {
_this.toggle();
})));
}));
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.destroyContainer = /**
* @private
* @return {?}
*/
function () {
if (this.containerRef) {
this.appRef.detachView(this.containerRef.hostView);
this.containerRef.destroy();
this.containerRef = null;
}
if (this.popper) {
this.popper.destroy();
this.popper = null;
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.createPopper = /**
* @private
* @return {?}
*/
function () {
this.popper = new Popper((/** @type {?} */ (this.elRef.nativeElement)), (/** @type {?} */ (this.containerRef.location.nativeElement)), this.options);
};
/**
* @private
* @param {?} data
* @return {?}
*/
PopoverDirective.prototype.fillReference = /**
* @private
* @param {?} data
* @return {?}
*/
function (data) {
data.offsets.popper.left = data.offsets.reference.left;
data.offsets.popper.right = data.offsets.reference.right;
data.offsets.popper.width = data.styles.width = data.offsets.reference.width;
return data;
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.initPlacement = /**
* @private
* @return {?}
*/
function () {
if (this.placement) {
if (this.options) {
this.options.placement = this.placement;
}
else {
this.options = { placement: this.placement };
}
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.initFillControl = /**
* @private
* @return {?}
*/
function () {
if (this.fillControl) {
if (this.options && this.options.modifiers) {
this.options.modifiers.fillReference = {
enabled: true,
fn: this.fillReference,
order: 840
};
}
else {
this.options = {
modifiers: {
fillReference: {
enabled: true,
fn: this.fillReference,
order: 840
}
}
};
}
}
};
/**
* @param {?} event
* @return {?}
*/
PopoverDirective.prototype.clickHandler = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.containerRef &&
this.isOpen &&
this.closeOnOutsideClick &&
event.target !== this.elRef.nativeElement &&
!this.elRef.nativeElement.contains(event.target) &&
!this.containerRef.location.nativeElement.contains(event.target)) {
event.preventDefault();
event.stopPropagation();
this.close();
}
};
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[fdPopover]'
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: Injector },
{ type: ApplicationRef },
{ type: Renderer2 }
]; };
PopoverDirective.propDecorators = {
content: [{ type: Input, args: ['fdPopover',] }],
isOpen: [{ type: Input }],
triggers: [{ type: Input }],
defaultArrow: [{ type: Input }],
placement: [{ type: Input }],
focusTrapped: [{ type: Input }],
closeOnEscapeKey: [{ type: Input }],
disabled: [{ type: Input }],
closeOnOutsideClick: [{ type: Input }],
appendTo: [{ type: Input }],
options: [{ type: Input }],
fillControl: [{ type: Input }],
isOpenChange: [{ type: Output }],
clickHandler: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return PopoverDirective;
}());
export { PopoverDirective };
if (false) {
/** @type {?} */
PopoverDirective.prototype.content;
/** @type {?} */
PopoverDirective.prototype.isOpen;
/** @type {?} */
PopoverDirective.prototype.triggers;
/** @type {?} */
PopoverDirective.prototype.defaultArrow;
/** @type {?} */
PopoverDirective.prototype.placement;
/** @type {?} */
PopoverDirective.prototype.focusTrapped;
/** @type {?} */
PopoverDirective.prototype.closeOnEscapeKey;
/** @type {?} */
PopoverDirective.prototype.disabled;
/** @type {?} */
PopoverDirective.prototype.closeOnOutsideClick;
/** @type {?} */
PopoverDirective.prototype.appendTo;
/** @type {?} */
PopoverDirective.prototype.options;
/** @type {?} */
PopoverDirective.prototype.fillControl;
/** @type {?} */
PopoverDirective.prototype.isOpenChange;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.containerRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.popper;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.eventRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.isSetup;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.elRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.cdRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.resolver;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.injector;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.appRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvcG9wb3Zlci9wb3BvdmVyLWRpcmVjdGl2ZS9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQW1CLFlBQVksRUFBRSxZQUFZLEVBQ3ZELFFBQVEsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxTQUFTLEVBRW5FLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sTUFBb0MsTUFBTSxXQUFXLENBQUM7QUFFN0Q7SUEwREksMEJBQW9CLEtBQWlCLEVBQ2pCLEtBQXdCLEVBQ3hCLFFBQWtDLEVBQ2xDLFFBQWtCLEVBQ2xCLE1BQXNCLEVBQ3RCLFFBQW1CO1FBTG5CLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdER2QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBR3hCLGFBQVEsR0FBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRy9CLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBTTlCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzlCLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUdqQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRzFCLHdCQUFtQixHQUFZLElBQUksQ0FBQztRQUdwQyxhQUFRLEdBQXlCLE1BQU0sQ0FBQztRQUd4QyxZQUFPLEdBQWtCO1lBQ3JCLFNBQVMsRUFB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TCxLQUFLOzBCQUdMLEtBQUs7OEJBWUwsS0FBSzsrQkFHTCxNQUFNOytCQXFPTixZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBYTlDLHVCQUFDO0NBQUEsQUFwU0QsSUFvU0M7U0FqU1ksZ0JBQWdCOzs7SUFFekIsbUNBQ21DOztJQUVuQyxrQ0FDd0I7O0lBRXhCLG9DQUMrQjs7SUFFL0Isd0NBQzhCOztJQUU5QixxQ0FDcUI7O0lBRXJCLHdDQUM4Qjs7SUFFOUIsNENBQ2lDOztJQUVqQyxvQ0FDMEI7O0lBRTFCLCtDQUNvQzs7SUFFcEMsb0NBQ3dDOztJQUV4QyxtQ0FVRTs7SUFFRix1Q0FDNkI7O0lBRTdCLHdDQUNrRTs7Ozs7SUFFbEUsd0NBQXFEOzs7OztJQUNyRCxrQ0FBdUI7Ozs7O0lBQ3ZCLG9DQUFrQzs7Ozs7SUFDbEMsbUNBQWlDOzs7OztJQUVyQixpQ0FBeUI7Ozs7O0lBQ3pCLGlDQUFnQzs7Ozs7SUFDaEMsb0NBQTBDOzs7OztJQUMxQyxvQ0FBMEI7Ozs7O0lBQzFCLGtDQUE4Qjs7Ozs7SUFDOUIsb0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdG9yLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGFpbmVyIH0gZnJvbSAnLi9wb3BvdmVyLWNvbnRhaW5lcic7XG5pbXBvcnQgUG9wcGVyLCB7IFBsYWNlbWVudCwgUG9wcGVyT3B0aW9ucyB9IGZyb20gJ3BvcHBlci5qcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2ZkUG9wb3Zlcl0nXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICAgIEBJbnB1dCgnZmRQb3BvdmVyJylcbiAgICBjb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgdHJpZ2dlcnM6IHN0cmluZ1tdID0gWydjbGljayddO1xuXG4gICAgQElucHV0KClcbiAgICBkZWZhdWx0QXJyb3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcGxhY2VtZW50OiBQbGFjZW1lbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIGZvY3VzVHJhcHBlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBjbG9zZU9uRXNjYXBlS2V5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGFwcGVuZFRvOiBIVE1MRWxlbWVudCB8ICdib2R5JyA9ICdib2R5JztcblxuICAgIEBJbnB1dCgpXG4gICAgb3B0aW9uczogUG9wcGVyT3B0aW9ucyA9IHtcbiAgICAgICAgcGxhY2VtZW50OiAnYm90dG9tLXN0YXJ0JyxcbiAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVzY2FwZVdpdGhSZWZlcmVuY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6ICdzY3JvbGxQYXJlbnQnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpXG4gICAgaXNPcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcml2YXRlIGNvbnRhaW5lclJlZjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb250YWluZXI+O1xuICAgIHByaXZhdGUgcG9wcGVyOiBQb3BwZXI7XG4gICAgcHJpdmF0ZSBldmVudFJlZjogRnVuY3Rpb25bXSA9IFtdO1xuICAgIHByaXZhdGUgaXNTZXR1cDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0RmlsbENvbnRyb2woKTtcbiAgICAgICAgdGhpcy5pbml0UGxhY2VtZW50KCk7XG5cbiAgICAgICAgdGhpcy5hZGRUcmlnZ2VyTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuaXNTZXR1cCA9IHRydWU7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvcHBlcikge1xuICAgICAgICAgICAgdGhpcy5wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lDb250YWluZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJveVRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1NldHVwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy50cmlnZ2Vycykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95VHJpZ2dlckxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVHJpZ2dlckxpc3RlbmVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5pc09wZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmlzT3Blbi5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBsYWNlbWVudCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5maWxsQ29udHJvbCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RmlsbENvbnRyb2woKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZShmaXJlRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZShmaXJlRXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKGZpcmVFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbihmaXJlRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4gJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChmaXJlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZShmaXJlRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Q29udGFpbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoZmlyZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUG9wcGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wb3BwZXIpIHtcbiAgICAgICAgICAgIHRoaXMucG9wcGVyLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbnRhaW5lcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFBvcG92ZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuXG4gICAgICAgIC8vIFNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmNvbnRleHQgPSB0aGlzO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5jb250ZW50ID0gdGhpcy5jb250ZW50O1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5mb2N1c1RyYXBwZWQgPSB0aGlzLmZvY3VzVHJhcHBlZDtcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuZGVmYXVsdEFycm93ID0gdGhpcy5kZWZhdWx0QXJyb3c7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmNsb3NlT25Fc2NhcGVLZXkgPSB0aGlzLmNsb3NlT25Fc2NhcGVLZXk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRBcnJvdykge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW4gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh0aGlzLmNvbnRhaW5lclJlZi5ob3N0Vmlldyk7XG4gICAgICAgIGNvbnN0IHNldHVwUmVmID0gdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuaXNTZXR1cC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQb3BwZXIoKTtcbiAgICAgICAgICAgIHNldHVwUmVmLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gKHRoaXMuY29udGFpbmVyUmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG8gPT09ICdib2R5Jykge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFRvLmFwcGVuZENoaWxkKGNvbnRhaW5lckVsKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95VHJpZ2dlckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRSZWYgJiYgdGhpcy5ldmVudFJlZi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50UmVmLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRSZWYgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVHJpZ2dlckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlcnMgJiYgdGhpcy50cmlnZ2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2godHJpZ2dlciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFJlZi5wdXNoKHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCwgdHJpZ2dlciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Q29udGFpbmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jb250YWluZXJSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWYgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9wcGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHBlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnBvcHBlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVBvcHBlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb3BwZXIgPSBuZXcgUG9wcGVyKFxuICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsbFJlZmVyZW5jZShkYXRhKTogYW55IHtcbiAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci5sZWZ0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZS5sZWZ0O1xuICAgICAgICBkYXRhLm9mZnNldHMucG9wcGVyLnJpZ2h0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZS5yaWdodDtcbiAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci53aWR0aCA9IGRhdGEuc3R5bGVzLndpZHRoID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZS53aWR0aDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UGxhY2VtZW50KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHtwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RmlsbENvbnRyb2woKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbGxDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZpbGxSZWZlcmVuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZuOiB0aGlzLmZpbGxSZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiA4NDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUmVmZXJlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogdGhpcy5maWxsUmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiA4NDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgY2xpY2tIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZiAmJlxuICAgICAgICAgICAgdGhpcy5pc09wZW4gJiZcbiAgICAgICAgICAgIHRoaXMuY2xvc2VPbk91dHNpZGVDbGljayAmJlxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19