UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

145 lines 19.8 kB
import { Component, ComponentFactoryResolver, HostListener, Renderer2, ViewChild, ViewContainerRef } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { UserAgentRef } from './user-agent-ref'; import * as i0 from "@angular/core"; import * as i1 from "./user-agent-ref"; const defaultOptions = { modalBodyClass: 'modal-content', padding: true, width: null, closeOnEscape: true, closeOnOverlayClick: true }; /** * This is an internal component which is responsible for creating the modal dialog window and overlay. */ export class DynamicModalWrapper { constructor(componentFactoryResolver, userAgent, renderer) { this.componentFactoryResolver = componentFactoryResolver; this.userAgent = userAgent; this.renderer = renderer; this.modalElementsHeight = 0; this.visible = false; this.options = defaultOptions; this.subscriptions = new Subscription(); this.modalHeightEvents$ = new Subject(); } ngOnInit() { this.isIE11 = this.userAgent.isIE11; if (this.isIE11) { this.subscriptions.add(this.modalHeightEvents$.pipe(debounceTime(100)).subscribe(() => { this.ie11FixContentHeight(); })); } } ngOnDestroy() { this.subscriptions.unsubscribe(); clearTimeout(this.openTimer); if (this.cmpRef && this.cmpRef.destroy) { this.cmpRef.destroy(); } } setOptions(options) { this.options = Object.assign({}, defaultOptions, options); } /** * Inject the component which will appear within the modal. */ injectContent(component) { let factory = this.componentFactoryResolver.resolveComponentFactory(component); this.cmpRef = this.portal.createComponent(factory); return this.cmpRef; } /** * Display the modal */ open() { clearTimeout(this.openTimer); this.openTimer = setTimeout(() => this.visible = true, 50); } /** * Programatically force the modal to close and resolve with the value passed. */ forceClose(val) { this.cmpRef.instance.closeFn(val); } /** * Close the modal and call the cancelFn of the embedded component. */ cancel() { clearTimeout(this.openTimer); this.visible = false; this.cmpRef.instance.cancelFn(); this.cmpRef.destroy(); } overlayClick() { if (this.options.closeOnOverlayClick) { this.cancel(); } } keyHandler(e) { if (e.which === 27 && this.options.closeOnEscape) { this.cancel(); } } /** * IE11 Related fixes */ /** * Listen for browsers size changes, to notify IE for modal height change */ onResize() { if (this.isIE11) { this.modalHeightEvents$.next(); } } /** * Listen for content changes, to notify IE for modal height change */ ngAfterViewChecked() { if (this.isIE11 && this.cmpRef) { // Trigger modalHeight event on view checks let modalElements = Array.from(this.cmpRef.location.nativeElement.children); let currentModalElementsHeight = modalElements .filter(element => element.className != this.options.modalBodyClass) .map(element => { let styles = window.getComputedStyle(element); let margin = parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom']); return element.offsetHeight + margin; }) .reduce((heights, height) => heights + height); if (this.modalElementsHeight !== currentModalElementsHeight) { this.modalElementsHeight = currentModalElementsHeight; this.modalHeightEvents$.next(); } } } /** * Fixes modal body height for IE11 */ ie11FixContentHeight() { if (this.isIE11 && this.cmpRef) { let injectedElement = this.cmpRef.location.nativeElement; let modalBodyElement = injectedElement.getElementsByClassName(this.options.modalBodyClass)[0]; this.renderer.setStyle(modalBodyElement, 'max-height', `calc(70vh - ${this.modalElementsHeight}px)`); } } } /** @nocollapse */ DynamicModalWrapper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicModalWrapper, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.UserAgentRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ DynamicModalWrapper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: DynamicModalWrapper, selector: "gtx-dynamic-modal", host: { listeners: { "document:keydown": "keyHandler($event)", "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "portal", first: true, predicate: ["portal"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div class=\"gtx-modal-overlay\"\n [class.visible]=\"visible\"\n (click)=\"overlayClick()\"></div>\n<div class=\"gtx-modal-dialog\"\n [class.isIE11]=\"isIE11\"\n [class.visible]=\"visible\"\n [style.width]=\"options.width\"\n [class.nopad]=\"options.padding === false\">\n <ng-template #portal></ng-template>\n</div>\n" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicModalWrapper, decorators: [{ type: Component, args: [{ selector: 'gtx-dynamic-modal', template: "<div class=\"gtx-modal-overlay\"\n [class.visible]=\"visible\"\n (click)=\"overlayClick()\"></div>\n<div class=\"gtx-modal-dialog\"\n [class.isIE11]=\"isIE11\"\n [class.visible]=\"visible\"\n [style.width]=\"options.width\"\n [class.nopad]=\"options.padding === false\">\n <ng-template #portal></ng-template>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.UserAgentRef }, { type: i0.Renderer2 }]; }, propDecorators: { portal: [{ type: ViewChild, args: ['portal', { read: ViewContainerRef, static: true }] }], keyHandler: [{ type: HostListener, args: ['document:keydown', ['$event']] }], onResize: [{ type: HostListener, args: ['window:resize'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1tb2RhbC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFsL2R5bmFtaWMtbW9kYWwtd3JhcHBlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2RhbC9keW5hbWljLW1vZGFsLXdyYXBwZXIudHBsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsWUFBWSxFQUdaLFNBQVMsRUFFVCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7OztBQUU5QyxNQUFNLGNBQWMsR0FBa0I7SUFDbEMsY0FBYyxFQUFFLGVBQWU7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLGFBQWEsRUFBRSxJQUFJO0lBQ25CLG1CQUFtQixFQUFFLElBQUk7Q0FDNUIsQ0FBQztBQUVGOztHQUVHO0FBS0gsTUFBTSxPQUFPLG1CQUFtQjtJQWdCNUIsWUFDWSx3QkFBa0QsRUFDbEQsU0FBdUIsRUFDdkIsUUFBbUI7UUFGbkIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFaL0Isd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBQ2hDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsWUFBTyxHQUFrQixjQUFjLENBQUM7UUFFaEMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFD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Q0FBQyxDQUFnQixDQUFDO1lBRTdHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQy9DLENBQUM7U0FDTDtJQUNMLENBQUM7O21JQWhKUSxtQkFBbUI7dUhBQW5CLG1CQUFtQix3T0FFQyxnQkFBZ0IsMkNDcENqRCwyVkFVQTsyRkR3QmEsbUJBQW1CO2tCQUovQixTQUFTOytCQUNJLG1CQUFtQjtrS0FLa0MsTUFBTTtzQkFBcEUsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFvRjdELFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFlNUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFR5cGUsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0lNb2RhbERpYWxvZywgSU1vZGFsT3B0aW9uc30gZnJvbSAnLi9tb2RhbC1pbnRlcmZhY2VzJztcbmltcG9ydCB7VXNlckFnZW50UmVmfSBmcm9tICcuL3VzZXItYWdlbnQtcmVmJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IElNb2RhbE9wdGlvbnMgPSB7XG4gICAgbW9kYWxCb2R5Q2xhc3M6ICdtb2RhbC1jb250ZW50JyxcbiAgICBwYWRkaW5nOiB0cnVlLFxuICAgIHdpZHRoOiBudWxsLFxuICAgIGNsb3NlT25Fc2NhcGU6IHRydWUsXG4gICAgY2xvc2VPbk92ZXJsYXlDbGljazogdHJ1ZVxufTtcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGNvbXBvbmVudCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1vZGFsIGRpYWxvZyB3aW5kb3cgYW5kIG92ZXJsYXkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ3R4LWR5bmFtaWMtbW9kYWwnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLW1vZGFsLXdyYXBwZXIudHBsLmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNNb2RhbFdyYXBwZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgICBAVmlld0NoaWxkKCdwb3J0YWwnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWw6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICBpc0lFMTE6IGJvb2xlYW47XG4gICAgZGlzbWlzc0ZuOiBGdW5jdGlvbjtcblxuICAgIG1vZGFsRWxlbWVudHNIZWlnaHQ6IG51bWJlciA9IDA7XG4gICAgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIG9wdGlvbnM6IElNb2RhbE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICBwcml2YXRlIGNtcFJlZjogQ29tcG9uZW50UmVmPElNb2RhbERpYWxvZz47XG4gICAgcHJpdmF0ZSBvcGVuVGltZXI6IGFueTtcbiAgICBwcml2YXRlIG1vZGFsSGVpZ2h0RXZlbnRzJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSB1c2VyQWdlbnQ6IFVzZXJBZ2VudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNJRTExID0gdGhpcy51c2VyQWdlbnQuaXNJRTExO1xuXG4gICAgICAgIGlmICh0aGlzLmlzSUUxMSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsSGVpZ2h0RXZlbnRzJC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmllMTFGaXhDb250ZW50SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5UaW1lcik7XG4gICAgICAgIGlmKHRoaXMuY21wUmVmICYmIHRoaXMuY21wUmVmLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuY21wUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE9wdGlvbnMob3B0aW9uczogSU1vZGFsT3B0aW9ucyk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0IHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBhcHBlYXIgd2l0aGluIHRoZSBtb2RhbC5cbiAgICAgKi9cbiAgICBpbmplY3RDb250ZW50KGNvbXBvbmVudDogVHlwZTxJTW9kYWxEaWFsb2c+KTogQ29tcG9uZW50UmVmPElNb2RhbERpYWxvZz4ge1xuICAgICAgICBsZXQgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMuY21wUmVmID0gdGhpcy5wb3J0YWwuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jbXBSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSB0aGUgbW9kYWxcbiAgICAgKi9cbiAgICBvcGVuKCk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuVGltZXIpO1xuICAgICAgICB0aGlzLm9wZW5UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy52aXNpYmxlID0gdHJ1ZSwgNTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2dyYW1hdGljYWxseSBmb3JjZSB0aGUgbW9kYWwgdG8gY2xvc2UgYW5kIHJlc29sdmUgd2l0aCB0aGUgdmFsdWUgcGFzc2VkLlxuICAgICAqL1xuICAgIGZvcmNlQ2xvc2UodmFsPzogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY21wUmVmLmluc3RhbmNlLmNsb3NlRm4odmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgbW9kYWwgYW5kIGNhbGwgdGhlIGNhbmNlbEZuIG9mIHRoZSBlbWJlZGRlZCBjb21wb25lbnQuXG4gICAgICovXG4gICAgY2FuY2VsKCk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuVGltZXIpO1xuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbXBSZWYuaW5zdGFuY2UuY2FuY2VsRm4oKTtcbiAgICAgICAgdGhpcy5jbXBSZWYuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIG92ZXJsYXlDbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uT3ZlcmxheUNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAga2V5SGFuZGxlcihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChlLndoaWNoID09PSAyNyAmJiB0aGlzLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElFMTEgUmVsYXRlZCBmaXhlc1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIGZvciBicm93c2VycyBzaXplIGNoYW5nZXMsIHRvIG5vdGlmeSBJRSBmb3IgbW9kYWwgaGVpZ2h0IGNoYW5nZVxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICAgIG9uUmVzaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0lFMTEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxIZWlnaHRFdmVudHMkLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBmb3IgY29udGVudCBjaGFuZ2VzLCB0byBub3RpZnkgSUUgZm9yIG1vZGFsIGhlaWdodCBjaGFuZ2VcbiAgICAgKi9cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzSUUxMSAmJiB0aGlzLmNtcFJlZikge1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBtb2RhbEhlaWdodCBldmVudCBvbiB2aWV3IGNoZWNrc1xuICAgICAgICAgICAgbGV0IG1vZGFsRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMuY21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4gYXMgSFRNTEVsZW1lbnRbXSk7XG4gICAgICAgICAgICBsZXQgY3VycmVudE1vZGFsRWxlbWVudHNIZWlnaHQgPSBtb2RhbEVsZW1lbnRzXG4gICAgICAgICAgICAuZmlsdGVyKCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NOYW1lICE9IHRoaXMub3B0aW9ucy5tb2RhbEJvZHlDbGFzcyApXG4gICAgICAgICAgICAubWFwKCBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmdpbiA9IHBhcnNlRmxvYXQoc3R5bGVzWydtYXJnaW5Ub3AnXSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VGbG9hdChzdHlsZXNbJ21hcmdpbkJvdHRvbSddKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQgKyBtYXJnaW47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlZHVjZSgoaGVpZ2h0czogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IG51bWJlciA9PiBoZWlnaHRzICsgaGVpZ2h0KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubW9kYWxFbGVtZW50c0hlaWdodCAhPT0gY3VycmVudE1vZGFsRWxlbWVudHNIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsRWxlbWVudHNIZWlnaHQgPSBjdXJyZW50TW9kYWxFbGVtZW50c0hlaWdodDtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsSGVpZ2h0RXZlbnRzJC5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXhlcyBtb2RhbCBib2R5IGhlaWdodCBmb3IgSUUxMVxuICAgICAqL1xuICAgIGllMTFGaXhDb250ZW50SGVpZ2h0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0lFMTEgJiYgdGhpcy5jbXBSZWYpIHtcbiAgICAgICAgICAgIGxldCBpbmplY3RlZEVsZW1lbnQgPSB0aGlzLmNtcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbGV0IG1vZGFsQm9keUVsZW1lbnQgPSBpbmplY3RlZEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLm9wdGlvbnMubW9kYWxCb2R5Q2xhc3MpWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgIG1vZGFsQm9keUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ21heC1oZWlnaHQnLFxuICAgICAgICAgICAgICAgIGBjYWxjKDcwdmggLSAke3RoaXMubW9kYWxFbGVtZW50c0hlaWdodH1weClgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImd0eC1tb2RhbC1vdmVybGF5XCJcbiAgICAgW2NsYXNzLnZpc2libGVdPVwidmlzaWJsZVwiXG4gICAgIChjbGljayk9XCJvdmVybGF5Q2xpY2soKVwiPjwvZGl2PlxuPGRpdiBjbGFzcz1cImd0eC1tb2RhbC1kaWFsb2dcIlxuICAgICBbY2xhc3MuaXNJRTExXT1cImlzSUUxMVwiXG4gICAgIFtjbGFzcy52aXNpYmxlXT1cInZpc2libGVcIlxuICAgICBbc3R5bGUud2lkdGhdPVwib3B0aW9ucy53aWR0aFwiXG4gICAgIFtjbGFzcy5ub3BhZF09XCJvcHRpb25zLnBhZGRpbmcgPT09IGZhbHNlXCI+XG4gICAgPG5nLXRlbXBsYXRlICNwb3J0YWw+PC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19