@bimeister/pupakit.kit
Version:
PupaKit is an open source collection of Angular components based on an atomic approach to building interfaces, which guarantees better performance and greater development flexibility.
136 lines • 23 kB
JavaScript
import { Overlay, OverlayConfig, } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { Injectable, Injector } from '@angular/core';
import { OVERLAY_VIEWPORT_MARGIN_PX } from '@bimeister/pupakit.common';
import { filterNotNil, shareReplayWithRefCount } from '@bimeister/utilities';
import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
import { debounceTime, distinctUntilChanged, filter, map, switchMap, take } from 'rxjs/operators';
import { TOOLTIP_SERVICE_TOKEN } from '../../../declarations/tokens/tooltip-service.token';
import '../../../declarations/interfaces/tooltip-service-declaration.interface';
import { TooltipContentComponent } from '../components/tooltip-content/tooltip-content.component';
import { OVERLAY_POSITIONS } from '../positions';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
export class TooltipService {
constructor(overlay) {
this.overlay = overlay;
this.subscription = new Subscription();
this.mouseOverTrigger$ = new BehaviorSubject(false);
this.mouseOverContent$ = new BehaviorSubject(false);
this.mouseOverTooltip$ = combineLatest([
this.mouseOverTrigger$.pipe(distinctUntilChanged()),
this.mouseOverContent$.pipe(distinctUntilChanged()),
]).pipe(debounceTime(0), map(([mouseOverTrigger, mouseOverContent]) => mouseOverTrigger || mouseOverContent));
this.isOpenedState$ = new BehaviorSubject(false);
this.isOpened$ = this.isOpenedState$.pipe(distinctUntilChanged());
this.isDisabledState$ = new BehaviorSubject(false);
this.isDisabled$ = this.isDisabledState$.pipe(distinctUntilChanged());
this.tooltipContentState$ = new BehaviorSubject(null);
this.tooltipContent$ = this.tooltipContentState$.pipe(distinctUntilChanged());
this.tooltipContentTemplateState$ = new BehaviorSubject(null);
this.tooltipContentTemplate$ = this.tooltipContentTemplateState$.pipe(distinctUntilChanged());
this.tooltipHideOnHoverState$ = new BehaviorSubject(true);
this.tooltipHideOnHoverHover$ = this.tooltipHideOnHoverState$.pipe(distinctUntilChanged());
this.overlayRef$ = new BehaviorSubject(null);
this.triggerRef$ = new BehaviorSubject(null);
this.tooltipPositionStrategy$ = new BehaviorSubject(null);
this.tooltipPosition$ = this.tooltipPositionStrategy$.pipe(filterNotNil(), switchMap((positionStrategy) => positionStrategy.positionChanges), shareReplayWithRefCount());
this.subscription.add(this.processMouseOverTooltipChanges());
}
ngOnDestroy() {
this.close();
this.subscription.unsubscribe();
}
registerTooltipTriggerRef(triggerRef) {
this.triggerRef$.next(triggerRef);
}
setOpenedState(isOpened) {
this.isOpenedState$
.pipe(take(1), filter((currentOpenedState) => currentOpenedState !== isOpened))
.subscribe(() => (isOpened ? this.open() : this.close()));
}
setDisabledState(isDisabled) {
this.isDisabledState$.next(isDisabled);
}
setTooltipHideOnHoverState(hideOnTooltipHover) {
this.tooltipHideOnHoverState$.next(hideOnTooltipHover);
}
setTooltipContentState(content) {
this.tooltipContentState$.next(content);
}
setTooltipContentTemplateState(template) {
this.tooltipContentTemplateState$.next(template);
}
processTriggerMouseEnter() {
this.mouseOverTrigger$.next(true);
}
processTriggerMouseLeave() {
this.mouseOverTrigger$.next(false);
}
processContentMouseEnter() {
this.mouseOverContent$.next(true);
}
processContentMouseLeave() {
this.mouseOverContent$.next(false);
}
processMouseOverTooltipChanges() {
return this.mouseOverTooltip$.subscribe((mouseOverTooltip) => {
this.setOpenedState(mouseOverTooltip);
});
}
createOverlay() {
this.getPositionStrategy()
.pipe(take(1), filterNotNil())
.subscribe((positionStrategy) => {
const overlayConfig = new OverlayConfig({
positionStrategy,
});
const overlayRef = this.overlay.create(overlayConfig);
this.overlayRef$.next(overlayRef);
this.tooltipPositionStrategy$.next(positionStrategy);
});
}
getPositionStrategy() {
return this.triggerRef$.pipe(take(1), filterNotNil(), map((triggerRef) => {
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo(triggerRef)
.withPositions(OVERLAY_POSITIONS)
.withViewportMargin(OVERLAY_VIEWPORT_MARGIN_PX);
return positionStrategy;
}));
}
open() {
this.createOverlay();
this.overlayRef$.pipe(filterNotNil(), take(1)).subscribe((overlayRef) => {
overlayRef.attach(this.getComponentPortal());
overlayRef.updatePosition();
this.isOpenedState$.next(true);
});
}
close() {
this.overlayRef$.pipe(filterNotNil(), take(1)).subscribe((overlayRef) => {
this.isOpenedState$.next(false);
overlayRef.dispose();
overlayRef.detach();
this.overlayRef$.next(null);
});
}
getComponentPortal() {
const portalInjector = Injector.create({
providers: [
{
provide: TOOLTIP_SERVICE_TOKEN,
useValue: this,
},
],
});
return new ComponentPortal(TooltipContentComponent, null, portalInjector);
}
}
TooltipService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TooltipService, deps: [{ token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
TooltipService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TooltipService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TooltipService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Overlay }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdG9vbHRpcC9zZXJ2aWNlcy90b29sdGlwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLE9BQU8sRUFDUCxhQUFhLEdBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQVksdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUEwQyx3RUFBd0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQUdqRCxNQUFNLE9BQU8sY0FBYztJQW1EekIsWUFBNkIsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWxENUIsaUJBQVksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRCxzQkFBaUIsR0FBNkIsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEYsc0JBQWlCLEdBQTZCLElBQUks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QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFzQixFQUFFLEVBQUU7WUFDbEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxjQUFjLEdBQWEsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLHFCQUFxQjtvQkFDOUIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxlQUFlLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7OzRHQXpLVSxjQUFjO2dIQUFkLGNBQWM7NEZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSxcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIEluamVjdG9yLCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPVkVSTEFZX1ZJRVdQT1JUX01BUkdJTl9QWCB9IGZyb20gJ0BiaW1laXN0ZXIvcHVwYWtpdC5jb21tb24nO1xuaW1wb3J0IHsgZmlsdGVyTm90TmlsLCBOdWxsYWJsZSwgc2hhcmVSZXBsYXlXaXRoUmVmQ291bnQgfSBmcm9tICdAYmltZWlzdGVyL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRPT0xUSVBfU0VSVklDRV9UT0tFTiB9IGZyb20gJy4uLy4uLy4uL2RlY2xhcmF0aW9ucy90b2tlbnMvdG9vbHRpcC1zZXJ2aWNlLnRva2VuJztcbmltcG9ydCB7IFRvb2x0aXBTZXJ2aWNlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy90b29sdGlwLXNlcnZpY2UtZGVjbGFyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRvb2x0aXBDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy90b29sdGlwLWNvbnRlbnQvdG9vbHRpcC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVkVSTEFZX1BPU0lUSU9OUyB9IGZyb20gJy4uL3Bvc2l0aW9ucyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb29sdGlwU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgVG9vbHRpcFNlcnZpY2VEZWNsYXJhdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3VzZU92ZXJUcmlnZ2VyJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW91c2VPdmVyQ29udGVudCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW91c2VPdmVyVG9vbHRpcCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm1vdXNlT3ZlclRyaWdnZXIkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgdGhpcy5tb3VzZU92ZXJDb250ZW50JC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICBdKS5waXBlKFxuICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICBtYXAoKFttb3VzZU92ZXJUcmlnZ2VyLCBtb3VzZU92ZXJDb250ZW50XTogW2Jvb2xlYW4sIGJvb2xlYW5dKSA9PiBtb3VzZU92ZXJUcmlnZ2VyIHx8IG1vdXNlT3ZlckNvbnRlbnQpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc09wZW5lZFN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBpc09wZW5lZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzT3BlbmVkU3RhdGUkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Rpc2FibGVkU3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzRGlzYWJsZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5pc0Rpc2FibGVkU3RhdGUkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sdGlwQ29udGVudFN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPHN0cmluZz4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxzdHJpbmc+PihcbiAgICBudWxsXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSB0b29sdGlwQ29udGVudCQ6IE9ic2VydmFibGU8TnVsbGFibGU8c3RyaW5nPj4gPSB0aGlzLnRvb2x0aXBDb250ZW50U3RhdGUkLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbHRpcENvbnRlbnRUZW1wbGF0ZVN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPFRlbXBsYXRlUmVmPHVua25vd24+Pj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIE51bGxhYmxlPFRlbXBsYXRlUmVmPHVua25vd24+PlxuICA+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbHRpcENvbnRlbnRUZW1wbGF0ZSQ6IE9ic2VydmFibGU8TnVsbGFibGU8VGVtcGxhdGVSZWY8dW5rbm93bj4+PiA9XG4gICAgdGhpcy50b29sdGlwQ29udGVudFRlbXBsYXRlU3RhdGUkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sdGlwSGlkZU9uSG92ZXJTdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSB0b29sdGlwSGlkZU9uSG92ZXJIb3ZlciQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnRvb2x0aXBIaWRlT25Ib3ZlclN0YXRlJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlSZWYkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8T3ZlcmxheVJlZj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxPdmVybGF5UmVmPj4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlclJlZiQ6IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBOdWxsYWJsZTxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj5cbiAgPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2x0aXBQb3NpdGlvblN0cmF0ZWd5JDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneT4+ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneT4+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbHRpcFBvc2l0aW9uJDogT2JzZXJ2YWJsZTxDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2U+ID0gdGhpcy50b29sdGlwUG9zaXRpb25TdHJhdGVneSQucGlwZShcbiAgICBmaWx0ZXJOb3ROaWwoKSxcbiAgICBzd2l0Y2hNYXAoKHBvc2l0aW9uU3RyYXRlZ3k6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSkgPT4gcG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZXMpLFxuICAgIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50KClcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXk6IE92ZXJsYXkpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5wcm9jZXNzTW91c2VPdmVyVG9vbHRpcENoYW5nZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJUb29sdGlwVHJpZ2dlclJlZih0cmlnZ2VyUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlclJlZiQubmV4dCh0cmlnZ2VyUmVmKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRPcGVuZWRTdGF0ZShpc09wZW5lZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuZWRTdGF0ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBmaWx0ZXIoKGN1cnJlbnRPcGVuZWRTdGF0ZTogYm9vbGVhbikgPT4gY3VycmVudE9wZW5lZFN0YXRlICE9PSBpc09wZW5lZClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gKGlzT3BlbmVkID8gdGhpcy5vcGVuKCkgOiB0aGlzLmNsb3NlKCkpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWRTdGF0ZSQubmV4dChpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUb29sdGlwSGlkZU9uSG92ZXJTdGF0ZShoaWRlT25Ub29sdGlwSG92ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXBIaWRlT25Ib3ZlclN0YXRlJC5uZXh0KGhpZGVPblRvb2x0aXBIb3Zlcik7XG4gIH1cblxuICBwdWJsaWMgc2V0VG9vbHRpcENvbnRlbnRTdGF0ZShjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50U3RhdGUkLm5leHQoY29udGVudCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VG9vbHRpcENvbnRlbnRUZW1wbGF0ZVN0YXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcENvbnRlbnRUZW1wbGF0ZVN0YXRlJC5uZXh0KHRlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzVHJpZ2dlck1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5tb3VzZU92ZXJUcmlnZ2VyJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NUcmlnZ2VyTW91c2VMZWF2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vdXNlT3ZlclRyaWdnZXIkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NDb250ZW50TW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICB0aGlzLm1vdXNlT3ZlckNvbnRlbnQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc0NvbnRlbnRNb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMubW91c2VPdmVyQ29udGVudCQubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NNb3VzZU92ZXJUb29sdGlwQ2hhbmdlcygpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiB0aGlzLm1vdXNlT3ZlclRvb2x0aXAkLnN1YnNjcmliZSgobW91c2VPdmVyVG9vbHRpcDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5zZXRPcGVuZWRTdGF0ZShtb3VzZU92ZXJUb29sdGlwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFBvc2l0aW9uU3RyYXRlZ3koKVxuICAgICAgLnBpcGUodGFrZSgxKSwgZmlsdGVyTm90TmlsKCkpXG4gICAgICAuc3Vic2NyaWJlKChwb3NpdGlvblN0cmF0ZWd5OiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kpID0+IHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheUNvbmZpZzogT3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiQubmV4dChvdmVybGF5UmVmKTtcbiAgICAgICAgdGhpcy50b29sdGlwUG9zaXRpb25TdHJhdGVneSQubmV4dChwb3NpdGlvblN0cmF0ZWd5KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvblN0cmF0ZWd5KCk6IE9ic2VydmFibGU8RmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlclJlZiQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBmaWx0ZXJOb3ROaWwoKSxcbiAgICAgIG1hcCgodHJpZ2dlclJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pID0+IHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneTogRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0cmlnZ2VyUmVmKVxuICAgICAgICAgIC53aXRoUG9zaXRpb25zKE9WRVJMQVlfUE9TSVRJT05TKVxuICAgICAgICAgIC53aXRoVmlld3BvcnRNYXJnaW4oT1ZFUkxBWV9WSUVXUE9SVF9NQVJHSU5fUFgpO1xuXG4gICAgICAgIHJldHVybiBwb3NpdGlvblN0cmF0ZWd5O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMub3ZlcmxheVJlZiQucGlwZShmaWx0ZXJOb3ROaWwoKSwgdGFrZSgxKSkuc3Vic2NyaWJlKChvdmVybGF5UmVmOiBPdmVybGF5UmVmKSA9PiB7XG4gICAgICBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLmdldENvbXBvbmVudFBvcnRhbCgpKTtcbiAgICAgIG92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcblxuICAgICAgdGhpcy5pc09wZW5lZFN0YXRlJC5uZXh0KHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm92ZXJsYXlSZWYkLnBpcGUoZmlsdGVyTm90TmlsKCksIHRha2UoMSkpLnN1YnNjcmliZSgob3ZlcmxheVJlZjogT3ZlcmxheVJlZikgPT4ge1xuICAgICAgdGhpcy5pc09wZW5lZFN0YXRlJC5uZXh0KGZhbHNlKTtcbiAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiQubmV4dChudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50UG9ydGFsKCk6IENvbXBvbmVudFBvcnRhbDxUb29sdGlwQ29udGVudENvbXBvbmVudD4ge1xuICAgIGNvbnN0IHBvcnRhbEluamVjdG9yOiBJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFRPT0xUSVBfU0VSVklDRV9UT0tFTixcbiAgICAgICAgICB1c2VWYWx1ZTogdGhpcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnRQb3J0YWwoVG9vbHRpcENvbnRlbnRDb21wb25lbnQsIG51bGwsIHBvcnRhbEluamVjdG9yKTtcbiAgfVxufVxuIl19