@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
167 lines • 23 kB
JavaScript
import { ComponentPortal } from '@angular/cdk/portal';
import { DOCUMENT } from '@angular/common';
import { Directive, HostListener, Inject, Input } from '@angular/core';
import { fromEvent, merge, Subject, takeUntil } from 'rxjs';
import { TooltipComponent } from '../tooltip.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
export class TooltipDirective {
set tooltipOptions(value) {
this._tooltipOptions = value;
this.setTooltipValues();
const scrollableAncestors = this.scrollDispatcher.getAncestorScrollContainers(this.el);
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(this.el)
.withPositions([this.getPositionOptions()])
.withScrollableContainers(scrollableAncestors);
this.overlayRef?.updatePositionStrategy(positionStrategy);
}
get tooltipOptions() {
return this._tooltipOptions;
}
constructor(el, overlayPositionBuilder, overlay, scrollDispatcher, doc, zone) {
this.el = el;
this.overlayPositionBuilder = overlayPositionBuilder;
this.overlay = overlay;
this.scrollDispatcher = scrollDispatcher;
this.doc = doc;
this.zone = zone;
this.unsubscribe = new Subject();
}
ngOnInit() {
const scrollableAncestors = this.scrollDispatcher.getAncestorScrollContainers(this.el);
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(this.el)
.withPositions([this.getPositionOptions()])
.withScrollableContainers(scrollableAncestors);
this.overlayRef = this.overlay.create({
positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
}
ngOnDestroy() {
this.overlayRef?.dispose();
this.unsubscribe.next();
this.unsubscribe.complete();
}
getPositionOptions() {
const defaultPosition = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom'
};
switch (this.tooltipOptions?.placement) {
case 'bottom':
return {
originX: 'center',
originY: 'bottom',
overlayX: 'center',
overlayY: 'top'
};
case 'top':
return defaultPosition;
case 'left':
return {
originX: 'start',
originY: 'center',
overlayX: 'end',
overlayY: 'center'
};
case 'right':
return {
originX: 'end',
originY: 'center',
overlayX: 'start',
overlayY: 'center'
};
default:
return defaultPosition;
}
}
show() {
if (this.tooltipRef) {
return;
}
this.tooltipRef = this.overlayRef.attach(new ComponentPortal(TooltipComponent));
merge(fromEvent(this.tooltipRef?.location?.nativeElement, 'mouseleave'), fromEvent(this.tooltipRef?.location?.nativeElement, 'focusout'))
.pipe(takeUntil(this.unsubscribe))
.subscribe((event) => {
this.hide(event);
});
this.zone.runOutsideAngular(() => {
this.intersectionObserver = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
const isElementVisible = entry.isIntersecting;
if (!isElementVisible) {
this.zone.run(() => {
this.hide();
});
}
});
});
this.intersectionObserver.observe(this.el?.nativeElement);
});
this.setTooltipValues();
this.el?.nativeElement?.firstElementChild?.setAttribute('aria-describedby', this.tooltipOptions.tooltipId);
}
hide(event) {
const focusedElement = this.doc?.activeElement;
const isFocusedElement = focusedElement && this.el.nativeElement.contains(focusedElement);
const newTarget = event?.relatedTarget;
const isNextTargetTooltip = newTarget && this.overlayRef?.overlayElement?.contains(newTarget);
const isNextTargetElement = newTarget && this.el?.nativeElement?.contains(newTarget);
if (!newTarget || (!isNextTargetTooltip && !isNextTargetElement && !isFocusedElement)) {
this.overlayRef.detach();
this.tooltipRef = null;
this.unsubscribe.next();
this.intersectionObserver.disconnect();
this.el?.nativeElement?.firstElementChild?.removeAttribute('aria-describedby');
}
}
setTooltipValues() {
const tooltipComponent = this.tooltipRef?.instance;
if (!tooltipComponent) {
return;
}
tooltipComponent.label = this.tooltipCustomContent ? null : this.tooltipOptions?.label;
tooltipComponent.isInverse = this.tooltipOptions?.isInverse;
tooltipComponent.hasArrow = this.tooltipOptions?.hasArrow ?? true;
tooltipComponent.tooltipId = this.tooltipOptions?.tooltipId;
tooltipComponent.arrowPlacement = this.tooltipOptions?.arrowPlacement ?? 'center';
tooltipComponent.placement = this.tooltipOptions?.placement ?? 'top';
tooltipComponent.isStandalone = this.tooltipOptions?.isStandalone ?? true;
tooltipComponent.isAnimated = this.tooltipOptions?.isAnimated ?? true;
tooltipComponent.contentTemplateRef = this.tooltipCustomContent;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.ElementRef }, { token: i1.OverlayPositionBuilder }, { token: i1.Overlay }, { token: i1.ScrollDispatcher }, { token: DOCUMENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TooltipDirective, isStandalone: true, selector: "[njTooltip]", inputs: { tooltipOptions: "tooltipOptions", tooltipCustomContent: "tooltipCustomContent" }, host: { listeners: { "mouseenter": "show()", "focusin": "show()", "mouseleave": "hide($event)", "focusout": "hide($event)" } }, exportAs: ["njTooltip"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TooltipDirective, decorators: [{
type: Directive,
args: [{
selector: '[njTooltip]',
exportAs: 'njTooltip',
standalone: true
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.OverlayPositionBuilder }, { type: i1.Overlay }, { type: i1.ScrollDispatcher }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.NgZone }]; }, propDecorators: { tooltipOptions: [{
type: Input
}], tooltipCustomContent: [{
type: Input
}], show: [{
type: HostListener,
args: ['mouseenter']
}, {
type: HostListener,
args: ['focusin']
}], hide: [{
type: HostListener,
args: ['mouseleave', ['$event']]
}, {
type: HostListener,
args: ['focusout', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90b29sdGlwL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUtOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQVF4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBVzNCLElBQ0ksY0FBYyxDQUFDLEtBQXFCO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDakQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUM1QixhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2FBQzFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJ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USxJQUFJLElBQUksQ0FBQztRQUNsRSxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUM7UUFDNUQsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxJQUFJLFFBQVEsQ0FBQztRQUNsRixnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3JFLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDMUUsZ0JBQWdCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQztRQUN0RSxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbEUsQ0FBQzsrR0FqS1UsZ0JBQWdCLHlJQWtDakIsUUFBUTttR0FsQ1AsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUw1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsV0FBVztvQkFDckIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFtQ0ksTUFBTTsyQkFBQyxRQUFRO2lFQXRCZCxjQUFjO3NCQURqQixLQUFLO2dCQWdCRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBcUVOLElBQUk7c0JBRkgsWUFBWTt1QkFBQyxZQUFZOztzQkFDekIsWUFBWTt1QkFBQyxTQUFTO2dCQW9DdkIsSUFBSTtzQkFGSCxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3JDLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsIE92ZXJsYXlSZWYsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcE9wdGlvbnMgfSBmcm9tICcuLi90b29sdGlwLm1vZGVsJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25qVG9vbHRpcF0nLFxuICBleHBvcnRBczogJ25qVG9vbHRpcCcsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBPcHRpb25zO1xuXG4gIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIHRvb2x0aXBSZWY6IENvbXBvbmVudFJlZjxUb29sdGlwQ29tcG9uZW50PjtcblxuICBwcml2YXRlIGludGVyc2VjdGlvbk9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcblxuICBASW5wdXQoKVxuICBzZXQgdG9vbHRpcE9wdGlvbnModmFsdWU6IFRvb2x0aXBPcHRpb25zKSB7XG4gICAgdGhpcy5fdG9vbHRpcE9wdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFRvb2x0aXBWYWx1ZXMoKTtcbiAgICBjb25zdCBzY3JvbGxhYmxlQW5jZXN0b3JzID0gdGhpcy5zY3JvbGxEaXNwYXRjaGVyLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0aGlzLmVsKTtcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsKVxuICAgICAgLndpdGhQb3NpdGlvbnMoW3RoaXMuZ2V0UG9zaXRpb25PcHRpb25zKCldKVxuICAgICAgLndpdGhTY3JvbGxhYmxlQ29udGFpbmVycyhzY3JvbGxhYmxlQW5jZXN0b3JzKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb25TdHJhdGVneSk7XG4gIH1cblxuICBnZXQgdG9vbHRpcE9wdGlvbnMoKTogVG9vbHRpcE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl90b29sdGlwT3B0aW9ucztcbiAgfVxuXG4gIEBJbnB1dCgpIHRvb2x0aXBDdXN0b21Db250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXIsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IERvY3VtZW50LFxuICAgIHByaXZhdGUgem9uZTogTmdab25lXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlQW5jZXN0b3JzID0gdGhpcy5zY3JvbGxEaXNwYXRjaGVyLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0aGlzLmVsKTtcblxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWwpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbdGhpcy5nZXRQb3NpdGlvbk9wdGlvbnMoKV0pXG4gICAgICAud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVBbmNlc3RvcnMpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vdmVybGF5UmVmPy5kaXNwb3NlKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0UG9zaXRpb25PcHRpb25zKCk6IENvbm5lY3RlZFBvc2l0aW9uIHtcbiAgICBjb25zdCBkZWZhdWx0UG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgIH07XG4gICAgc3dpdGNoICh0aGlzLnRvb2x0aXBPcHRpb25zPy5wbGFjZW1lbnQpIHtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICB9O1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRQb3NpdGlvbjtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgICAgICB9O1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRQb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvb2x0aXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoVG9vbHRpcENvbXBvbmVudCkpO1xuICAgIG1lcmdlKFxuICAgICAgZnJvbUV2ZW50KHRoaXMudG9vbHRpcFJlZj8ubG9jYXRpb24/Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJyksXG4gICAgICBmcm9tRXZlbnQodGhpcy50b29sdGlwUmVmPy5sb2NhdGlvbj8ubmF0aXZlRWxlbWVudCwgJ2ZvY3Vzb3V0JylcbiAgICApXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGUoZXZlbnQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNFbGVtZW50VmlzaWJsZSA9IGVudHJ5LmlzSW50ZXJzZWN0aW5nO1xuICAgICAgICAgIGlmICghaXNFbGVtZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5lbD8ubmF0aXZlRWxlbWVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRUb29sdGlwVmFsdWVzKCk7XG5cbiAgICB0aGlzLmVsPy5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZD8uc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGhpcy50b29sdGlwT3B0aW9ucy50b29sdGlwSWQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgWyckZXZlbnQnXSlcbiAgaGlkZShldmVudD8pIHtcbiAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IHRoaXMuZG9jPy5hY3RpdmVFbGVtZW50O1xuICAgIGNvbnN0IGlzRm9jdXNlZEVsZW1lbnQgPSBmb2N1c2VkRWxlbWVudCAmJiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZm9jdXNlZEVsZW1lbnQpO1xuICAgIGNvbnN0IG5ld1RhcmdldCA9IChldmVudCBhcyBNb3VzZUV2ZW50KT8ucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcbiAgICBjb25zdCBpc05leHRUYXJnZXRUb29sdGlwID0gbmV3VGFyZ2V0ICYmIHRoaXMub3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ/LmNvbnRhaW5zKG5ld1RhcmdldCk7XG4gICAgY29uc3QgaXNOZXh0VGFyZ2V0RWxlbWVudCA9IG5ld1RhcmdldCAmJiB0aGlzLmVsPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhuZXdUYXJnZXQpO1xuICAgIGlmICghbmV3VGFyZ2V0IHx8ICghaXNOZXh0VGFyZ2V0VG9vbHRpcCAmJiAhaXNOZXh0VGFyZ2V0RWxlbWVudCAmJiAhaXNGb2N1c2VkRWxlbWVudCkpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIHRoaXMudG9vbHRpcFJlZiA9IG51bGw7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5lbD8ubmF0aXZlRWxlbWVudD8uZmlyc3RFbGVtZW50Q2hpbGQ/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuICAgIH1cbiAgfVxuXG4gIHNldFRvb2x0aXBWYWx1ZXMoKSB7XG4gICAgY29uc3QgdG9vbHRpcENvbXBvbmVudCA9IHRoaXMudG9vbHRpcFJlZj8uaW5zdGFuY2U7XG4gICAgaWYgKCF0b29sdGlwQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9vbHRpcENvbXBvbmVudC5sYWJlbCA9IHRoaXMudG9vbHRpcEN1c3RvbUNvbnRlbnQgPyBudWxsIDogdGhpcy50b29sdGlwT3B0aW9ucz8ubGFiZWw7XG4gICAgdG9vbHRpcENvbXBvbmVudC5pc0ludmVyc2UgPSB0aGlzLnRvb2x0aXBPcHRpb25zPy5pc0ludmVyc2U7XG4gICAgdG9vbHRpcENvbXBvbmVudC5oYXNBcnJvdyA9IHRoaXMudG9vbHRpcE9wdGlvbnM/Lmhhc0Fycm93ID8/IHRydWU7XG4gICAgdG9vbHRpcENvbXBvbmVudC50b29sdGlwSWQgPSB0aGlzLnRvb2x0aXBPcHRpb25zPy50b29sdGlwSWQ7XG4gICAgdG9vbHRpcENvbXBvbmVudC5hcnJvd1BsYWNlbWVudCA9IHRoaXMudG9vbHRpcE9wdGlvbnM/LmFycm93UGxhY2VtZW50ID8/ICdjZW50ZXInO1xuICAgIHRvb2x0aXBDb21wb25lbnQucGxhY2VtZW50ID0gdGhpcy50b29sdGlwT3B0aW9ucz8ucGxhY2VtZW50ID8/ICd0b3AnO1xuICAgIHRvb2x0aXBDb21wb25lbnQuaXNTdGFuZGFsb25lID0gdGhpcy50b29sdGlwT3B0aW9ucz8uaXNTdGFuZGFsb25lID8/IHRydWU7XG4gICAgdG9vbHRpcENvbXBvbmVudC5pc0FuaW1hdGVkID0gdGhpcy50b29sdGlwT3B0aW9ucz8uaXNBbmltYXRlZCA/PyB0cnVlO1xuICAgIHRvb2x0aXBDb21wb25lbnQuY29udGVudFRlbXBsYXRlUmVmID0gdGhpcy50b29sdGlwQ3VzdG9tQ29udGVudDtcbiAgfVxufVxuIl19