UNPKG

@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
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