UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

237 lines 28.3 kB
import { DOCUMENT } from '@angular/common'; import { Directive, Inject, Input, TemplateRef, } from '@angular/core'; import { arrow, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'; import { ReplaySubject, fromEvent, takeUntil } from 'rxjs'; import * as i0 from "@angular/core"; let nextId = 1; export class DokuPopover { constructor(document, renderer, ngZone, elementRef, appRef) { this.document = document; this.renderer = renderer; this.ngZone = ngZone; this.elementRef = elementRef; this.appRef = appRef; this.id = `d-popover-uniqueId-${nextId++}`; /** * Content of the popover. * It can be a string or a template for more customization. * * @default '' */ this.content = ''; /** * The color of the popover. * Either `dark` or `light`. * @default 'dark' */ this.color = 'dark'; /** * The placement of the popover. * @default 'top' */ this.placement = 'top'; /** * Actions that will close the popover. * * - `manual`, only manual action that will close the popover like using `hide` method. * - `clickOutside`, close the popover when clicking outside its element. * * The top list has higher priority. */ this.closeBy = ['clickOutside']; /** * Whether to disable the popover. * Disabled popover can't be opened. * @default false */ this.disabled = false; this.isShown = false; this.destroy$ = new ReplaySubject(); } get classes() { return ['d-popover', 'd-text-body-s', `d-popover-${this.color}`]; } ngOnInit() { this.handleOnClick(); this.popoverElement = this.createPopoverElement(); } ngOnDestroy() { this.destroy$.next(1); this.destroy$.complete(); this.hide(); this.popoverElement = undefined; this.popoverContentElement = undefined; this.popoverArrowElement = undefined; } /** * Show popover programmatically. */ show() { if (this.disabled) return; if (this.isShown || !this.popoverElement) return; this.isShown = true; this.setPopoverContent(this.content); this.renderer.appendChild(this.document.body, this.popoverElement); this.doAutoUpdatePosition(); } /** * Hide popover programmatically. */ hide() { if (!this.isShown || !this.popoverElement) return; this.isShown = false; this.popoverElement.remove(); this.cleanup?.(); this.viewRef?.destroy(); } /** * Toggle popover programmatically. */ toggle() { this.isShown ? this.hide() : this.show(); } /** * Update the content of the popover with new one. */ updateContent(content) { this.setPopoverContent(content); } createPopoverElement() { const element = this.renderer.createElement('div'); element.className = this.classes.join(' '); this.popoverContentElement = this.createPopoverContentElement(); element.appendChild(this.popoverContentElement); this.popoverArrowElement = this.createArrowElement(); element.appendChild(this.popoverArrowElement); return element; } createPopoverContentElement() { return this.renderer.createElement('div'); } createArrowElement() { const element = this.renderer.createElement('div'); element.className = 'd-popover-arrow'; return element; } setPopoverContent(content) { if (!this.popoverContentElement) return; this.popoverContentElement.replaceChildren(); if (content instanceof TemplateRef) { this.viewRef?.destroy(); this.viewRef = content.createEmbeddedView({ hide: this.hide.bind(this) }); this.appRef.attachView(this.viewRef); this.viewRef.rootNodes.forEach((node) => { this.renderer.appendChild(this.popoverContentElement, node); }); this.viewRef.detectChanges(); } if (typeof content === 'string') { this.renderer.appendChild(this.popoverContentElement, this.renderer.createText(content)); } } updatePosition() { if (!this.elementRef.nativeElement || !this.popoverElement || !this.popoverArrowElement) return; computePosition(this.elementRef.nativeElement, this.popoverElement, { placement: this.placement, middleware: [ offset(6), flip(), shift({ padding: 8 }), arrow({ element: this.popoverArrowElement }), ], }).then(({ x, y, placement, middlewareData }) => { if (!this.popoverElement) return; Object.assign(this.popoverElement.style, { top: `${y}px`, left: `${x}px` }); // Positioning the arrow element if (middlewareData.arrow && this.popoverArrowElement) { const { x: arrowX, y: arrowY } = middlewareData.arrow; const staticSide = { top: 'bottom', right: 'left', bottom: 'top', left: 'right', }[placement.split('-')[0]]; Object.assign(this.popoverArrowElement.style, { left: arrowX != null || arrowX != undefined ? `${arrowX}px` : '', top: arrowY != null || arrowY != undefined ? `${arrowY}px` : '', right: '', bottom: '', [staticSide]: '-4px', }); } }); } doAutoUpdatePosition() { this.ngZone.runOutsideAngular(() => { if (!this.elementRef.nativeElement || !this.popoverElement) return; this.cleanup = autoUpdate(this.elementRef.nativeElement, this.popoverElement, () => { this.updatePosition(); }); }); } handleOnClick() { this.ngZone.runOutsideAngular(() => { fromEvent(this.document, 'click') .pipe(takeUntil(this.destroy$)) .subscribe((event) => { const target = event.target; const toggler = this.elementRef.nativeElement; const togglerClick = toggler.contains(target); const popoverClick = this.popoverElement?.contains(target); const outsidePopoverClick = !popoverClick; if (this.isShown) { // Don't hide the popover, supposed to use method `hide`. if (this.closeBy.includes('manual')) return; // Close popover on toggler click if it has been opened if (togglerClick) return this.hide(); // Close popover on click outside its element. if (outsidePopoverClick) return this.hide(); } if (!this.isShown) { // Open popover on toggler click if (togglerClick) return this.show(); } }); }); } } DokuPopover.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPopover, deps: [{ token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Directive }); DokuPopover.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuPopover, isStandalone: true, selector: "[doku-popover]", inputs: { content: ["doku-popover", "content"], color: ["popoverColor", "color"], placement: ["popoverPlacement", "placement"], closeBy: ["popoverCloseBy", "closeBy"], disabled: ["popoverDisabled", "disabled"] }, exportAs: ["dokuPopover"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPopover, decorators: [{ type: Directive, args: [{ selector: '[doku-popover]', exportAs: 'dokuPopover', standalone: true, }] }], ctorParameters: function () { return [{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ApplicationRef }]; }, propDecorators: { content: [{ type: Input, args: ['doku-popover'] }], color: [{ type: Input, args: ['popoverColor'] }], placement: [{ type: Input, args: ['popoverPlacement'] }], closeBy: [{ type: Input, args: ['popoverCloseBy'] }], disabled: [{ type: Input, args: ['popoverDisabled'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvcG9wb3Zlci9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLFNBQVMsRUFHVCxNQUFNLEVBQ04sS0FBSyxFQUtMLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRzNELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQU9mLE1BQU0sT0FBTyxXQUFXO0lBbUR0QixZQUM0QixRQUFrQixFQUNwQyxRQUFtQixFQUNuQixNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsTUFBc0I7UUFKSixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUF2RHZCLE9BQUUsR0FBRyxzQkFBc0IsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUUvQzs7Ozs7V0FLRztRQUNvQixZQUFPLEdBQWtDLEVBQUUsQ0FBQztRQUVuRTs7OztXQUlHO1FBQ29CLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBRXhEOzs7V0FHRztRQUN3QixjQUFTLEdBQXlCLEtBQUssQ0FBQztRQUVuRTs7Ozs7OztXQU9HO1FBQ3NCLFlBQU8sR0FBNEIsQ0FBQyxjQUFjLENB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OzswQkFxREksTUFBTTsyQkFBQyxRQUFROytJQTNDSyxPQUFPO3NCQUE3QixLQUFLO3VCQUFDLGNBQWM7Z0JBT0UsS0FBSztzQkFBM0IsS0FBSzt1QkFBQyxjQUFjO2dCQU1NLFNBQVM7c0JBQW5DLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVBLE9BQU87c0JBQS9CLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQU9HLFFBQVE7c0JBQWpDLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFycm93LCBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGZsaXAsIG9mZnNldCwgc2hpZnQgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZyb21FdmVudCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEb2t1UG9wb3ZlckNsb3NlQnlLZXksIERva3VQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi9wb3BvdmVyLmludGVyZmFjZSc7XG5cbmxldCBuZXh0SWQgPSAxO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZG9rdS1wb3BvdmVyXScsXG4gIGV4cG9ydEFzOiAnZG9rdVBvcG92ZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1UG9wb3ZlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgaWQgPSBgZC1wb3BvdmVyLXVuaXF1ZUlkLSR7bmV4dElkKyt9YDtcblxuICAvKipcbiAgICogQ29udGVudCBvZiB0aGUgcG9wb3Zlci5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgdGVtcGxhdGUgZm9yIG1vcmUgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgnZG9rdS1wb3BvdmVyJykgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4gPSAnJztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBwb3BvdmVyLlxuICAgKiBFaXRoZXIgYGRhcmtgIG9yIGBsaWdodGAuXG4gICAqIEBkZWZhdWx0ICdkYXJrJ1xuICAgKi9cbiAgQElucHV0KCdwb3BvdmVyQ29sb3InKSBjb2xvcjogJ2RhcmsnIHwgJ2xpZ2h0JyA9ICdkYXJrJztcblxuICAvKipcbiAgICogVGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci5cbiAgICogQGRlZmF1bHQgJ3RvcCdcbiAgICovXG4gIEBJbnB1dCgncG9wb3ZlclBsYWNlbWVudCcpIHBsYWNlbWVudDogRG9rdVBvcG92ZXJQbGFjZW1lbnQgPSAndG9wJztcblxuICAvKipcbiAgICogQWN0aW9ucyB0aGF0IHdpbGwgY2xvc2UgdGhlIHBvcG92ZXIuXG4gICAqXG4gICAqIC0gYG1hbnVhbGAsIG9ubHkgbWFudWFsIGFjdGlvbiB0aGF0IHdpbGwgY2xvc2UgdGhlIHBvcG92ZXIgbGlrZSB1c2luZyBgaGlkZWAgbWV0aG9kLlxuICAgKiAtIGBjbGlja091dHNpZGVgLCBjbG9zZSB0aGUgcG9wb3ZlciB3aGVuIGNsaWNraW5nIG91dHNpZGUgaXRzIGVsZW1lbnQuXG4gICAqXG4gICAqIFRoZSB0b3AgbGlzdCBoYXMgaGlnaGVyIHByaW9yaXR5LlxuICAgKi9cbiAgQElucHV0KCdwb3BvdmVyQ2xvc2VCeScpIGNsb3NlQnk6IERva3VQb3BvdmVyQ2xvc2VCeUtleVtdID0gWydjbGlja091dHNpZGUnXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBwb3BvdmVyLlxuICAgKiBEaXNhYmxlZCBwb3BvdmVyIGNhbid0IGJlIG9wZW5lZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgncG9wb3ZlckRpc2FibGVkJykgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGlzU2hvd24gPSBmYWxzZTtcblxuICBwcml2YXRlIHBvcG92ZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcG9wb3ZlckNvbnRlbnRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcG9wb3ZlckFycm93RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHZpZXdSZWY/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj47XG5cbiAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZlxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGdldCBjbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydkLXBvcG92ZXInLCAnZC10ZXh0LWJvZHktcycsIGBkLXBvcG92ZXItJHt0aGlzLmNvbG9yfWBdO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVPbkNsaWNrKCk7XG5cbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVQb3BvdmVyRWxlbWVudCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KDEpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1Nob3duIHx8ICF0aGlzLnBvcG92ZXJFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5pc1Nob3duID0gdHJ1ZTtcbiAgICB0aGlzLnNldFBvcG92ZXJDb250ZW50KHRoaXMuY29udGVudCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMucG9wb3ZlckVsZW1lbnQpO1xuICAgIHRoaXMuZG9BdXRvVXBkYXRlUG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24gfHwgIXRoaXMucG9wb3ZlckVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLmlzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuY2xlYW51cD8uKCk7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlciB3aXRoIG5ldyBvbmUuXG4gICAqL1xuICB1cGRhdGVDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+KSB7XG4gICAgdGhpcy5zZXRQb3BvdmVyQ29udGVudChjb250ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUG9wb3ZlckVsZW1lbnQoKSB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc2VzLmpvaW4oJyAnKTtcblxuICAgIHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50ID0gdGhpcy5jcmVhdGVQb3BvdmVyQ29udGVudEVsZW1lbnQoKTtcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50KTtcblxuICAgIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCA9IHRoaXMuY3JlYXRlQXJyb3dFbGVtZW50KCk7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnBvcG92ZXJBcnJvd0VsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBvcG92ZXJDb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXJyb3dFbGVtZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICdkLXBvcG92ZXItYXJyb3cnO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3BvdmVyQ29udGVudChjb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPikge1xuICAgIGlmICghdGhpcy5wb3BvdmVyQ29udGVudEVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLnBvcG92ZXJDb250ZW50RWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4oKTtcblxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICAgICAgdGhpcy52aWV3UmVmID0gY29udGVudC5jcmVhdGVFbWJlZGRlZFZpZXcoeyBoaWRlOiB0aGlzLmhpZGUuYmluZCh0aGlzKSB9KTtcbiAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy52aWV3UmVmKTtcbiAgICAgIHRoaXMudmlld1JlZi5yb290Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50LCBub2RlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoY29udGVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCB8fCAhdGhpcy5wb3BvdmVyRWxlbWVudCB8fCAhdGhpcy5wb3BvdmVyQXJyb3dFbGVtZW50KSByZXR1cm47XG4gICAgY29tcHV0ZVBvc2l0aW9uKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXJFbGVtZW50LCB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgbWlkZGxld2FyZTogW1xuICAgICAgICBvZmZzZXQoNiksXG4gICAgICAgIGZsaXAoKSxcbiAgICAgICAgc2hpZnQoeyBwYWRkaW5nOiA4IH0pLFxuICAgICAgICBhcnJvdyh7IGVsZW1lbnQ6IHRoaXMucG9wb3ZlckFycm93RWxlbWVudCB9KSxcbiAgICAgIF0sXG4gICAgfSkudGhlbigoeyB4LCB5LCBwbGFjZW1lbnQsIG1pZGRsZXdhcmVEYXRhIH0pID0+IHtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyRWxlbWVudCkgcmV0dXJuO1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJFbGVtZW50LnN0eWxlLCB7IHRvcDogYCR7eX1weGAsIGxlZnQ6IGAke3h9cHhgIH0pO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0aGUgYXJyb3cgZWxlbWVudFxuICAgICAgaWYgKG1pZGRsZXdhcmVEYXRhLmFycm93ICYmIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IHg6IGFycm93WCwgeTogYXJyb3dZIH0gPSBtaWRkbGV3YXJlRGF0YS5hcnJvdztcbiAgICAgICAgY29uc3Qgc3RhdGljU2lkZSA9IHtcbiAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICB9W3BsYWNlbWVudC5zcGxpdCgnLScpWzBdXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJBcnJvd0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICBsZWZ0OiBhcnJvd1ggIT0gbnVsbCB8fCBhcnJvd1ggIT0gdW5kZWZpbmVkID8gYCR7YXJyb3dYfXB4YCA6ICcnLFxuICAgICAgICAgIHRvcDogYXJyb3dZICE9IG51bGwgfHwgYXJyb3dZICE9IHVuZGVmaW5lZCA/IGAke2Fycm93WX1weGAgOiAnJyxcbiAgICAgICAgICByaWdodDogJycsXG4gICAgICAgICAgYm90dG9tOiAnJyxcbiAgICAgICAgICBbc3RhdGljU2lkZV06ICctNHB4JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRvQXV0b1VwZGF0ZVBvc2l0aW9uKCkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgfHwgIXRoaXMucG9wb3ZlckVsZW1lbnQpIHJldHVybjtcbiAgICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3ZlckVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9uQ2xpY2soKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHRvZ2dsZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgIGNvbnN0IHRvZ2dsZXJDbGljayA9IHRvZ2dsZXIuY29udGFpbnModGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCBwb3BvdmVyQ2xpY2sgPSB0aGlzLnBvcG92ZXJFbGVtZW50Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IG91dHNpZGVQb3BvdmVyQ2xpY2sgPSAhcG9wb3ZlckNsaWNrO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNTaG93bikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgaGlkZSB0aGUgcG9wb3Zlciwgc3VwcG9zZWQgdG8gdXNlIG1ldGhvZCBgaGlkZWAuXG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZUJ5LmluY2x1ZGVzKCdtYW51YWwnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBDbG9zZSBwb3BvdmVyIG9uIHRvZ2dsZXIgY2xpY2sgaWYgaXQgaGFzIGJlZW4gb3BlbmVkXG4gICAgICAgICAgICBpZiAodG9nZ2xlckNsaWNrKSByZXR1cm4gdGhpcy5oaWRlKCk7XG5cbiAgICAgICAgICAgIC8vIENsb3NlIHBvcG92ZXIgb24gY2xpY2sgb3V0c2lkZSBpdHMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmIChvdXRzaWRlUG9wb3ZlckNsaWNrKSByZXR1cm4gdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzU2hvd24pIHtcbiAgICAgICAgICAgIC8vIE9wZW4gcG9wb3ZlciBvbiB0b2dnbGVyIGNsaWNrXG4gICAgICAgICAgICBpZiAodG9nZ2xlckNsaWNrKSByZXR1cm4gdGhpcy5zaG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19