UNPKG

ngx-smart-popover

Version:

Simple popover control for your angular (v4+) applications using bootstrap4 with smart reflection logic when overflowing the viewport. This is a continuation of ngx-popover (https://github.com/pleerock/ngx-popover). If you want to use it without bootstrap

424 lines 34.8 kB
/** * @fileoverview added by tsickle * Generated from: lib/popover.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * This is a continuation of ngx-popover * @Reference {github} https://github.com/pleerock/ngx-popover */ import { ChangeDetectorRef, ComponentFactoryResolver, Directive, EventEmitter, HostListener, Input, Output, ViewContainerRef, ApplicationRef, Injector } from '@angular/core'; import { PopoverContentComponent } from './popover-content.component'; import { PopoverPlacement } from './popover.placement'; /** * \@group Basic Toolkit * \@component Popover Directive */ var PopoverDirective = /** @class */ (function () { // ------------------------------------------------------------------------- // Constructor // ------------------------------------------------------------------------- function PopoverDirective(viewContainerRef, cdr, resolver, appRef, injector) { this.viewContainerRef = viewContainerRef; this.cdr = cdr; this.resolver = resolver; this.appRef = appRef; this.injector = injector; // ------------------------------------------------------------------------- // Properties // ------------------------------------------------------------------------- this.popoverContentComponent = PopoverContentComponent; this.popoverOnHover = true; this.popoverDismissTimeout = 0; this.onShown = new EventEmitter(); this.onHidden = new EventEmitter(); } // ------------------------------------------------------------------------- // Event listeners // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Event listeners // ------------------------------------------------------------------------- /** * @param {?} evt * @return {?} */ PopoverDirective.prototype.showOrHideOnClick = // ------------------------------------------------------------------------- // Event listeners // ------------------------------------------------------------------------- /** * @param {?} evt * @return {?} */ function (evt) { if (this.popoverOnHover) { return; } if (this.popoverDisabled) { return; } evt.stopImmediatePropagation(); this.toggle(); }; /** * @param {?} evt * @return {?} */ PopoverDirective.prototype.showOrHideOnTouch = /** * @param {?} evt * @return {?} */ function (evt) { evt.stopImmediatePropagation(); if (!this.popoverOnHover) { return; } if (this.popoverDisabled) { return; } this.toggle(); }; /** * @return {?} */ PopoverDirective.prototype.showOnHover = /** * @return {?} */ function () { if (!this.popoverOnHover) { return; } if (this.popoverDisabled) { return; } this.show(); }; /** * @return {?} */ PopoverDirective.prototype.hideOnHover = /** * @return {?} */ function () { if (this.popoverCloseOnMouseOutside) { return; // don't do anything since we do not control this } if (!this.popoverOnHover) { return; } if (this.popoverDisabled) { return; } this.hide(); }; /** * @param {?} changes * @return {?} */ PopoverDirective.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes['popoverDisabled']) { if (changes['popoverDisabled'].currentValue) { this.hide(); } } }; /** * @protected * @param {?} component * @return {?} */ PopoverDirective.prototype.createComponent = /** * @protected * @param {?} component * @return {?} */ function (component) { /** @type {?} */ var factory = this.resolver.resolveComponentFactory(component); // Create a component reference from the component /** @type {?} */ var componentRef = this.appendToBody ? factory.create(this.injector) : this.viewContainerRef.createComponent(factory); if (this.appendToBody) { // Attach component to the appRef so that it's inside the ng component tree this.appRef.attachView(componentRef.hostView); // Get DOM element from component /** @type {?} */ var domElem = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))) .rootNodes[0])); // Append DOM element to the body document.body.appendChild(domElem); } return componentRef; }; /** * @protected * @param {?} componentRef * @return {?} */ PopoverDirective.prototype.removeComponent = /** * @protected * @param {?} componentRef * @return {?} */ function (componentRef) { if (this.popover) { if (this.appendToBody) { this.appRef.detachView(componentRef.hostView); } componentRef.destroy(); } }; // ------------------------------------------------------------------------- // Public Methods // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Public Methods // ------------------------------------------------------------------------- /** * @return {?} */ PopoverDirective.prototype.toggle = // ------------------------------------------------------------------------- // Public Methods // ------------------------------------------------------------------------- /** * @return {?} */ function () { if (!this.visible) { this.show(); } else { this.hide(); } }; /** * @return {?} */ PopoverDirective.prototype.show = /** * @return {?} */ function () { var _this = this; if (this.visible) { return; } this.visible = true; if (typeof this.content === 'string') { if (!this.visible) { return; } this.popover = this.createComponent(this.popoverContentComponent); /** @type {?} */ var popover = (/** @type {?} */ (this.popover.instance)); popover.popover = this; popover.content = (/** @type {?} */ (this.content)); if (this.popoverPlacement !== undefined) { popover.placement = this.popoverPlacement; } if (this.popoverAnimation !== undefined) { popover.animation = this.popoverAnimation; } if (this.popoverTitle !== undefined) { popover.title = this.popoverTitle; } if (this.popoverCloseOnClickOutside !== undefined) { popover.closeOnClickOutside = this.popoverCloseOnClickOutside; } if (this.popoverCloseOnMouseOutside !== undefined) { popover.closeOnMouseOutside = this.popoverCloseOnMouseOutside; } if (this.popoverSize) { popover.size = this.popoverSize; } popover.appendToBody = this.appendToBody; popover.onCloseFromOutside.subscribe((/** * @return {?} */ function () { return _this.hide(); })); // if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time if (this.popoverDismissTimeout > 0) { setTimeout((/** * @return {?} */ function () { return _this.hide(); }), this.popoverDismissTimeout); } } else { /** @type {?} */ var popover = (/** @type {?} */ (this.content)); popover.popover = this; if (this.popoverPlacement !== undefined) { popover.placement = this.popoverPlacement; } if (this.popoverAnimation !== undefined) { popover.animation = this.popoverAnimation; } if (this.popoverTitle !== undefined) { popover.title = this.popoverTitle; } if (this.popoverCloseOnClickOutside !== undefined) { popover.closeOnClickOutside = this.popoverCloseOnClickOutside; } if (this.popoverCloseOnMouseOutside !== undefined) { popover.closeOnMouseOutside = this.popoverCloseOnMouseOutside; } if (this.popoverSize) { popover.size = this.popoverSize; } popover.appendToBody = this.appendToBody; popover.onCloseFromOutside.subscribe((/** * @return {?} */ function () { return _this.hide(); })); // if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time if (this.popoverDismissTimeout > 0) { setTimeout((/** * @return {?} */ function () { return _this.hide(); }), this.popoverDismissTimeout); } popover.show(); } this.cdr.detectChanges(); this.onShown.emit(this); }; /** * @return {?} */ PopoverDirective.prototype.hide = /** * @return {?} */ function () { if (!this.visible) { return; } this.visible = false; this.removeComponent(this.popover); if (this.content instanceof PopoverContentComponent) { ((/** @type {?} */ (this.content))).hideFromPopover(); } this.cdr.detectChanges(); this.onHidden.emit(this); }; /** * @return {?} */ PopoverDirective.prototype.getElement = /** * @return {?} */ function () { return this.viewContainerRef.element.nativeElement; }; PopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[popover]', exportAs: 'popover' },] } ]; /** @nocollapse */ PopoverDirective.ctorParameters = function () { return [ { type: ViewContainerRef }, { type: ChangeDetectorRef }, { type: ComponentFactoryResolver }, { type: ApplicationRef }, { type: Injector } ]; }; PopoverDirective.propDecorators = { content: [{ type: Input, args: ['popover',] }], popoverSize: [{ type: Input }], popoverDisabled: [{ type: Input }], popoverAnimation: [{ type: Input }], popoverPlacement: [{ type: Input }], popoverTitle: [{ type: Input }], popoverOnHover: [{ type: Input }], popoverCloseOnClickOutside: [{ type: Input }], popoverCloseOnMouseOutside: [{ type: Input }], popoverDismissTimeout: [{ type: Input }], appendToBody: [{ type: Input }], onShown: [{ type: Output }], onHidden: [{ type: Output }], showOrHideOnClick: [{ type: HostListener, args: ['click', ['$event'],] }], showOrHideOnTouch: [{ type: HostListener, args: ['touchend', ['$event'],] }], showOnHover: [{ type: HostListener, args: ['focusin',] }, { type: HostListener, args: ['mouseenter',] }], hideOnHover: [{ type: HostListener, args: ['focusout',] }, { type: HostListener, args: ['mouseleave',] }] }; return PopoverDirective; }()); export { PopoverDirective }; if (false) { /** * @type {?} * @protected */ PopoverDirective.prototype.popoverContentComponent; /** * @type {?} * @protected */ PopoverDirective.prototype.popover; /** * @type {?} * @protected */ PopoverDirective.prototype.visible; /** @type {?} */ PopoverDirective.prototype.content; /** @type {?} */ PopoverDirective.prototype.popoverSize; /** @type {?} */ PopoverDirective.prototype.popoverDisabled; /** @type {?} */ PopoverDirective.prototype.popoverAnimation; /** @type {?} */ PopoverDirective.prototype.popoverPlacement; /** @type {?} */ PopoverDirective.prototype.popoverTitle; /** @type {?} */ PopoverDirective.prototype.popoverOnHover; /** @type {?} */ PopoverDirective.prototype.popoverCloseOnClickOutside; /** @type {?} */ PopoverDirective.prototype.popoverCloseOnMouseOutside; /** @type {?} */ PopoverDirective.prototype.popoverDismissTimeout; /** @type {?} */ PopoverDirective.prototype.appendToBody; /** @type {?} */ PopoverDirective.prototype.onShown; /** @type {?} */ PopoverDirective.prototype.onHidden; /** * @type {?} * @protected */ PopoverDirective.prototype.viewContainerRef; /** * @type {?} * @protected */ PopoverDirective.prototype.cdr; /** * @type {?} * @protected */ PopoverDirective.prototype.resolver; /** * @type {?} * @protected */ PopoverDirective.prototype.appRef; /** * @type {?} * @private */ PopoverDirective.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc21hcnQtcG9wb3Zlci8iLCJzb3VyY2VzIjpbImxpYi9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQU92RDtJQVlJLDRFQUE0RTtJQUM1RSxjQUFjO0lBQ2QsNEVBQTRFO0lBQzVFLDBCQUNjLGdCQUFrQyxFQUNsQyxHQUFzQixFQUN0QixRQUFrQyxFQUNsQyxNQUFzQixFQUN4QixRQUFrQjtRQUpoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7Ozs7UUFacEIsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUF3QjVDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBR3RCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUV6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDL0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBakI3RCxDQUFDO0lBbUJMLDRFQUE0RTtJQUM1RSxrQkFBa0I7SUFDbEIsNEVBQTRFOzs7Ozs7OztJQUVyRSw0Q0FBaUI7Ozs7Ozs7O0lBRHhCLFVBQ3lCLEdBQVU7UUFDL0IsSUFB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Qyx3Q0FBc0M7O0lBQ3RDLG1DQUFnRTs7SUFDaEUsb0NBQWlFOzs7OztJQXRCN0QsNENBQTRDOzs7OztJQUM1QywrQkFBZ0M7Ozs7O0lBQ2hDLG9DQUE0Qzs7Ozs7SUFDNUMsa0NBQWdDOzs7OztJQUNoQyxvQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgaXMgYSBjb250aW51YXRpb24gb2Ygbmd4LXBvcG92ZXJcbiAqIEBSZWZlcmVuY2Uge2dpdGh1Yn0gaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL25neC1wb3BvdmVyXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgVHlwZSxcbiAgICBFbWJlZGRlZFZpZXdSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi9wb3BvdmVyLnBsYWNlbWVudCc7XG5cblxuLyoqXG4qIEBncm91cCBCYXNpYyBUb29sa2l0XG4qIEBjb21wb25lbnQgUG9wb3ZlciBEaXJlY3RpdmVcbiovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twb3BvdmVyXScsXG4gICAgZXhwb3J0QXM6ICdwb3BvdmVyJ1xufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvcGVydGllc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRlbnRDb21wb25lbnQgPSBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb250ZW50Q29tcG9uZW50PjtcbiAgICBwcm90ZWN0ZWQgdmlzaWJsZTogYm9vbGVhbjtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7IH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnB1dHMgLyBPdXRwdXRzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEBJbnB1dCgncG9wb3ZlcicpIHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlclNpemU6ICdzbWFsbCcgfCAnbWVkaXVtLXNtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdhdXRvJztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckRpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQW5pbWF0aW9uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyUGxhY2VtZW50OiBQb3BvdmVyUGxhY2VtZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyVGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3Zlck9uSG92ZXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQ2xvc2VPbkNsaWNrT3V0c2lkZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHBvcG92ZXJEaXNtaXNzVGltZW91dCA9IDA7XG4gICAgQElucHV0KCkgcHVibGljIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2hvd24gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcG92ZXJEaXJlY3RpdmU+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9wb3ZlckRpcmVjdGl2ZT4oKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBzaG93T3JIaWRlT25DbGljayhldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgc2hvd09ySGlkZU9uVG91Y2goZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyT25Ib3Zlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gICAgcHVibGljIHNob3dPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck9uSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3coKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgcHVibGljIGhpZGVPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZyBzaW5jZSB3ZSBkbyBub3QgY29udHJvbCB0aGlzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3BvcG92ZXJEaXNhYmxlZCddKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlc1sncG9wb3ZlckRpc2FibGVkJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxhbnk+KTogQ29tcG9uZW50UmVmPGFueT4ge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvbmVudCByZWZlcmVuY2UgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuYXBwZW5kVG9Cb2R5XG4gICAgICAgICAgICA/IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpXG4gICAgICAgICAgICA6IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICAvLyBBdHRhY2ggY29tcG9uZW50IHRvIHRoZSBhcHBSZWYgc28gdGhhdCBpdCdzIGluc2lkZSB0aGUgbmcgY29tcG9uZW50IHRyZWVcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAgICAgLy8gR2V0IERPTSBlbGVtZW50IGZyb20gY29tcG9uZW50XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55PilcbiAgICAgICAgICAgICAgICAucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgRE9NIGVsZW1lbnQgdG8gdGhlIGJvZHlcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW1vdmVDb21wb25lbnQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pikge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucG9wb3ZlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMucG9wb3ZlckNvbnRlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlciA9IHRoaXMucG9wb3Zlci5pbnN0YW5jZSBhcyBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICAgICAgICAgIHBvcG92ZXIucG9wb3ZlciA9IHRoaXM7XG4gICAgICAgICAgICBwb3BvdmVyLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlclBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5wbGFjZW1lbnQgPSB0aGlzLnBvcG92ZXJQbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQW5pbWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmFuaW1hdGlvbiA9IHRoaXMucG9wb3ZlckFuaW1hdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci50aXRsZSA9IHRoaXMucG9wb3ZlclRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbkNsaWNrT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5jbG9zZU9uTW91c2VPdXRzaWRlID0gdGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5zaXplID0gdGhpcy5wb3BvdmVyU2l6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9wb3Zlci5hcHBlbmRUb0JvZHkgPSB0aGlzLmFwcGVuZFRvQm9keTtcblxuICAgICAgICAgICAgcG9wb3Zlci5vbkNsb3NlRnJvbU91dHNpZGUuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICAgICAgICAgIC8vIGlmIGRpc21pc3NUaW1lb3V0IG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhpcyBwb3BvdmVyIHdpbGwgYmUgZGlzbWlzc2VkIGluIGRpc21pc3NUaW1lb3V0IHRpbWVcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZSgpLCB0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3BvdmVyID0gdGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50O1xuICAgICAgICAgICAgcG9wb3Zlci5wb3BvdmVyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJQbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIucGxhY2VtZW50ID0gdGhpcy5wb3BvdmVyUGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5hbmltYXRpb24gPSB0aGlzLnBvcG92ZXJBbmltYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIudGl0bGUgPSB0aGlzLnBvcG92ZXJUaXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmNsb3NlT25DbGlja091dHNpZGUgPSB0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbk1vdXNlT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuc2l6ZSA9IHRoaXMucG9wb3ZlclNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcG92ZXIuYXBwZW5kVG9Cb2R5ID0gdGhpcy5hcHBlbmRUb0JvZHk7XG5cbiAgICAgICAgICAgIHBvcG92ZXIub25DbG9zZUZyb21PdXRzaWRlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XG4gICAgICAgICAgICAvLyBpZiBkaXNtaXNzVGltZW91dCBvcHRpb24gaXMgc2V0LCB0aGVuIHRoaXMgcG9wb3ZlciB3aWxsIGJlIGRpc21pc3NlZCBpbiBkaXNtaXNzVGltZW91dCB0aW1lXG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGUoKSwgdGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wb3Zlci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMub25TaG93bi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KHRoaXMucG9wb3Zlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudCBpbnN0YW5jZW9mIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAodGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KS5oaWRlRnJvbVBvcG92ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5vbkhpZGRlbi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuIl19