UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

160 lines 22 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ChangeDetectorRef, Directive, ElementRef, HostBinding, Input, NgZone, } from "@angular/core"; import isFinite from "lodash/isFinite"; import { BehaviorSubject, Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { uuid } from "../../../functions/uuid"; import * as i0 from "@angular/core"; /** * @ignore * PROTOTYPE for DONUT ZOOMING * * This directive allows to zoom it's element to fit the dimensions of parent element */ export class ZoomContentDirective { constructor(element, ngZone, cdRef) { this.ngZone = ngZone; this.cdRef = cdRef; this.destroy$ = new Subject(); this.zoom = 1; this.scalePadding = "0"; // Zoom inputs this.zoomRatio = 0.9; this.minZoomDifference = 0.1; this.useZoom = true; // Scale inputs this.margin = 10; this.minScale = 0.1; this.uuid = uuid(); this.element = element.nativeElement; if (!this.element.parentElement) { // Note: is parentElement will be null resizeObserver will crash throw new Error("Parent element is undefined"); } this.parentElement = this.element.parentElement; } ngOnChanges(changes) { if (changes.scaleOUT$ && this.scaleOUT$) { this.scaleIN$.pipe(takeUntil(this.destroy$)).subscribe((data) => { this.latestDataFromBroker = { ...data }; this.element.style.transform = `scale(${data.targetValue})`; this.checkScaleBoundaries(data.targetValue); }); } } ngAfterViewInit() { const resizeObserver = new ResizeObserver(() => this.onResize()); this.ngZone.runOutsideAngular(() => { resizeObserver.observe(this.element); resizeObserver.observe(this.parentElement); }); this.resizeObserver = resizeObserver; } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); if (this.resizeObserver) { this.resizeObserver.unobserve(this.element); this.resizeObserver.unobserve(this.parentElement); } } onResize() { this.elementRect = this.element?.getBoundingClientRect(); this.parentRect = this.parentElement?.getBoundingClientRect(); if (!this.elementRect || !this.parentRect) { return; } this.useZoom ? this.applyZoom() : this.applyScale(); } applyZoom() { const widthZoom = this.parentRect.width / this.elementRect.width; const heightZoom = this.parentRect.height / this.elementRect.height; let zoom = Math.min(widthZoom, heightZoom) * this.zoomRatio; if (this.minZoom) { zoom = Math.max(zoom, this.minZoom); } if (this.maxZoom) { zoom = Math.min(zoom, this.maxZoom); } if (Math.abs(zoom - this.zoom) > this.minZoomDifference) { this.zoom = zoom; this.cdRef.detectChanges(); // running inside an angular zone doesn't always work } } applyScale() { const parentSize = { width: this.parentElement.offsetWidth - 2 * this.margin, height: this.parentElement.offsetHeight - 2 * this.margin, }; const scale = Math.min(parentSize.width / this.element.offsetWidth, parentSize.height / this.element.offsetHeight); this.scaleOUT$ ? this.scaleOUT$.next({ ...this.latestDataFromBroker, targetID: this.uuid, targetValue: isFinite(scale) ? scale : 0, }) : (this.element.style.transform = `scale(${scale})`); this.checkScaleBoundaries(scale); } checkScaleBoundaries(scale) { if (scale < this.minScale) { this.element.style.transform = `scale(${this.minScale})`; } if (this.maxScale && scale > this.maxScale) { this.element.style.transform = `scale(${this.maxScale})`; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoomContentDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ZoomContentDirective, selector: "[nuiZoomContent]", inputs: { zoomRatio: "zoomRatio", minZoomDifference: "minZoomDifference", maxZoom: "maxZoom", minZoom: "minZoom", useZoom: "useZoom", margin: "margin", minScale: "minScale", maxScale: "maxScale", scaleIN$: "scaleIN$", scaleOUT$: "scaleOUT$" }, host: { properties: { "style.zoom": "this.zoom", "style.padding": "this.scalePadding" } }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoomContentDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiZoomContent]", }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { zoom: [{ type: HostBinding, args: ["style.zoom"] }], scalePadding: [{ type: HostBinding, args: ["style.padding"] }], zoomRatio: [{ type: Input }], minZoomDifference: [{ type: Input }], maxZoom: [{ type: Input }], minZoom: [{ type: Input }], useZoom: [{ type: Input }], margin: [{ type: Input }], minScale: [{ type: Input }], maxScale: [{ type: Input }], scaleIN$: [{ type: Input }], scaleOUT$: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS1jb250ZW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vZGlyZWN0aXZlcy96b29tLWNvbnRlbnQvem9vbS1jb250ZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxHQUlULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sUUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBUS9DOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQWtDN0IsWUFDSSxPQUFtQixFQUNYLE1BQWMsRUFDZCxLQUF3QjtRQUR4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFsQ25CLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBR3pDLFNBQUksR0FBRyxDQUFDLENBQUM7UUFHVCxpQkFBWSxHQUFXLEdBQUcsQ0FBQztRQUVs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SztnQkFHVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgaXNGaW5pdGUgZnJvbSBcImxvZGFzaC9pc0Zpbml0ZVwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSBcIi4uLy4uLy4uL2Z1bmN0aW9ucy91dWlkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyb2tlclZhbHVlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRhcmdldElEOiBzdHJpbmc7XG4gICAgdGFyZ2V0VmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKiBQUk9UT1RZUEUgZm9yIERPTlVUIFpPT01JTkdcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgdG8gem9vbSBpdCdzIGVsZW1lbnQgdG8gZml0IHRoZSBkaW1lbnNpb25zIG9mIHBhcmVudCBlbGVtZW50XG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBcIltudWlab29tQ29udGVudF1cIixcbn0pXG5leHBvcnQgY2xhc3MgWm9vbUNvbnRlbnREaXJlY3RpdmVcbiAgICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzXG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoXCJzdHlsZS56b29tXCIpXG4gICAgcHVibGljIHpvb20gPSAxO1xuXG4gICAgQEhvc3RCaW5kaW5nKFwic3R5bGUucGFkZGluZ1wiKVxuICAgIHB1YmxpYyBzY2FsZVBhZGRpbmc6IHN0cmluZyA9IFwiMFwiO1xuXG4gICAgLy8gWm9vbSBpbnB1dHNcbiAgICBASW5wdXQoKSBwdWJsaWMgem9vbVJhdGlvID0gMC45O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5ab29tRGlmZmVyZW5jZSA9IDAuMTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4Wm9vbTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5ab29tOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIHVzZVpvb206IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLy8gU2NhbGUgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIG1hcmdpbjogbnVtYmVyID0gMTA7XG4gICAgQElucHV0KCkgcHVibGljIG1pblNjYWxlOiBudW1iZXIgPSAwLjE7XG4gICAgQElucHV0KCkgcHVibGljIG1heFNjYWxlOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIHNjYWxlSU4kOiBCZWhhdmlvclN1YmplY3Q8SUJyb2tlclZhbHVlPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2NhbGVPVVQkOiBCZWhhdmlvclN1YmplY3Q8SUJyb2tlclZhbHVlPjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXVpZCA9IHV1aWQoKTtcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBlbGVtZW50UmVjdDogRE9NUmVjdDtcbiAgICBwcml2YXRlIHBhcmVudFJlY3Q6IERPTVJlY3Q7XG4gICAgcHJpdmF0ZSBsYXRlc3REYXRhRnJvbUJyb2tlcjogSUJyb2tlclZhbHVlO1xuXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IGlzIHBhcmVudEVsZW1lbnQgd2lsbCBiZSBudWxsIHJlc2l6ZU9ic2VydmVyIHdpbGwgY3Jhc2hcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcmVudCBlbGVtZW50IGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnNjYWxlT1VUJCAmJiB0aGlzLnNjYWxlT1VUJCkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZUlOJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3REYXRhRnJvbUJyb2tlciA9IHsgLi4uZGF0YSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtkYXRhLnRhcmdldFZhbHVlfSlgO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tTY2FsZUJvdW5kYXJpZXMoZGF0YS50YXJnZXRWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMub25SZXNpemUoKSk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcblxuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMucGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZXNpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlY3QgPSB0aGlzLmVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLnBhcmVudFJlY3QgPSB0aGlzLnBhcmVudEVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50UmVjdCB8fCAhdGhpcy5wYXJlbnRSZWN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZVpvb20gPyB0aGlzLmFwcGx5Wm9vbSgpIDogdGhpcy5hcHBseVNjYWxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVpvb20oKSB7XG4gICAgICAgIGNvbnN0IHdpZHRoWm9vbSA9IHRoaXMucGFyZW50UmVjdC53aWR0aCAvIHRoaXMuZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodFpvb20gPSB0aGlzLnBhcmVudFJlY3QuaGVpZ2h0IC8gdGhpcy5lbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgbGV0IHpvb20gPSBNYXRoLm1pbih3aWR0aFpvb20sIGhlaWdodFpvb20pICogdGhpcy56b29tUmF0aW87XG4gICAgICAgIGlmICh0aGlzLm1pblpvb20pIHtcbiAgICAgICAgICAgIHpvb20gPSBNYXRoLm1heCh6b29tLCB0aGlzLm1pblpvb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heFpvb20pIHtcbiAgICAgICAgICAgIHpvb20gPSBNYXRoLm1pbih6b29tLCB0aGlzLm1heFpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHpvb20gLSB0aGlzLnpvb20pID4gdGhpcy5taW5ab29tRGlmZmVyZW5jZSkge1xuICAgICAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpOyAvLyBydW5uaW5nIGluc2lkZSBhbiBhbmd1bGFyIHpvbmUgZG9lc24ndCBhbHdheXMgd29ya1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVNjYWxlKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRTaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCAtIDIgKiB0aGlzLm1hcmdpbixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCAtIDIgKiB0aGlzLm1hcmdpbixcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKFxuICAgICAgICAgICAgcGFyZW50U2l6ZS53aWR0aCAvIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIHBhcmVudFNpemUuaGVpZ2h0IC8gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2NhbGVPVVQkXG4gICAgICAgICAgICA/IHRoaXMuc2NhbGVPVVQkLm5leHQoe1xuICAgICAgICAgICAgICAgICAgLi4udGhpcy5sYXRlc3REYXRhRnJvbUJyb2tlcixcbiAgICAgICAgICAgICAgICAgIHRhcmdldElEOiB0aGlzLnV1aWQsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRWYWx1ZTogaXNGaW5pdGUoc2NhbGUpID8gc2NhbGUgOiAwLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiAodGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3NjYWxlfSlgKTtcblxuICAgICAgICB0aGlzLmNoZWNrU2NhbGVCb3VuZGFyaWVzKHNjYWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrU2NhbGVCb3VuZGFyaWVzKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHNjYWxlIDwgdGhpcy5taW5TY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3RoaXMubWluU2NhbGV9KWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhTY2FsZSAmJiBzY2FsZSA+IHRoaXMubWF4U2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHt0aGlzLm1heFNjYWxlfSlgO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19