@hxui/angular
Version:
* * *
327 lines • 32.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Directive, HostListener, ViewContainerRef, Input, HostBinding, ElementRef, NgZone, ComponentFactoryResolver, Optional } from '@angular/core';
import { TooltipContentComponent } from './tooltip-content.component';
import { TooltipConfig } from './tooltip.config';
import { Context } from '../enums';
import { ComponentPortal } from '@angular/cdk/portal';
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
import { Directionality } from '@angular/cdk/bidi';
import { takeUntil, take } from 'rxjs/operators';
import { Subject } from 'rxjs';
export class TooltipDirective {
/**
* @param {?} _elementRef
* @param {?} _viewContainerRef
* @param {?} overlay
* @param {?} _ngZone
* @param {?} _scrollDispatcher
* @param {?} _componentFactoryResolver
* @param {?} _config
* @param {?} _dir
*/
constructor(_elementRef, _viewContainerRef, overlay, _ngZone, _scrollDispatcher, _componentFactoryResolver, _config, _dir) {
this._elementRef = _elementRef;
this._viewContainerRef = _viewContainerRef;
this.overlay = overlay;
this._ngZone = _ngZone;
this._scrollDispatcher = _scrollDispatcher;
this._componentFactoryResolver = _componentFactoryResolver;
this._config = _config;
this._dir = _dir;
this._destroyed = new Subject();
this.position = 'relative';
this.placement = 'bottom';
this.showDelay = this._config.showDelay;
this.hideDelay = this._config.hideDelay;
this.context = Context.None;
this.maxWidth = 200;
Object.assign(this, _config);
}
/**
* @return {?}
*/
show() {
this._show();
}
/**
* @return {?}
*/
hide() {
this._hide();
}
/**
* Dispose the tooltip when destroyed.
* @return {?}
*/
ngOnDestroy() {
if (this._overlayRef) {
this._overlayRef.dispose();
this._tooltipInstance = null;
}
this._destroyed.next();
this._destroyed.complete();
}
/**
* @param {?=} delay
* @return {?}
*/
_show(delay = this.showDelay) {
if (this.disabled || !this.content) {
return;
}
/** @type {?} */
const overlayRef = this._createOverlay();
this._detach();
this._portal = this._portal || new ComponentPortal(TooltipContentComponent, this._viewContainerRef);
this._tooltipInstance = overlayRef.attach(this._portal).instance;
this._tooltipInstance.afterHidden()
.pipe(takeUntil(this._destroyed))
.subscribe(() => this._detach());
this._updateTooltipContent();
(/** @type {?} */ (this._tooltipInstance)).show(delay);
}
/**
* @param {?=} delay
* @return {?}
*/
_hide(delay = this.hideDelay) {
if (this._tooltipInstance) {
this._tooltipInstance.hide(delay);
}
}
/**
* @return {?}
*/
_createOverlay() {
if (this._overlayRef) {
return this._overlayRef;
}
/** @type {?} */
const positionStrategy = this.overlay.position()
.flexibleConnectedTo(this._elementRef)
.withTransformOriginOn('.hx-tooltip')
.withFlexibleDimensions(false);
this._overlayRef = this.overlay.create({
positionStrategy: positionStrategy,
panelClass: 'hxa-tooltip-panel',
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
this._updatePosition();
this._overlayRef.detachments()
.pipe(takeUntil(this._destroyed))
.subscribe(() => this._detach());
/** @type {?} */
const position = (/** @type {?} */ (this._overlayRef.getConfig().positionStrategy));
position.positionChanges
.pipe(takeUntil(this._destroyed))
.subscribe((pos) => {
if (pos.connectionPair.originX === 'start') {
this.placement = 'left';
}
else if (pos.connectionPair.originX === 'end') {
this.placement = 'right';
}
this._updateTooltipContent();
});
return this._overlayRef;
}
/**
* @return {?}
*/
_updatePosition() {
/** @type {?} */
const position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig().positionStrategy));
/** @type {?} */
const origin = this._getOrigin();
/** @type {?} */
const overlay = this._getOverlayPosition();
position.withPositions([
Object.assign({}, origin.main, overlay.main),
Object.assign({}, origin.fallback, overlay.fallback)
]);
}
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
_getOrigin() {
/** @type {?} */
const placement = this.placement;
/** @type {?} */
let originPlacement;
if (placement === 'top' || placement === 'bottom') {
originPlacement = { originX: 'center', originY: placement === 'top' ? 'top' : 'bottom' };
}
else if (placement === 'left') {
originPlacement = { originX: 'start', originY: 'center' };
}
else if (placement === 'right') {
originPlacement = { originX: 'end', originY: 'center' };
}
else {
console.error('Position error', placement);
}
const { x, y } = this._invertPosition(originPlacement.originX, originPlacement.originY);
return {
main: originPlacement,
fallback: { originX: x, originY: y }
};
}
/**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
_getOverlayPosition() {
/** @type {?} */
const placement = this.placement;
/** @type {?} */
let overlayPlacement;
if (placement === 'top') {
overlayPlacement = { overlayX: 'center', overlayY: 'bottom' };
}
else if (placement === 'bottom') {
overlayPlacement = { overlayX: 'center', overlayY: 'top' };
}
else if (placement === 'left') {
overlayPlacement = { overlayX: 'end', overlayY: 'center' };
}
else if (placement === 'right') {
overlayPlacement = { overlayX: 'start', overlayY: 'center' };
}
else {
console.error('Could not find a position', placement);
}
const { x, y } = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY);
return {
main: overlayPlacement,
fallback: { overlayX: x, overlayY: y }
};
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
_invertPosition(x, y) {
if (this.position === 'top' || this.position === 'bottom') {
if (y === 'top') {
y = 'bottom';
}
else if (y === 'bottom') {
y = 'top';
}
}
else {
if (x === 'end') {
x = 'start';
}
else if (x === 'start') {
x = 'end';
}
}
return { x, y };
}
/**
* @return {?}
*/
_detach() {
if (this._overlayRef && this._overlayRef.hasAttached()) {
this._overlayRef.detach();
}
this._tooltipInstance = null;
}
/**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
_updateTooltipContent() {
// Must wait for the content to be painted to the tooltip so that the overlay can properly
// calculate the correct positioning based on the size of its contents.
if (this._tooltipInstance) {
this._tooltipInstance.content = this.content;
this._tooltipInstance.placement = this.placement;
this._tooltipInstance.context = this.context;
this._tooltipInstance.maxWidth = this.maxWidth;
this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1), takeUntil(this._destroyed)).subscribe(() => {
if (this._tooltipInstance) {
(/** @type {?} */ (this._overlayRef)).updatePosition();
}
});
}
}
}
TooltipDirective.decorators = [
{ type: Directive, args: [{
selector: '[hxTooltip], [hxaTooltip]'
},] },
];
/** @nocollapse */
TooltipDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Overlay },
{ type: NgZone },
{ type: ScrollDispatcher },
{ type: ComponentFactoryResolver },
{ type: TooltipConfig },
{ type: Directionality, decorators: [{ type: Optional }] }
];
TooltipDirective.propDecorators = {
position: [{ type: HostBinding, args: ['style.position',] }],
content: [{ type: Input, args: ['hxTooltip',] }],
disabled: [{ type: Input }],
placement: [{ type: Input }],
showDelay: [{ type: Input }],
hideDelay: [{ type: Input }],
context: [{ type: Input }],
maxWidth: [{ type: Input }],
show: [{ type: HostListener, args: ['focusin',] }, { type: HostListener, args: ['mouseenter',] }],
hide: [{ type: HostListener, args: ['focusout',] }, { type: HostListener, args: ['mouseleave',] }]
};
if (false) {
/** @type {?} */
TooltipDirective.prototype._overlayRef;
/** @type {?} */
TooltipDirective.prototype._tooltipInstance;
/** @type {?} */
TooltipDirective.prototype._portal;
/** @type {?} */
TooltipDirective.prototype._destroyed;
/** @type {?} */
TooltipDirective.prototype.position;
/** @type {?} */
TooltipDirective.prototype.content;
/** @type {?} */
TooltipDirective.prototype.disabled;
/** @type {?} */
TooltipDirective.prototype.placement;
/** @type {?} */
TooltipDirective.prototype.showDelay;
/** @type {?} */
TooltipDirective.prototype.hideDelay;
/** @type {?} */
TooltipDirective.prototype.context;
/** @type {?} */
TooltipDirective.prototype.maxWidth;
/** @type {?} */
TooltipDirective.prototype._elementRef;
/** @type {?} */
TooltipDirective.prototype._viewContainerRef;
/** @type {?} */
TooltipDirective.prototype.overlay;
/** @type {?} */
TooltipDirective.prototype._ngZone;
/** @type {?} */
TooltipDirective.prototype._scrollDispatcher;
/** @type {?} */
TooltipDirective.prototype._componentFactoryResolver;
/** @type {?} */
TooltipDirective.prototype._config;
/** @type {?} */
TooltipDirective.prototype._dir;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsV0FBVyxFQUFFLFVBQVUsRUFDWixNQUFNLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUN0RCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUlMLE9BQU8sRUFHUCxnQkFBZ0IsRUFFTSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFLN0IsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7Ozs7Ozs7SUE0QzNCLFlBQ1UsV0FBdUIsRUFDdkIsaUJBQW1DLEVBQ3BDLE9BQWdCLEVBQ2YsT0FBZSxFQUNmLGlCQUFtQyxFQUNuQyx5QkFBbUQsRUFDbkQsT0FBc0IsRUFDVixJQUFvQjtRQVBoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2Ysc0JBQWlCLEdB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bUJBQUEsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUNwQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs7WUFuUEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwyQkFBMkI7YUFDdEM7Ozs7WUF2QmMsVUFBVTtZQUZ2QixnQkFBZ0I7WUFhaEIsT0FBTztZQVZJLE1BQU07WUFhakIsZ0JBQWdCO1lBYkcsd0JBQXdCO1lBR3BDLGFBQWE7WUFhZCxjQUFjLHVCQTJEakIsUUFBUTs7O3VCQTVDVixXQUFXLFNBQUMsZ0JBQWdCO3NCQUc1QixLQUFLLFNBQUMsV0FBVzt1QkFHakIsS0FBSzt3QkFHTCxLQUFLO3dCQUdMLEtBQUs7d0JBR0wsS0FBSztzQkFHTCxLQUFLO3VCQUdMLEtBQUs7bUJBR0wsWUFBWSxTQUFDLFNBQVMsY0FDdEIsWUFBWSxTQUFDLFlBQVk7bUJBS3pCLFlBQVksU0FBQyxVQUFVLGNBQ3ZCLFlBQVksU0FBQyxZQUFZOzs7O0lBckMxQix1Q0FBK0I7O0lBQy9CLDRDQUFpRDs7SUFFakQsbUNBQTBEOztJQUMxRCxzQ0FBNEM7O0lBRTVDLG9DQUNzQjs7SUFFdEIsbUNBQ2dCOztJQUVoQixvQ0FDa0I7O0lBRWxCLHFDQUMwRDs7SUFFMUQscUNBQ21DOztJQUVuQyxxQ0FDbUM7O0lBRW5DLG1DQUNnQzs7SUFFaEMsb0NBQ3VCOztJQWVyQix1Q0FBK0I7O0lBQy9CLDZDQUEyQzs7SUFDM0MsbUNBQXVCOztJQUN2QixtQ0FBdUI7O0lBQ3ZCLDZDQUEyQzs7SUFDM0MscURBQTJEOztJQUMzRCxtQ0FBOEI7O0lBQzlCLGdDQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIElucHV0LFxyXG4gIEhvc3RCaW5kaW5nLCBFbGVtZW50UmVmLFxyXG4gIE9uRGVzdHJveSwgTmdab25lLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIE9wdGlvbmFsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi90b29sdGlwLWNvbnRlbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVG9vbHRpcENvbmZpZyB9IGZyb20gJy4vdG9vbHRpcC5jb25maWcnO1xyXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHtcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXHJcbiAgT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uLFxyXG4gIE92ZXJsYXksXHJcbiAgT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbixcclxuICBPdmVybGF5UmVmLFxyXG4gIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgVmVydGljYWxDb25uZWN0aW9uUG9zfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcclxuaW1wb3J0IHt0YWtlVW50aWwsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2h4VG9vbHRpcF0sIFtoeGFUb29sdGlwXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGw7XHJcbiAgX3Rvb2x0aXBJbnN0YW5jZTogVG9vbHRpcENvbnRlbnRDb21wb25lbnQgfCBudWxsO1xyXG5cclxuICBwcml2YXRlIF9wb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUb29sdGlwQ29udGVudENvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5wb3NpdGlvbicpXHJcbiAgcG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG5cclxuICBASW5wdXQoJ2h4VG9vbHRpcCcpXHJcbiAgY29udGVudDogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCcgPSAnYm90dG9tJztcclxuXHJcbiAgQElucHV0KClcclxuICBzaG93RGVsYXkgPSB0aGlzLl9jb25maWcuc2hvd0RlbGF5O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhpZGVEZWxheSA9IHRoaXMuX2NvbmZpZy5oaWRlRGVsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29udGV4dDogQ29udGV4dCA9IENvbnRleHQuTm9uZTtcclxuXHJcbiAgQElucHV0KClcclxuICBtYXhXaWR0aDogbnVtYmVyID0gMjAwO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1c2luJylcclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5fc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNvdXQnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxyXG4gIGhpZGUoKSB7XHJcbiAgIHRoaXMuX2hpZGUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBfc2Nyb2xsRGlzcGF0Y2hlcjogU2Nyb2xsRGlzcGF0Y2hlcixcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBUb29sdGlwQ29uZmlnLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGlyOiBEaXJlY3Rpb25hbGl0eSxcclxuICApIHtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgX2NvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwb3NlIHRoZSB0b29sdGlwIHdoZW4gZGVzdHJveWVkLlxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2hvdyhkZWxheTogbnVtYmVyID0gdGhpcy5zaG93RGVsYXkpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5jb250ZW50KSB7IHJldHVybjsgfVxyXG5cclxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KCk7XHJcblxyXG4gICAgdGhpcy5fZGV0YWNoKCk7XHJcbiAgICB0aGlzLl9wb3J0YWwgPSB0aGlzLl9wb3J0YWwgfHwgbmV3IENvbXBvbmVudFBvcnRhbChUb29sdGlwQ29udGVudENvbXBvbmVudCwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7XHJcbiAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UgPSBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLl9wb3J0YWwpLmluc3RhbmNlO1xyXG4gICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmFmdGVySGlkZGVuKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZGV0YWNoKCkpO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZVRvb2x0aXBDb250ZW50KCk7XHJcbiAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UhLnNob3coZGVsYXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGlkZShkZWxheTogbnVtYmVyID0gdGhpcy5oaWRlRGVsYXkpIHtcclxuICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmhpZGUoZGVsYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheSgpOiBPdmVybGF5UmVmIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkucG9zaXRpb24oKVxyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbGVtZW50UmVmKVxyXG4gICAgICAud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCcuaHgtdG9vbHRpcCcpXHJcbiAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdoeGEtdG9vbHRpcC1wYW5lbCcsXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKClcclxuICAgIH0pO1xyXG5cclxuICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNobWVudHMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9kZXRhY2goKSk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xyXG4gICAgcG9zaXRpb24ucG9zaXRpb25DaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChwb3MpID0+IHtcclxuICAgICAgICBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblggPT09ICdzdGFydCcpIHtcclxuICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ2xlZnQnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblggPT09ICdlbmQnKSB7XHJcbiAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9ICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZVRvb2x0aXBDb250ZW50KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPVxyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmIS5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbigpO1xyXG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbigpO1xyXG5cclxuICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnMoW1xyXG4gICAgICB7Li4ub3JpZ2luLm1haW4sIC4uLm92ZXJsYXkubWFpbn0sXHJcbiAgICAgIHsuLi5vcmlnaW4uZmFsbGJhY2ssIC4uLm92ZXJsYXkuZmFsbGJhY2t9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbiBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHBvc2l0aW9uIHByZWZlcmVuY2UuXHJcbiAgICogVGhlIGZhbGxiYWNrIHBvc2l0aW9uIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvcmlnaW4gKGUuZy4gYCdib3R0b20nIC0+ICd0b3AnYCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3JpZ2luKCk6IHttYWluOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24sIGZhbGxiYWNrOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb259IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG9yaWdpblBsYWNlbWVudDogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiBwbGFjZW1lbnQgPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICBvcmlnaW5QbGFjZW1lbnQgPSB7b3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc2l0aW9uIGVycm9yJywgcGxhY2VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihvcmlnaW5QbGFjZW1lbnQub3JpZ2luWCwgb3JpZ2luUGxhY2VtZW50Lm9yaWdpblkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1haW46IG9yaWdpblBsYWNlbWVudCxcclxuICAgICAgZmFsbGJhY2s6IHtvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRoZSBvdmVybGF5IHBvc2l0aW9uIGFuZCBhIGZhbGxiYWNrIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSAqL1xyXG4gIHByaXZhdGUgX2dldE92ZXJsYXlQb3NpdGlvbigpOiB7bWFpbjogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbiwgZmFsbGJhY2s6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb259IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG92ZXJsYXlQbGFjZW1lbnQ6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XHJcblxyXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAnYm90dG9tJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQgPSB7b3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcid9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGEgcG9zaXRpb24nLCBwbGFjZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVgsIG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1haW46IG92ZXJsYXlQbGFjZW1lbnQsXHJcbiAgICAgIGZhbGxiYWNrOiB7b3ZlcmxheVg6IHgsIG92ZXJsYXlZOiB5fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIF9pbnZlcnRQb3NpdGlvbih4OiBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgeTogVmVydGljYWxDb25uZWN0aW9uUG9zKSB7XHJcbiAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgaWYgKHkgPT09ICd0b3AnKSB7XHJcbiAgICAgICAgeSA9ICdib3R0b20nO1xyXG4gICAgICB9IGVsc2UgaWYgKHkgPT09ICdib3R0b20nKSB7XHJcbiAgICAgICAgeSA9ICd0b3AnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoeCA9PT0gJ2VuZCcpIHtcclxuICAgICAgICB4ID0gJ3N0YXJ0JztcclxuICAgICAgfSBlbHNlIGlmICh4ID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgeCA9ICdlbmQnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHt4LCB5fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RldGFjaCgpIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmICYmIHRoaXMuX292ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGVzIHRoZSB0b29sdGlwIGNvbnRlbnQgYW5kIHJlcG9zaXRpb25zIHRoZSBvdmVybGF5IGFjY29yZGluZyB0byB0aGUgbmV3IGNvbnRlbnQgbGVuZ3RoICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlVG9vbHRpcENvbnRlbnQoKSB7XHJcbiAgICAvLyBNdXN0IHdhaXQgZm9yIHRoZSBjb250ZW50IHRvIGJlIHBhaW50ZWQgdG8gdGhlIHRvb2x0aXAgc28gdGhhdCB0aGUgb3ZlcmxheSBjYW4gcHJvcGVybHlcclxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBwb3NpdGlvbmluZyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiBpdHMgY29udGVudHMuXHJcbiAgICBpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLnBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5tYXhXaWR0aCA9IHRoaXMubWF4V2lkdGg7XHJcblxyXG5cclxuICAgICAgdGhpcy5fbmdab25lLm9uTWljcm90YXNrRW1wdHkuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpXHJcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmIS51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==