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
374 lines • 32.5 kB
JavaScript
/**
* @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
*/
export class PopoverDirective {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
/**
* @param {?} viewContainerRef
* @param {?} cdr
* @param {?} resolver
* @param {?} appRef
* @param {?} injector
*/
constructor(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
// -------------------------------------------------------------------------
/**
* @param {?} evt
* @return {?}
*/
showOrHideOnClick(evt) {
if (this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
evt.stopImmediatePropagation();
this.toggle();
}
/**
* @param {?} evt
* @return {?}
*/
showOrHideOnTouch(evt) {
evt.stopImmediatePropagation();
if (!this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
this.toggle();
}
/**
* @return {?}
*/
showOnHover() {
if (!this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
this.show();
}
/**
* @return {?}
*/
hideOnHover() {
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 {?}
*/
ngOnChanges(changes) {
if (changes['popoverDisabled']) {
if (changes['popoverDisabled'].currentValue) {
this.hide();
}
}
}
/**
* @protected
* @param {?} component
* @return {?}
*/
createComponent(component) {
/** @type {?} */
const factory = this.resolver.resolveComponentFactory(component);
// Create a component reference from the component
/** @type {?} */
const 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 {?} */
const domElem = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView)))
.rootNodes[0]));
// Append DOM element to the body
document.body.appendChild(domElem);
}
return componentRef;
}
/**
* @protected
* @param {?} componentRef
* @return {?}
*/
removeComponent(componentRef) {
if (this.popover) {
if (this.appendToBody) {
this.appRef.detachView(componentRef.hostView);
}
componentRef.destroy();
}
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* @return {?}
*/
toggle() {
if (!this.visible) {
this.show();
}
else {
this.hide();
}
}
/**
* @return {?}
*/
show() {
if (this.visible) {
return;
}
this.visible = true;
if (typeof this.content === 'string') {
if (!this.visible) {
return;
}
this.popover = this.createComponent(this.popoverContentComponent);
/** @type {?} */
const 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 {?}
*/
() => this.hide()));
// if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time
if (this.popoverDismissTimeout > 0) {
setTimeout((/**
* @return {?}
*/
() => this.hide()), this.popoverDismissTimeout);
}
}
else {
/** @type {?} */
const 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 {?}
*/
() => this.hide()));
// if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time
if (this.popoverDismissTimeout > 0) {
setTimeout((/**
* @return {?}
*/
() => this.hide()), this.popoverDismissTimeout);
}
popover.show();
}
this.cdr.detectChanges();
this.onShown.emit(this);
}
/**
* @return {?}
*/
hide() {
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 {?}
*/
getElement() {
return this.viewContainerRef.element.nativeElement;
}
}
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[popover]',
exportAs: 'popover'
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc21hcnQtcG9wb3Zlci8iLCJzb3VyY2VzIjpbImxpYi9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQVd2RCxNQUFNLE9BQU8sZ0JBQWdCOzs7Ozs7Ozs7OztJQVd6QixZQUNjLGdCQUFrQyxFQUNsQyxHQUFzQixFQUN0QixRQUFrQyxFQUNsQyxNQUFzQixFQUN4QixRQUFrQjtRQUpoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7Ozs7UUFacEIsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUF3QjVDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBR3RCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUV6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDL0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBakI3RCxDQUFDOzs7Ozs7OztJQXVCRSxpQkFBaUIsQ0FBQyxHQUFVO1FBQy9CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFl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VztnQkFDckIsUUFBUSxFQUFFLFNBQVM7YUFDdEI7Ozs7WUFqQkcsZ0JBQWdCO1lBVmhCLGlCQUFpQjtZQUNqQix3QkFBd0I7WUFVeEIsY0FBYztZQUNkLFFBQVE7OztzQkFzQ1AsS0FBSyxTQUFDLFNBQVM7MEJBQ2YsS0FBSzs4QkFDTCxLQUFLOytCQUNMLEtBQUs7K0JBQ0wsS0FBSzsyQkFDTCxLQUFLOzZCQUNMLEtBQUs7eUNBQ0wsS0FBSzt5Q0FDTCxLQUFLO29DQUNMLEtBQUs7MkJBQ0wsS0FBSztzQkFDTCxNQUFNO3VCQUNOLE1BQU07Z0NBS04sWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQ0FZaEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFZbkMsWUFBWSxTQUFDLFNBQVMsY0FDdEIsWUFBWSxTQUFDLFlBQVk7MEJBV3pCLFlBQVksU0FBQyxVQUFVLGNBQ3ZCLFlBQVksU0FBQyxZQUFZOzs7Ozs7O0lBeEUxQixtREFBNEQ7Ozs7O0lBQzVELG1DQUF5RDs7Ozs7SUFDekQsbUNBQTJCOztJQWdCM0IsbUNBQW1FOztJQUNuRSx1Q0FBb0Y7O0lBQ3BGLDJDQUF5Qzs7SUFDekMsNENBQTBDOztJQUMxQyw0Q0FBbUQ7O0lBQ25ELHdDQUFxQzs7SUFDckMsMENBQXNDOztJQUN0QyxzREFBb0Q7O0lBQ3BELHNEQUFvRDs7SUFDcEQsaURBQTBDOztJQUMxQyx3Q0FBc0M7O0lBQ3RDLG1DQUFnRTs7SUFDaEUsb0NBQWlFOzs7OztJQXRCN0QsNENBQTRDOzs7OztJQUM1QywrQkFBZ0M7Ozs7O0lBQ2hDLG9DQUE0Qzs7Ozs7SUFDNUMsa0NBQWdDOzs7OztJQUNoQyxvQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgaXMgYSBjb250aW51YXRpb24gb2Ygbmd4LXBvcG92ZXJcbiAqIEBSZWZlcmVuY2Uge2dpdGh1Yn0gaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL25neC1wb3BvdmVyXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgVHlwZSxcbiAgICBFbWJlZGRlZFZpZXdSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi9wb3BvdmVyLnBsYWNlbWVudCc7XG5cblxuLyoqXG4qIEBncm91cCBCYXNpYyBUb29sa2l0XG4qIEBjb21wb25lbnQgUG9wb3ZlciBEaXJlY3RpdmVcbiovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twb3BvdmVyXScsXG4gICAgZXhwb3J0QXM6ICdwb3BvdmVyJ1xufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvcGVydGllc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRlbnRDb21wb25lbnQgPSBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb250ZW50Q29tcG9uZW50PjtcbiAgICBwcm90ZWN0ZWQgdmlzaWJsZTogYm9vbGVhbjtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7IH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnB1dHMgLyBPdXRwdXRzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEBJbnB1dCgncG9wb3ZlcicpIHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlclNpemU6ICdzbWFsbCcgfCAnbWVkaXVtLXNtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdhdXRvJztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckRpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQW5pbWF0aW9uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyUGxhY2VtZW50OiBQb3BvdmVyUGxhY2VtZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyVGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3Zlck9uSG92ZXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQ2xvc2VPbkNsaWNrT3V0c2lkZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHBvcG92ZXJEaXNtaXNzVGltZW91dCA9IDA7XG4gICAgQElucHV0KCkgcHVibGljIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2hvd24gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcG92ZXJEaXJlY3RpdmU+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9wb3ZlckRpcmVjdGl2ZT4oKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBzaG93T3JIaWRlT25DbGljayhldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgc2hvd09ySGlkZU9uVG91Y2goZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyT25Ib3Zlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gICAgcHVibGljIHNob3dPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck9uSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3coKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgcHVibGljIGhpZGVPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZyBzaW5jZSB3ZSBkbyBub3QgY29udHJvbCB0aGlzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3BvcG92ZXJEaXNhYmxlZCddKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlc1sncG9wb3ZlckRpc2FibGVkJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxhbnk+KTogQ29tcG9uZW50UmVmPGFueT4ge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvbmVudCByZWZlcmVuY2UgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuYXBwZW5kVG9Cb2R5XG4gICAgICAgICAgICA/IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpXG4gICAgICAgICAgICA6IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICAvLyBBdHRhY2ggY29tcG9uZW50IHRvIHRoZSBhcHBSZWYgc28gdGhhdCBpdCdzIGluc2lkZSB0aGUgbmcgY29tcG9uZW50IHRyZWVcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAgICAgLy8gR2V0IERPTSBlbGVtZW50IGZyb20gY29tcG9uZW50XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55PilcbiAgICAgICAgICAgICAgICAucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgRE9NIGVsZW1lbnQgdG8gdGhlIGJvZHlcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW1vdmVDb21wb25lbnQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pikge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucG9wb3ZlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMucG9wb3ZlckNvbnRlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlciA9IHRoaXMucG9wb3Zlci5pbnN0YW5jZSBhcyBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICAgICAgICAgIHBvcG92ZXIucG9wb3ZlciA9IHRoaXM7XG4gICAgICAgICAgICBwb3BvdmVyLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlclBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5wbGFjZW1lbnQgPSB0aGlzLnBvcG92ZXJQbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQW5pbWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmFuaW1hdGlvbiA9IHRoaXMucG9wb3ZlckFuaW1hdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci50aXRsZSA9IHRoaXMucG9wb3ZlclRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbkNsaWNrT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5jbG9zZU9uTW91c2VPdXRzaWRlID0gdGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5zaXplID0gdGhpcy5wb3BvdmVyU2l6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9wb3Zlci5hcHBlbmRUb0JvZHkgPSB0aGlzLmFwcGVuZFRvQm9keTtcblxuICAgICAgICAgICAgcG9wb3Zlci5vbkNsb3NlRnJvbU91dHNpZGUuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICAgICAgICAgIC8vIGlmIGRpc21pc3NUaW1lb3V0IG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhpcyBwb3BvdmVyIHdpbGwgYmUgZGlzbWlzc2VkIGluIGRpc21pc3NUaW1lb3V0IHRpbWVcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZSgpLCB0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3BvdmVyID0gdGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50O1xuICAgICAgICAgICAgcG9wb3Zlci5wb3BvdmVyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJQbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIucGxhY2VtZW50ID0gdGhpcy5wb3BvdmVyUGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5hbmltYXRpb24gPSB0aGlzLnBvcG92ZXJBbmltYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIudGl0bGUgPSB0aGlzLnBvcG92ZXJUaXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmNsb3NlT25DbGlja091dHNpZGUgPSB0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbk1vdXNlT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuc2l6ZSA9IHRoaXMucG9wb3ZlclNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcG92ZXIuYXBwZW5kVG9Cb2R5ID0gdGhpcy5hcHBlbmRUb0JvZHk7XG5cbiAgICAgICAgICAgIHBvcG92ZXIub25DbG9zZUZyb21PdXRzaWRlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XG4gICAgICAgICAgICAvLyBpZiBkaXNtaXNzVGltZW91dCBvcHRpb24gaXMgc2V0LCB0aGVuIHRoaXMgcG9wb3ZlciB3aWxsIGJlIGRpc21pc3NlZCBpbiBkaXNtaXNzVGltZW91dCB0aW1lXG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGUoKSwgdGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wb3Zlci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMub25TaG93bi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KHRoaXMucG9wb3Zlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudCBpbnN0YW5jZW9mIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAodGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KS5oaWRlRnJvbVBvcG92ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5vbkhpZGRlbi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuIl19