UNPKG

@ng-matero/extensions

Version:
325 lines 60.6 kB
import { CdkTrapFocus } from '@angular/cdk/a11y'; import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Inject, InjectionToken, Input, Output, TemplateRef, ViewChild, ViewEncapsulation, booleanAttribute, } from '@angular/core'; import { Subject } from 'rxjs'; import { transformPopover } from './popover-animations'; import { MTX_POPOVER_CONTENT } from './popover-content'; import { throwMtxPopoverInvalidPositionEnd, throwMtxPopoverInvalidPositionStart, } from './popover-errors'; import * as i0 from "@angular/core"; /** Injection token to be used to override the default options for `mtx-popover`. */ export const MTX_POPOVER_DEFAULT_OPTIONS = new InjectionToken('mtx-popover-default-options', { providedIn: 'root', factory: MTX_POPOVER_DEFAULT_OPTIONS_FACTORY, }); /** @docs-private */ export function MTX_POPOVER_DEFAULT_OPTIONS_FACTORY() { return { backdropClass: 'cdk-overlay-transparent-backdrop', }; } let popoverPanelUid = 0; export class MtxPopover { /** Popover's position. */ get position() { return this._position; } set position(value) { if (!['before', 'after', 'above', 'below'].includes(value[0])) { throwMtxPopoverInvalidPositionStart(); } if (!['before', 'after', 'above', 'below', 'center'].includes(value[1])) { throwMtxPopoverInvalidPositionEnd(); } this._position = value; this.setPositionClasses(); } /** * This method takes classes set on the host mtx-popover element and applies them on the * popover template that displays in the overlay container. Otherwise, it's difficult * to style the containing popover from outside the component. * @param classes list of class names */ set panelClass(classes) { const previousPanelClass = this._previousPanelClass; const newClassList = { ...this._classList }; if (previousPanelClass && previousPanelClass.length) { previousPanelClass.split(' ').forEach((className) => { newClassList[className] = false; }); } this._previousPanelClass = classes; if (classes && classes.length) { classes.split(' ').forEach((className) => { newClassList[className] = true; }); this._elementRef.nativeElement.className = ''; this.setPositionClasses(); } this._classList = newClassList; } /** * This method takes classes set on the host mtx-popover element and applies them on the * popover template that displays in the overlay container. Otherwise, it's difficult * to style the containing popover from outside the component. * @deprecated Use `panelClass` instead. * @breaking-change 8.0.0 */ get classList() { return this.panelClass; } set classList(classes) { this.panelClass = classes; } constructor(_elementRef, _unusedNgZone, _defaultOptions) { this._elementRef = _elementRef; this._unusedNgZone = _unusedNgZone; this._defaultOptions = _defaultOptions; this._elevationPrefix = 'mat-elevation-z'; this._baseElevation = null; /** Config object to be passed into the popover's class. */ this._classList = {}; /** Current state of the panel animation. */ this._panelAnimationState = 'void'; /** Emits whenever an animation on the popover completes. */ this._animationDone = new Subject(); /** Whether the popover is animating. */ this._isAnimating = false; /** Closing disabled on popover */ this.closeDisabled = false; /** Class or list of classes to be added to the overlay panel. */ this.overlayPanelClass = this._defaultOptions.overlayPanelClass || ''; /** Class to be added to the backdrop element. */ this.backdropClass = this._defaultOptions.backdropClass; /** Popover's trigger event. */ this.triggerEvent = this._defaultOptions.triggerEvent ?? 'hover'; /** Popover's enter delay. */ this.enterDelay = this._defaultOptions.enterDelay ?? 100; /** Popover's leave delay. */ this.leaveDelay = this._defaultOptions.leaveDelay ?? 100; this._position = this._defaultOptions.position ?? ['below', 'after']; /** Popover-panel's X offset. */ this.xOffset = this._defaultOptions.xOffset ?? 0; /** Popover-panel's Y offset. */ this.yOffset = this._defaultOptions.yOffset ?? 0; /** Popover-arrow's width. */ this.arrowWidth = this._defaultOptions.arrowWidth ?? 16; /** Popover-arrow's height. */ this.arrowHeight = this._defaultOptions.arrowHeight ?? 16; /** Popover-arrow's X offset. */ this.arrowOffsetX = this._defaultOptions.arrowOffsetX ?? 20; /** Popover-arrow's Y offset. */ this.arrowOffsetY = this._defaultOptions.arrowOffsetY ?? 20; /** Whether the popover arrow should be hidden. */ this.hideArrow = this._defaultOptions.hideArrow ?? false; /** Whether popover can be closed when click the popover-panel. */ this.closeOnPanelClick = this._defaultOptions.closeOnPanelClick ?? false; /** Whether popover can be closed when click the backdrop. */ this.closeOnBackdropClick = this._defaultOptions.closeOnBackdropClick ?? true; /** Whether enable focus trap using `cdkTrapFocus`. */ this.focusTrapEnabled = this._defaultOptions.focusTrapEnabled ?? false; /** Whether enable focus trap auto capture using `cdkTrapFocusAutoCapture`. */ this.focusTrapAutoCaptureEnabled = this._defaultOptions.focusTrapAutoCaptureEnabled ?? false; /** Whether the popover has a backdrop. It will always be false if the trigger event is hover. */ this.hasBackdrop = this._defaultOptions.hasBackdrop; /** Event emitted when the popover is closed. */ this.closed = new EventEmitter(); this.panelId = `mtx-popover-panel-${popoverPanelUid++}`; } ngOnInit() { this.setPositionClasses(); } ngOnDestroy() { this.closed.complete(); } /** Handle a keyboard event from the popover, delegating to the appropriate action. */ _handleKeydown(event) { const keyCode = event.keyCode; switch (keyCode) { case ESCAPE: if (!hasModifierKey(event)) { event.preventDefault(); this.closed.emit('keydown'); } break; } } /** Close popover on click if `closeOnPanelClick` is true. */ _handleClick() { if (this.closeOnPanelClick) { this.closed.emit('click'); } } /** Disables close of popover when leaving trigger element and mouse over the popover. */ _handleMouseOver() { if (this.triggerEvent === 'hover') { this.closeDisabled = true; } } /** Enables close of popover when mouse leaving popover element. */ _handleMouseLeave() { if (this.triggerEvent === 'hover') { setTimeout(() => { this.closeDisabled = false; this.closed.emit(); }, this.leaveDelay); } } /** Sets the current styles for the popover to allow for dynamically changing settings. */ setCurrentStyles(pos = this.position) { const left = pos[1] === 'after' ? `${this.arrowOffsetX - this.arrowWidth / 2}px` : pos[1] === 'center' ? `calc(50% - ${this.arrowWidth / 2}px)` : ''; const right = pos[1] === 'before' ? `${this.arrowOffsetX - this.arrowWidth / 2}px` : ''; const bottom = pos[1] === 'above' ? `${this.arrowOffsetY - this.arrowHeight / 2}px` : pos[1] === 'center' ? `calc(50% - ${this.arrowHeight / 2}px)` : ''; const top = pos[1] === 'below' ? `${this.arrowOffsetY - this.arrowHeight / 2}px` : ''; this.arrowStyles = pos[0] === 'above' || pos[0] === 'below' ? { left: this.direction === 'ltr' ? left : right, right: this.direction === 'ltr' ? right : left, } : { top, bottom }; } /** * It's necessary to set position-based classes to ensure the popover panel animation * folds out from the correct direction. */ setPositionClasses(pos = this.position) { this._classList['mtx-popover-before-above'] = pos[0] === 'before' && pos[1] === 'above'; this._classList['mtx-popover-before-center'] = pos[0] === 'before' && pos[1] === 'center'; this._classList['mtx-popover-before-below'] = pos[0] === 'before' && pos[1] === 'below'; this._classList['mtx-popover-after-above'] = pos[0] === 'after' && pos[1] === 'above'; this._classList['mtx-popover-after-center'] = pos[0] === 'after' && pos[1] === 'center'; this._classList['mtx-popover-after-below'] = pos[0] === 'after' && pos[1] === 'below'; this._classList['mtx-popover-above-before'] = pos[0] === 'above' && pos[1] === 'before'; this._classList['mtx-popover-above-center'] = pos[0] === 'above' && pos[1] === 'center'; this._classList['mtx-popover-above-after'] = pos[0] === 'above' && pos[1] === 'after'; this._classList['mtx-popover-below-before'] = pos[0] === 'below' && pos[1] === 'before'; this._classList['mtx-popover-below-center'] = pos[0] === 'below' && pos[1] === 'center'; this._classList['mtx-popover-below-after'] = pos[0] === 'below' && pos[1] === 'after'; } /** Sets the popover-panel's elevation. */ setElevation() { // The base elevation depends on which version of the spec // we're running so we have to resolve it at runtime. if (this._baseElevation === null) { const styles = typeof getComputedStyle === 'function' ? getComputedStyle(this._elementRef.nativeElement) : null; const value = styles?.getPropertyValue('--mtx-popover-base-elevation-level') || '8'; this._baseElevation = parseInt(value); } // The elevation starts at the base and increases by one for each level. // Capped at 24 because that's the maximum elevation defined in the Material design spec. const elevation = Math.min(this._baseElevation, 24); const newElevation = `${this._elevationPrefix}${elevation}`; const customElevation = Object.keys(this._classList).find(className => { return className.startsWith(this._elevationPrefix); }); if (!customElevation || customElevation === this._previousElevation) { const newClassList = { ...this._classList }; if (this._previousElevation) { newClassList[this._previousElevation] = false; } newClassList[newElevation] = true; this._previousElevation = newElevation; this._classList = newClassList; } } /** Starts the enter animation. */ _startAnimation() { // @breaking-change 8.0.0 Combine with _resetAnimation. this._panelAnimationState = 'enter'; } /** Resets the panel animation to its initial state. */ _resetAnimation() { // @breaking-change 8.0.0 Combine with _startAnimation. this._panelAnimationState = 'void'; } /** Callback that is invoked when the panel animation completes. */ _onAnimationDone(event) { this._animationDone.next(event); this._isAnimating = false; } _onAnimationStart(event) { this._isAnimating = true; } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxPopover, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: MTX_POPOVER_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxPopover, isStandalone: true, selector: "mtx-popover", inputs: { backdropClass: "backdropClass", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], ariaDescribedby: ["aria-describedby", "ariaDescribedby"], triggerEvent: "triggerEvent", enterDelay: "enterDelay", leaveDelay: "leaveDelay", position: "position", xOffset: "xOffset", yOffset: "yOffset", arrowWidth: "arrowWidth", arrowHeight: "arrowHeight", arrowOffsetX: "arrowOffsetX", arrowOffsetY: "arrowOffsetY", hideArrow: ["hideArrow", "hideArrow", booleanAttribute], closeOnPanelClick: ["closeOnPanelClick", "closeOnPanelClick", booleanAttribute], closeOnBackdropClick: ["closeOnBackdropClick", "closeOnBackdropClick", booleanAttribute], focusTrapEnabled: ["focusTrapEnabled", "focusTrapEnabled", booleanAttribute], focusTrapAutoCaptureEnabled: ["focusTrapAutoCaptureEnabled", "focusTrapAutoCaptureEnabled", booleanAttribute], hasBackdrop: ["hasBackdrop", "hasBackdrop", booleanAttribute], panelClass: ["class", "panelClass"], classList: "classList" }, outputs: { closed: "closed" }, queries: [{ propertyName: "lazyContent", first: true, predicate: MTX_POPOVER_CONTENT, descendants: true }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], exportAs: ["mtxPopover"], ngImport: i0, template: "<ng-template>\n <div\n [id]=\"panelId\"\n class=\"mtx-popover-panel\"\n [class]=\"_classList\"\n [class.mtx-popover-panel-without-arrow]=\"hideArrow\"\n (keydown)=\"_handleKeydown($event)\"\n (click)=\"_handleClick()\"\n (mouseover)=\"_handleMouseOver()\"\n (mouseleave)=\"_handleMouseLeave()\"\n [@transformPopover]=\"_panelAnimationState\"\n (@transformPopover.start)=\"_onAnimationStart($event)\"\n (@transformPopover.done)=\"_onAnimationDone($event)\"\n tabindex=\"-1\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby || null\"\n [attr.aria-describedby]=\"ariaDescribedby || null\"\n [cdkTrapFocus]=\"focusTrapEnabled\"\n [cdkTrapFocusAutoCapture]=\"focusTrapAutoCaptureEnabled\">\n <div class=\"mtx-popover-content\">\n <ng-content></ng-content>\n </div>\n @if (!hideArrow) {\n <div class=\"mtx-popover-direction-arrow\" [style]=\"arrowStyles\"></div>\n }\n </div>\n</ng-template>\n", styles: [".mtx-popover-panel{position:relative;max-height:calc(100vh - 48px);padding:8px;font-size:inherit;outline:0;border-radius:var(--mtx-popover-container-shape, var(--mat-app-corner-extra-small));background-color:var(--mtx-popover-background-color, var(--mat-app-surface-container));color:var(--mtx-popover-text-color, var(--mat-app-on-surface))}.mtx-popover-panel[class*=mtx-popover-below]{margin-top:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-above]{margin-bottom:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-before]{margin-right:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-before]{margin-right:auto;margin-left:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-after]{margin-left:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-after]{margin-left:auto;margin-right:calc(.5em + 2px)}.mtx-popover-panel.mtx-popover-panel-without-arrow{margin:0}.mtx-popover-direction-arrow{position:absolute}.mtx-popover-direction-arrow:before,.mtx-popover-direction-arrow:after{position:absolute;display:inline-block;content:\"\";border-width:.5em;border-style:solid}.mtx-popover-direction-arrow:before{border-color:var(--mtx-popover-outline-color, var(--mat-app-surface-container))}.mtx-popover-direction-arrow:after{border-width:calc(.5em - 1px);border-color:var(--mtx-popover-background-color, var(--mat-app-surface-container))}[class*=mtx-popover-below] .mtx-popover-direction-arrow,[class*=mtx-popover-above] .mtx-popover-direction-arrow{width:1em}[class*=mtx-popover-below] .mtx-popover-direction-arrow:before,[class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[class*=mtx-popover-above] .mtx-popover-direction-arrow:before,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{border-left-color:transparent;border-right-color:transparent}[class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{left:1px}[dir=rtl] [class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[dir=rtl] [class*=mtx-popover-above] .mtx-popover-direction-arrow:after{right:1px;left:auto}[class*=mtx-popover-below] .mtx-popover-direction-arrow{top:0}[class*=mtx-popover-below] .mtx-popover-direction-arrow:before,[class*=mtx-popover-below] .mtx-popover-direction-arrow:after{bottom:0;border-top-width:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow{bottom:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow:before,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{top:0;border-bottom-width:0}[class*=mtx-popover-before] .mtx-popover-direction-arrow,[class*=mtx-popover-after] .mtx-popover-direction-arrow{height:1em}[class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{border-top-color:transparent;border-bottom-color:transparent}[class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{top:1px}[class*=mtx-popover-before] .mtx-popover-direction-arrow{right:0}[class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[class*=mtx-popover-before] .mtx-popover-direction-arrow:after{left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow{right:auto;left:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after{left:auto;right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before{border-right-width:.5em}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after{border-right-width:calc(.5em - 1px)}[class*=mtx-popover-after] .mtx-popover-direction-arrow{left:0}[class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow{left:auto;right:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after{right:auto;left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before{border-left-width:.5em}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after{border-left-width:calc(.5em - 1px)}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], animations: [transformPopover], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxPopover, decorators: [{ type: Component, args: [{ selector: 'mtx-popover', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [transformPopover], exportAs: 'mtxPopover', standalone: true, imports: [CdkTrapFocus], template: "<ng-template>\n <div\n [id]=\"panelId\"\n class=\"mtx-popover-panel\"\n [class]=\"_classList\"\n [class.mtx-popover-panel-without-arrow]=\"hideArrow\"\n (keydown)=\"_handleKeydown($event)\"\n (click)=\"_handleClick()\"\n (mouseover)=\"_handleMouseOver()\"\n (mouseleave)=\"_handleMouseLeave()\"\n [@transformPopover]=\"_panelAnimationState\"\n (@transformPopover.start)=\"_onAnimationStart($event)\"\n (@transformPopover.done)=\"_onAnimationDone($event)\"\n tabindex=\"-1\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby || null\"\n [attr.aria-describedby]=\"ariaDescribedby || null\"\n [cdkTrapFocus]=\"focusTrapEnabled\"\n [cdkTrapFocusAutoCapture]=\"focusTrapAutoCaptureEnabled\">\n <div class=\"mtx-popover-content\">\n <ng-content></ng-content>\n </div>\n @if (!hideArrow) {\n <div class=\"mtx-popover-direction-arrow\" [style]=\"arrowStyles\"></div>\n }\n </div>\n</ng-template>\n", styles: [".mtx-popover-panel{position:relative;max-height:calc(100vh - 48px);padding:8px;font-size:inherit;outline:0;border-radius:var(--mtx-popover-container-shape, var(--mat-app-corner-extra-small));background-color:var(--mtx-popover-background-color, var(--mat-app-surface-container));color:var(--mtx-popover-text-color, var(--mat-app-on-surface))}.mtx-popover-panel[class*=mtx-popover-below]{margin-top:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-above]{margin-bottom:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-before]{margin-right:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-before]{margin-right:auto;margin-left:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-after]{margin-left:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-after]{margin-left:auto;margin-right:calc(.5em + 2px)}.mtx-popover-panel.mtx-popover-panel-without-arrow{margin:0}.mtx-popover-direction-arrow{position:absolute}.mtx-popover-direction-arrow:before,.mtx-popover-direction-arrow:after{position:absolute;display:inline-block;content:\"\";border-width:.5em;border-style:solid}.mtx-popover-direction-arrow:before{border-color:var(--mtx-popover-outline-color, var(--mat-app-surface-container))}.mtx-popover-direction-arrow:after{border-width:calc(.5em - 1px);border-color:var(--mtx-popover-background-color, var(--mat-app-surface-container))}[class*=mtx-popover-below] .mtx-popover-direction-arrow,[class*=mtx-popover-above] .mtx-popover-direction-arrow{width:1em}[class*=mtx-popover-below] .mtx-popover-direction-arrow:before,[class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[class*=mtx-popover-above] .mtx-popover-direction-arrow:before,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{border-left-color:transparent;border-right-color:transparent}[class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{left:1px}[dir=rtl] [class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[dir=rtl] [class*=mtx-popover-above] .mtx-popover-direction-arrow:after{right:1px;left:auto}[class*=mtx-popover-below] .mtx-popover-direction-arrow{top:0}[class*=mtx-popover-below] .mtx-popover-direction-arrow:before,[class*=mtx-popover-below] .mtx-popover-direction-arrow:after{bottom:0;border-top-width:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow{bottom:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow:before,[class*=mtx-popover-above] .mtx-popover-direction-arrow:after{top:0;border-bottom-width:0}[class*=mtx-popover-before] .mtx-popover-direction-arrow,[class*=mtx-popover-after] .mtx-popover-direction-arrow{height:1em}[class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{border-top-color:transparent;border-bottom-color:transparent}[class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{top:1px}[class*=mtx-popover-before] .mtx-popover-direction-arrow{right:0}[class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[class*=mtx-popover-before] .mtx-popover-direction-arrow:after{left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow{right:auto;left:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before,[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after{left:auto;right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before{border-right-width:.5em}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after{border-right-width:calc(.5em - 1px)}[class*=mtx-popover-after] .mtx-popover-direction-arrow{left:0}[class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[class*=mtx-popover-after] .mtx-popover-direction-arrow:after{right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow{left:auto;right:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before,[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after{right:auto;left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before{border-left-width:.5em}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after{border-left-width:calc(.5em - 1px)}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [MTX_POPOVER_DEFAULT_OPTIONS] }] }], propDecorators: { backdropClass: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby'] }], ariaDescribedby: [{ type: Input, args: ['aria-describedby'] }], triggerEvent: [{ type: Input }], enterDelay: [{ type: Input }], leaveDelay: [{ type: Input }], position: [{ type: Input }], xOffset: [{ type: Input }], yOffset: [{ type: Input }], arrowWidth: [{ type: Input }], arrowHeight: [{ type: Input }], arrowOffsetX: [{ type: Input }], arrowOffsetY: [{ type: Input }], hideArrow: [{ type: Input, args: [{ transform: booleanAttribute }] }], closeOnPanelClick: [{ type: Input, args: [{ transform: booleanAttribute }] }], closeOnBackdropClick: [{ type: Input, args: [{ transform: booleanAttribute }] }], focusTrapEnabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], focusTrapAutoCaptureEnabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], hasBackdrop: [{ type: Input, args: [{ transform: booleanAttribute }] }], panelClass: [{ type: Input, args: ['class'] }], classList: [{ type: Input }], closed: [{ type: Output }], templateRef: [{ type: ViewChild, args: [TemplateRef] }], lazyContent: [{ type: ContentChild, args: [MTX_POPOVER_CONTENT] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvcG9wb3Zlci9wb3BvdmVyLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9wb3BvdmVyL3BvcG92ZXIuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUlMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQXFCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0UsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyxtQ0FBbUMsR0FDcEMsTUFBTSxrQkFBa0IsQ0FBQzs7QUFJMUIsb0ZBQW9GO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLElBQUksY0FBYyxDQUMzRCw2QkFBNkIsRUFDN0I7SUFDRSxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsbUNBQW1DO0NBQzdDLENBQ0YsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixNQUFNLFVBQVUsbUNBQW1DO0lBQ2pELE9BQU87UUFDTCxhQUFhLEVBQUUsa0NBQWtDO0tBQ2xELENBQUM7QUFDSixDQUFDO0FBRUQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBYXhCLE1B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RUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3RDLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFVbEMsVUFBVTtzQkFEYixLQUFLO3VCQUFDLE9BQU87Z0JBbUNWLFNBQVM7c0JBRFosS0FBSztnQkFTSSxNQUFNO3NCQUFmLE1BQU07Z0JBR2lCLFdBQVc7c0JBQWxDLFNBQVM7dUJBQUMsV0FBVztnQkFNYSxXQUFXO3NCQUE3QyxZQUFZO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQgeyBFU0NBUEUsIGhhc01vZGlmaWVyS2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRyYW5zZm9ybVBvcG92ZXIgfSBmcm9tICcuL3BvcG92ZXItYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBNVFhfUE9QT1ZFUl9DT05URU5ULCBNdHhQb3BvdmVyQ29udGVudCB9IGZyb20gJy4vcG9wb3Zlci1jb250ZW50JztcbmltcG9ydCB7XG4gIHRocm93TXR4UG9wb3ZlckludmFsaWRQb3NpdGlvbkVuZCxcbiAgdGhyb3dNdHhQb3BvdmVySW52YWxpZFBvc2l0aW9uU3RhcnQsXG59IGZyb20gJy4vcG9wb3Zlci1lcnJvcnMnO1xuaW1wb3J0IHsgTXR4UG9wb3ZlckRlZmF1bHRPcHRpb25zLCBNdHhQb3BvdmVyUGFuZWwgfSBmcm9tICcuL3BvcG92ZXItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNdHhQb3BvdmVyUG9zaXRpb24sIE10eFBvcG92ZXJUcmlnZ2VyRXZlbnQsIFBvcG92ZXJDbG9zZVJlYXNvbiB9IGZyb20gJy4vcG9wb3Zlci10eXBlcyc7XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciBgbXR4LXBvcG92ZXJgLiAqL1xuZXhwb3J0IGNvbnN0IE1UWF9QT1BPVkVSX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNdHhQb3BvdmVyRGVmYXVsdE9wdGlvbnM+KFxuICAnbXR4LXBvcG92ZXItZGVmYXVsdC1vcHRpb25zJyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiBNVFhfUE9QT1ZFUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSxcbiAgfVxuKTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBNVFhfUE9QT1ZFUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSgpOiBNdHhQb3BvdmVyRGVmYXVsdE9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gIH07XG59XG5cbmxldCBwb3BvdmVyUGFuZWxVaWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdHgtcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmh0bWwnLFxuICBzdHlsZVVybDogJy4vcG9wb3Zlci5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGFuaW1hdGlvbnM6IFt0cmFuc2Zvcm1Qb3BvdmVyXSxcbiAgZXhwb3J0QXM6ICdtdHhQb3BvdmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Nka1RyYXBGb2N1c10sXG59KVxuZXhwb3J0IGNsYXNzIE10eFBvcG92ZXIgaW1wbGVtZW50cyBNdHhQb3BvdmVyUGFuZWwsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfcHJldmlvdXNFbGV2YXRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VsZXZhdGlvblByZWZpeCA9ICdtYXQtZWxldmF0aW9uLXonO1xuICBwcml2YXRlIF9iYXNlRWxldmF0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogQ29uZmlnIG9iamVjdCB0byBiZSBwYXNzZWQgaW50byB0aGUgcG9wb3ZlcidzIGNsYXNzLiAqL1xuICBfY2xhc3NMaXN0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYW5lbCBhbmltYXRpb24uICovXG4gIF9wYW5lbEFuaW1hdGlvblN0YXRlOiAndm9pZCcgfCAnZW50ZXInID0gJ3ZvaWQnO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciBhbiBhbmltYXRpb24gb24gdGhlIHBvcG92ZXIgY29tcGxldGVzLiAqL1xuICByZWFkb25seSBfYW5pbWF0aW9uRG9uZSA9IG5ldyBTdWJqZWN0PEFuaW1hdGlvbkV2ZW50PigpO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIGFuaW1hdGluZy4gKi9cbiAgX2lzQW5pbWF0aW5nID0gZmFsc2U7XG5cbiAgLyoqIENsb3NpbmcgZGlzYWJsZWQgb24gcG9wb3ZlciAqL1xuICBjbG9zZURpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIENvbmZpZyBvYmplY3QgdG8gYmUgcGFzc2VkIGludG8gdGhlIHBvcG92ZXIncyBhcnJvdyBzdHlsZSAqL1xuICBhcnJvd1N0eWxlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBMYXlvdXQgZGlyZWN0aW9uIG9mIHRoZSBwb3BvdmVyLiAqL1xuICBkaXJlY3Rpb24/OiBEaXJlY3Rpb247XG5cbiAgLyoqIENsYXNzIG9yIGxpc3Qgb2YgY2xhc3NlcyB0byBiZSBhZGRlZCB0byB0aGUgb3ZlcmxheSBwYW5lbC4gKi9cbiAgb3ZlcmxheVBhbmVsQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMub3ZlcmxheVBhbmVsQ2xhc3MgfHwgJyc7XG5cbiAgLyoqIENsYXNzIHRvIGJlIGFkZGVkIHRvIHRoZSBiYWNrZHJvcCBlbGVtZW50LiAqL1xuICBASW5wdXQoKSBiYWNrZHJvcENsYXNzID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuYmFja2Ryb3BDbGFzcztcblxuICAvKiogYXJpYS1sYWJlbCBmb3IgdGhlIHBvcG92ZXIgcGFuZWwuICovXG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbD86IHN0cmluZztcblxuICAvKiogYXJpYS1sYWJlbGxlZGJ5IGZvciB0aGUgcG9wb3ZlciBwYW5lbC4gKi9cbiAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRieT86IHN0cmluZztcblxuICAvKiogYXJpYS1kZXNjcmliZWRieSBmb3IgdGhlIHBvcG92ZXIgcGFuZWwuICovXG4gIEBJbnB1dCgnYXJpYS1kZXNjcmliZWRieScpIGFyaWFEZXNjcmliZWRieT86IHN0cmluZztcblxuICAvKiogUG9wb3ZlcidzIHRyaWdnZXIgZXZlbnQuICovXG4gIEBJbnB1dCgpIHRyaWdnZXJFdmVudDogTXR4UG9wb3ZlclRyaWdnZXJFdmVudCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zLnRyaWdnZXJFdmVudCA/PyAnaG92ZXInO1xuXG4gIC8qKiBQb3BvdmVyJ3MgZW50ZXIgZGVsYXkuICovXG4gIEBJbnB1dCgpIGVudGVyRGVsYXkgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5lbnRlckRlbGF5ID8/IDEwMDtcblxuICAvKiogUG9wb3ZlcidzIGxlYXZlIGRlbGF5LiAqL1xuICBASW5wdXQoKSBsZWF2ZURlbGF5ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMubGVhdmVEZWxheSA/PyAxMDA7XG5cbiAgLyoqIFBvcG92ZXIncyBwb3NpdGlvbi4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuICBzZXQgcG9zaXRpb24odmFsdWU6IE10eFBvcG92ZXJQb3NpdGlvbikge1xuICAgIGlmICghWydiZWZvcmUnLCAnYWZ0ZXInLCAnYWJvdmUnLCAnYmVsb3cnXS5pbmNsdWRlcyh2YWx1ZVswXSkpIHtcbiAgICAgIHRocm93TXR4UG9wb3ZlckludmFsaWRQb3NpdGlvblN0YXJ0KCk7XG4gICAgfVxuICAgIGlmICghWydiZWZvcmUnLCAnYWZ0ZXInLCAnYWJvdmUnLCAnYmVsb3cnLCAnY2VudGVyJ10uaW5jbHVkZXModmFsdWVbMV0pKSB7XG4gICAgICB0aHJvd010eFBvcG92ZXJJbnZhbGlkUG9zaXRpb25FbmQoKTtcbiAgICB9XG4gICAgdGhpcy5fcG9zaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldFBvc2l0aW9uQ2xhc3NlcygpO1xuICB9XG4gIHByaXZhdGUgX3Bvc2l0aW9uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMucG9zaXRpb24gPz8gWydiZWxvdycsICdhZnRlciddO1xuXG4gIC8qKiBQb3BvdmVyLXBhbmVsJ3MgWCBvZmZzZXQuICovXG4gIEBJbnB1dCgpIHhPZmZzZXQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy54T2Zmc2V0ID8/IDA7XG5cbiAgLyoqIFBvcG92ZXItcGFuZWwncyBZIG9mZnNldC4gKi9cbiAgQElucHV0KCkgeU9mZnNldCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zLnlPZmZzZXQgPz8gMDtcblxuICAvKiogUG9wb3Zlci1hcnJvdydzIHdpZHRoLiAqL1xuICBASW5wdXQoKSBhcnJvd1dpZHRoID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuYXJyb3dXaWR0aCA/PyAxNjtcblxuICAvKiogUG9wb3Zlci1hcnJvdydzIGhlaWdodC4gKi9cbiAgQElucHV0KCkgYXJyb3dIZWlnaHQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5hcnJvd0hlaWdodCA/PyAxNjtcblxuICAvKiogUG9wb3Zlci1hcnJvdydzIFggb2Zmc2V0LiAqL1xuICBASW5wdXQoKSBhcnJvd09mZnNldFggPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5hcnJvd09mZnNldFggPz8gMjA7XG5cbiAgLyoqIFBvcG92ZXItYXJyb3cncyBZIG9mZnNldC4gKi9cbiAgQElucHV0KCkgYXJyb3dPZmZzZXRZID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuYXJyb3dPZmZzZXRZID8/IDIwO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGFycm93IHNob3VsZCBiZSBoaWRkZW4uICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBoaWRlQXJyb3cgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5oaWRlQXJyb3cgPz8gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgcG9wb3ZlciBjYW4gYmUgY2xvc2VkIHdoZW4gY2xpY2sgdGhlIHBvcG92ZXItcGFuZWwuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBjbG9zZU9uUGFuZWxDbGljayA9IHRoaXMuX2RlZmF1bHRPcHRpb25zLmNsb3NlT25QYW5lbENsaWNrID8/IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHBvcG92ZXIgY2FuIGJlIGNsb3NlZCB3aGVuIGNsaWNrIHRoZSBiYWNrZHJvcC4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGNsb3NlT25CYWNrZHJvcENsaWNrID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPz8gdHJ1ZTtcblxuICAvKiogV2hldGhlciBlbmFibGUgZm9jdXMgdHJhcCB1c2luZyBgY2RrVHJhcEZvY3VzYC4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGZvY3VzVHJhcEVuYWJsZWQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5mb2N1c1RyYXBFbmFibGVkID8/IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIGVuYWJsZSBmb2N1cyB0cmFwIGF1dG8gY2FwdHVyZSB1c2luZyBgY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmVgLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgZm9jdXNUcmFwQXV0b0NhcHR1cmVFbmFibGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuZm9jdXNUcmFwQXV0b0NhcHR1cmVFbmFibGVkID8/IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGhhcyBhIGJhY2tkcm9wLiBJdCB3aWxsIGFsd2F5cyBiZSBmYWxzZSBpZiB0aGUgdHJpZ2dlciBldmVudCBpcyBob3Zlci4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGhhc0JhY2tkcm9wID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuaGFzQmFja2Ryb3A7XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHRha2VzIGNsYXNzZXMgc2V0IG9uIHRoZSBob3N0IG10eC1wb3BvdmVyIGVsZW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBvbiB0aGVcbiAgICogcG9wb3ZlciB0ZW1wbGF0ZSB0aGF0IGRpc3BsYXlzIGluIHRoZSBvdmVybGF5IGNvbnRhaW5lci4gT3RoZXJ3aXNlLCBpdCdzIGRpZmZpY3VsdFxuICAgKiB0byBzdHlsZSB0aGUgY29udGFpbmluZyBwb3BvdmVyIGZyb20gb3V0c2lkZSB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gY2xhc3NlcyBsaXN0IG9mIGNsYXNzIG5hbWVzXG4gICAqL1xuICBASW5wdXQoJ2NsYXNzJylcbiAgc2V0IHBhbmVsQ2xhc3MoY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJldmlvdXNQYW5lbENsYXNzID0gdGhpcy5fcHJldmlvdXNQYW5lbENsYXNzO1xuICAgIGNvbnN0IG5ld0NsYXNzTGlzdCA9IHsgLi4udGhpcy5fY2xhc3NMaXN0IH07XG5cbiAgICBpZiAocHJldmlvdXNQYW5lbENsYXNzICYmIHByZXZpb3VzUGFuZWxDbGFzcy5sZW5ndGgpIHtcbiAgICAgIHByZXZpb3VzUGFuZWxDbGFzcy5zcGxpdCgnICcpLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIG5ld0NsYXNzTGlzdFtjbGFzc05hbWVdID0gZmFs