UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

448 lines (446 loc) 66.4 kB
/* MIT License Copyright (c) 2019 Temainfo Software 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 { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef } from '@angular/core'; import { ModalResult } from '../core/enums/modal-result'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "./addons/container-modal/container-modal.service"; import * as i2 from "./services/sidebar.service"; import * as i3 from "@angular/common"; import * as i4 from "../shortcut/shortcut.directive"; import * as i5 from "../icons/icons"; let subscribeMouseMove; let uniqueIdentifier = 0; export class TlModal { constructor(element, renderer, containerService, sidebarService, zone, change) { this.element = element; this.renderer = renderer; this.containerService = containerService; this.sidebarService = sidebarService; this.zone = zone; this.change = change; this.draggable = true; this.minimizable = true; this.maximizable = true; this.closable = true; this.icon = ''; this.title = 'My Modal'; this.color = 'basic'; this.height = '500px'; this.closeOnOK = false; this.width = '500px'; this.fullscreen = false; this.restoreMaximize = true; this.backdrop = false; this.translucent = false; this.closeShortcut = 'escape'; this.restoreShortcut = ''; this.maximizeShortcut = ''; this.showTitlebar = true; this.parentElement = null; this.show = new EventEmitter(); this.minimize = new EventEmitter(); this.maximize = new EventEmitter(); this.close = new EventEmitter(); this.id = ''; this.subscription = new Subscription(); this.status = ''; this.maximized = false; this.moving = false; this.id = `tl-modal-${uniqueIdentifier++}`; } ngOnInit() { this.listenSidebarChange(); this.resizeListener(); this.validateProperty(); this.show.emit(); } ngAfterViewInit() { this.getBoundingContent(); this.setDefaultDimensions(); this.validateMeasureParentAndModal(); this.handleInitialPositionModal(); this.handleFullscreen(); } listenSidebarChange() { this.subscription.add(this.sidebarService.changes.subscribe(() => { this.handleChangeSidebarWhenMaximized(); })); } handleChangeSidebarWhenMaximized() { setTimeout(() => { this.getBoundingContent(); this.setPosition(); this.handleInitialPositionModal(); this.setOffsetLeftModal(this.modal.nativeElement.getBoundingClientRect().left); this.setOffsetTopModal(this.modal.nativeElement.getBoundingClientRect().top); if (this.maximized) { this.maximized = false; this.maximizeModal(); } }, 250); } handleInitialPositionModal() { if (this.parentElement) { this.setModalCenterParent(); return; } this.setModalCenterWindow(); } handleFullscreen() { if (this.fullscreen) { this.maximizeModal(); } } resizeListener() { this.subscribeResize = this.renderer.listen(window, 'resize', () => { this.getBoundingContent(); this.setModalCenterWindow(); this.maximizeModal(); }); } addTransitionModal() { this.renderer.setStyle(this.modal.nativeElement, 'transition', 'all 150ms ease-in-out'); } mousemoveListener() { this.removeTransitionModal(); this.zone.runOutsideAngular(() => { subscribeMouseMove = this.renderer.listen(window, 'mousemove', (event) => { if (!(this.moving && this.draggable)) { return; } if (this.isMouseOutOfTheWindowRight(event)) { this.setOffsetLeftModal(window.innerWidth - this.modal.nativeElement.offsetWidth); this.setMousePressX(window.innerWidth); } if (this.isMouseOutOfTheWindowLeft(event)) { this.setOffsetLeftModal(this.getBoundingParentElement().left); this.setMousePressX(this.getBoundingParentElement().left); } this.positionMouseMoveX = event.clientX; this.positionMouseMoveY = event.clientY; this.setPosition(); }); }); } mouseupListener() { if (subscribeMouseMove) { subscribeMouseMove(); } this.addTransitionModal(); this.moving = false; } removeTransitionModal() { this.renderer.removeStyle(this.modal.nativeElement, 'transition'); } mouseDown($event) { if (!this.maximized) { this.setOffsetLeftModal(this.modal.nativeElement.getBoundingClientRect().left); this.setOffsetTopModal(this.modal.nativeElement.getBoundingClientRect().top); this.setMousePressX($event.clientX); this.setMousePressY($event.clientY); this.moving = true; } } validateProperty() { if (!this.restoreMaximize && !this.fullscreen) { throw new EvalError('The [restoreMaximize] property require [fullscreen] property as TRUE.'); } } validateMeasureParentAndModal() { if ((this.parent.offsetWidth < this.modal.nativeElement.offsetWidth) || (this.parent.offsetHeight < this.modal.nativeElement.offsetHeight)) { console.warn('The Width or Height of Parent Element are less than Width or Height of Modal, ' + 'this could result in glitches and not working as expected.'); } } getModalPosition() { this.modalLeft = this.modal.nativeElement.offsetLeft; this.modalTop = this.modal.nativeElement.offsetTop; } setModalCenterParent() { this.modal.nativeElement.style.left = this.offsetLeftContent + (this.parent.offsetWidth / 2) - (this.modal.nativeElement.offsetWidth / 2) + 'px'; this.modal.nativeElement.style.top = (this.offsetTopContent) + (this.parent.offsetHeight / 2) - (this.modal.nativeElement.offsetHeight / 2) + 'px'; } setModalCenterWindow() { this.modal.nativeElement.style.left = (window.innerWidth / 2) - (this.modal.nativeElement.offsetWidth / 2) + 'px'; this.modal.nativeElement.style.top = (window.innerHeight / 2) - (this.modal.nativeElement.offsetHeight / 2) + 'px'; } setComponentRef(component) { this.componentRef = component; } setMousePressX(position) { this.mousePressX = position; } setMousePressY(position) { this.mousePressY = position; } setPosition() { this.setLeftPosition(); this.setTopPosition(); this.setDefaultDimensions(); } setLeftPosition() { if (this.isOutOfWindowX()) { return this.setLeftLimitOfArea(); } if (this.isOutOfWindowOnLeft()) { return this.setContentLeftPosition(); } this.setNewLeftPosition(); } setTopPosition() { if (this.isOutOfWindowY()) { return this.setTopLimitOfArea(); } if (this.isOutOfWindowOnTop()) { return this.setContentTopPosition(); } this.setNewTopPosition(); } setOptions(options) { const self = this; Object.keys(options).forEach(function (key) { self[key] = options[key]; }); } setIdentifier(id) { if (id) { this.id = id; } } setParentElement(parentElement) { if (!this.parentElement) { this.parentElement = parentElement; } } setLeftLimitOfArea() { return this.modal.nativeElement.style.left = (this.parent.offsetWidth - this.modal.nativeElement.offsetWidth) + this.offsetLeftContent + 'px'; } setTopLimitOfArea() { return this.modal.nativeElement.style.top = (this.parent.offsetHeight - this.modal.nativeElement.offsetHeight) + (this.offsetTopContent) + 'px'; } setOffsetLeftModal(offset) { this.offsetLeftModal = offset; } setOffsetTopModal(offset) { this.offsetTopModal = offset; } setContentTopPosition() { this.modal.nativeElement.style.top = this.offsetTopContent + 'px'; } setContentLeftPosition() { this.modal.nativeElement.style.left = this.offsetLeftContent + 'px'; } setNewTopPosition() { this.modal.nativeElement.style.top = this.offsetTopModal + this.positionMouseMoveY - this.mousePressY + 'px'; } setNewLeftPosition() { this.modal.nativeElement.style.left = this.offsetLeftModal + this.positionMouseMoveX - this.mousePressX + 'px'; } setServiceControl(service) { this.serviceControl = service; } setDefaultDimensions() { if (this.height && this.width) { this.modal.nativeElement.style.height = this.height; this.modal.nativeElement.style.width = this.width; } else if (this.getBoundingParentElement()) { this.modal.nativeElement.style.height = this.getBoundingParentElement().height + 'px'; this.modal.nativeElement.style.width = this.getBoundingParentElement().width + 'px'; } else { this.modal.nativeElement.style.height = '500px'; this.modal.nativeElement.style.width = '500px'; } } setCurrentPosition() { this.modal.nativeElement.style.left = this.modalLeft + 'px'; this.modal.nativeElement.style.top = this.modalTop + 'px'; } isMouseOutOfTheWindowLeft(event) { return event.clientX < this.offsetLeftContent; } setActive() { this.serviceControl.setActiveModal(this.componentRef); } getElementModal() { return this.modal; } isMouseOutOfTheWindowRight(event) { return event.clientX >= window.innerWidth - 1; } isOutOfWindowOnLeft() { return this.positionX < this.offsetLeftContent; } isOutOfWindowOnTop() { return this.positionY < this.offsetTopContent; } isOutOfWindowX() { this.positionX = this.offsetLeftModal + this.positionMouseMoveX - this.mousePressX; return this.positionX >= (this.parent.offsetWidth - this.modal.nativeElement.offsetWidth) + this.offsetLeftContent; } isOutOfWindowY() { this.positionY = this.offsetTopModal + this.positionMouseMoveY - this.mousePressY; return this.positionY >= ((this.parent.offsetHeight - this.modal.nativeElement.offsetHeight) + this.offsetTopContent); } minimizeModal() { if (!(this.minimizable)) { return; } this.serviceControl.minimize(this.componentRef); this.minimize.emit(this.componentRef.instance); } closeModal() { if (this.closable) { this.serviceControl.execCallBack({ mdResult: ModalResult.MRCLOSE }, this.id); this.close.emit(this.componentRef.instance); } } maximizeModal() { if (!(this.maximizable)) { return; } if (!this.maximized) { this.getModalPosition(); this.setModalLeftPosition(); this.setModalTopPosition(); this.setModalWidth(); this.setModalHeight(); this.maximized = true; this.moving = false; this.maximize.emit(); this.change.detectChanges(); return; } this.restoreMaximizeModal(); } setModalLeftPosition() { this.modal.nativeElement.style.left = this.getBoundingParentElement().left + 'px'; } setModalTopPosition() { this.modal.nativeElement.style.top = this.getBoundingParentElement().top + (this.hasScroll() ? window.scrollY : 0) + 'px'; } setModalWidth() { this.modal.nativeElement.style.width = this.getBoundingParentElement().width + 'px'; } setModalHeight() { this.modal.nativeElement.style.height = this.hasScroll() ? this.getHeightOfWindow() : this.getBoundingParentElement().height + 'px'; } getHeightOfWindow() { return (window.innerHeight - this.modal.nativeElement.offsetTop) + 'px'; } hasScroll() { return (!this.parentElement) && (this.parent.offsetHeight > window.innerHeight); } restoreMaximizeModal() { if (this.restoreMaximize) { this.setDefaultDimensions(); this.setCurrentPosition(); this.maximized = false; } } getBoundingParentElement() { return this.parent.getBoundingClientRect(); } getBoundingContent() { this.parent = !this.parentElement ? this.containerService.view.element.nativeElement : this.parentElement; this.offsetLeftContent = this.parent.getBoundingClientRect().left; this.offsetTopContent = this.parent.getBoundingClientRect().top; } ngOnDestroy() { if (this.subscribeResize) { this.subscribeResize(); } this.change.detach(); this.subscription.unsubscribe(); } } /** @nocollapse */ TlModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlModal, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ContainerModalService }, { token: i2.SidebarService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlModal, selector: "tl-modal", inputs: { draggable: "draggable", minimizable: "minimizable", maximizable: "maximizable", closable: "closable", icon: "icon", title: "title", color: "color", height: "height", closeOnOK: "closeOnOK", width: "width", fullscreen: "fullscreen", restoreMaximize: "restoreMaximize", backdrop: "backdrop", translucent: "translucent", closeShortcut: "closeShortcut", restoreShortcut: "restoreShortcut", maximizeShortcut: "maximizeShortcut", showTitlebar: "showTitlebar", parentElement: "parentElement" }, outputs: { show: "show", minimize: "minimize", maximize: "maximize", close: "close" }, viewQueries: [{ propertyName: "headerBox", first: true, predicate: ["headerBox"], descendants: true, static: true }, { propertyName: "modal", first: true, predicate: ["modal"], descendants: true, static: true }, { propertyName: "body", first: true, predicate: ["body"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div #modal\n (mousedown)=\"mousemoveListener();\n setActive();\"\n (mouseup)=\"mouseupListener()\"\n [ngStyle]=\"{'background-color': translucent ? 'transparent': 'null'}\"\n [class]=\"'tl-modal-container ' + color\">\n <div *ngIf=\"showTitlebar\" class=\"header\" #headerBox>\n <div class=\"bar\"\n [ngClass]=\"serviceControl.activeModal === componentRef ? '-active' : '-inactive'\"\n (mousedown)=\"mouseDown($event);\"\n (dblclick)=\"maximizeModal()\">\n <span class=\"ui-icon\"><tl-icon>{{ icon }}</tl-icon></span>\n <span class=\"ui-title\">{{title}}</span>\n </div>\n <div class=\"controls\" [ngClass]=\"serviceControl.activeModal === componentRef ? '-active' : '-inactive'\">\n <div class=\"control-item\"\n [ngClass]=\"{'disabled': !minimizable}\"\n (click)=\"minimizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!minimizable\">remove</tl-icon>\n </div>\n\n <div class=\"control-item\" *ngIf=\"!maximized\"\n [ngClass]=\"{'disabled': !maximizable}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"maximizeShortcut\"\n (click)=\"maximizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!maximizable\">expand</tl-icon>\n </div>\n\n <div class=\"control-item\" *ngIf=\"maximized\"\n [ngClass]=\"{'disabled': !restoreMaximize}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"restoreShortcut\"\n (click)=\"restoreMaximizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!restoreMaximize\">contract</tl-icon>\n </div>\n\n <div class=\"control-item\"\n [ngClass]=\"{'disabled': !closable}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"closeShortcut\"\n (click)=\"closeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!closable\">close</tl-icon>\n </div>\n </div>\n </div>\n <div class=\"body\" #body></div>\n <ng-content></ng-content>\n</div>\n", styles: [".tl-modal-container{margin:0 auto;padding:0 auto;position:fixed;width:500px;height:500px;box-sizing:content-box;border-radius:3px;cursor:default;border-top:0}.tl-modal-container>.header{display:flex;-webkit-user-select:none;user-select:none;height:34px}.tl-modal-container>.header .ui-title{text-align:left;line-height:34px;-webkit-user-select:none;user-select:none;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:13px}.tl-modal-container>.header .bar{width:100%;cursor:default}.tl-modal-container>.header .controls{right:.1px;width:90px;-webkit-user-select:none;user-select:none;display:flex;flex-wrap:nowrap;justify-content:center;align-items:center}.tl-modal-container>.header .controls .control-item{text-align:center;width:30px;left:5px;margin:0;font-size:13px}.tl-modal-container>.header .controls .control-item .disabled{opacity:.4}.tl-modal-container>.header .controls .control-item:hover:not(.disabled){cursor:pointer}.tl-modal-container>.header .controls tl-icon{line-height:34px;text-align:center}.tl-modal-container>.header .ui-icon tl-icon{padding:7px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.ShortcutDirective, selector: "[shortcut]", inputs: ["shortcut"] }, { kind: "component", type: i5.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlModal, decorators: [{ type: Component, args: [{ selector: 'tl-modal', template: "<div #modal\n (mousedown)=\"mousemoveListener();\n setActive();\"\n (mouseup)=\"mouseupListener()\"\n [ngStyle]=\"{'background-color': translucent ? 'transparent': 'null'}\"\n [class]=\"'tl-modal-container ' + color\">\n <div *ngIf=\"showTitlebar\" class=\"header\" #headerBox>\n <div class=\"bar\"\n [ngClass]=\"serviceControl.activeModal === componentRef ? '-active' : '-inactive'\"\n (mousedown)=\"mouseDown($event);\"\n (dblclick)=\"maximizeModal()\">\n <span class=\"ui-icon\"><tl-icon>{{ icon }}</tl-icon></span>\n <span class=\"ui-title\">{{title}}</span>\n </div>\n <div class=\"controls\" [ngClass]=\"serviceControl.activeModal === componentRef ? '-active' : '-inactive'\">\n <div class=\"control-item\"\n [ngClass]=\"{'disabled': !minimizable}\"\n (click)=\"minimizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!minimizable\">remove</tl-icon>\n </div>\n\n <div class=\"control-item\" *ngIf=\"!maximized\"\n [ngClass]=\"{'disabled': !maximizable}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"maximizeShortcut\"\n (click)=\"maximizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!maximizable\">expand</tl-icon>\n </div>\n\n <div class=\"control-item\" *ngIf=\"maximized\"\n [ngClass]=\"{'disabled': !restoreMaximize}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"restoreShortcut\"\n (click)=\"restoreMaximizeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!restoreMaximize\">contract</tl-icon>\n </div>\n\n <div class=\"control-item\"\n [ngClass]=\"{'disabled': !closable}\"\n [ngStyle]=\"{'zIndex': modal.style.zIndex}\"\n [shortcut]=\"closeShortcut\"\n (click)=\"closeModal()\">\n <tl-icon [lib]=\"'ion'\" [class.disabled]=\"!closable\">close</tl-icon>\n </div>\n </div>\n </div>\n <div class=\"body\" #body></div>\n <ng-content></ng-content>\n</div>\n", styles: [".tl-modal-container{margin:0 auto;padding:0 auto;position:fixed;width:500px;height:500px;box-sizing:content-box;border-radius:3px;cursor:default;border-top:0}.tl-modal-container>.header{display:flex;-webkit-user-select:none;user-select:none;height:34px}.tl-modal-container>.header .ui-title{text-align:left;line-height:34px;-webkit-user-select:none;user-select:none;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:13px}.tl-modal-container>.header .bar{width:100%;cursor:default}.tl-modal-container>.header .controls{right:.1px;width:90px;-webkit-user-select:none;user-select:none;display:flex;flex-wrap:nowrap;justify-content:center;align-items:center}.tl-modal-container>.header .controls .control-item{text-align:center;width:30px;left:5px;margin:0;font-size:13px}.tl-modal-container>.header .controls .control-item .disabled{opacity:.4}.tl-modal-container>.header .controls .control-item:hover:not(.disabled){cursor:pointer}.tl-modal-container>.header .controls tl-icon{line-height:34px;text-align:center}.tl-modal-container>.header .ui-icon tl-icon{padding:7px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ContainerModalService }, { type: i2.SidebarService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { draggable: [{ type: Input }], minimizable: [{ type: Input }], maximizable: [{ type: Input }], closable: [{ type: Input }], icon: [{ type: Input }], title: [{ type: Input }], color: [{ type: Input }], height: [{ type: Input }], closeOnOK: [{ type: Input }], width: [{ type: Input }], fullscreen: [{ type: Input }], restoreMaximize: [{ type: Input }], backdrop: [{ type: Input }], translucent: [{ type: Input }], closeShortcut: [{ type: Input }], restoreShortcut: [{ type: Input }], maximizeShortcut: [{ type: Input }], showTitlebar: [{ type: Input }], parentElement: [{ type: Input }], headerBox: [{ type: ViewChild, args: ['headerBox', { static: true }] }], modal: [{ type: ViewChild, args: ['modal', { static: true }] }], body: [{ type: ViewChild, args: ['body', { read: ViewContainerRef, static: true }] }], show: [{ type: Output }], minimize: [{ type: Output }], maximize: [{ type: Output }], close: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL21vZGFsL21vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUdMLFNBQVMsRUFHVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd2RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBRWxDLElBQUksa0JBQWtCLENBQUM7QUFFdkIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFPekIsTUFBTSxPQUFPLE9BQU87SUFrR2xCLFlBQXFCLE9BQW1CLEVBQVUsUUFBbUIsRUFDaEQsZ0JBQXVDLEVBQ3ZDLGNBQThCLEVBQzlCLElBQVksRUFDWixNQUF5QjtRQUp6QixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNoRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXVCO1FBQ3ZDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFwR3JDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFakIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRVYsVUFBSyxHQUFHLFVBQVUsQ0FBQztRQUVu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VUFBVTsrT0FNWCxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVvQyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFFLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRUQsS0FBSztzQkFBMUMsU0FBUzt1QkFBRSxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUU0QixJQUFJO3NCQUFsRSxTQUFTO3VCQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVsRCxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFFRyxRQUFRO3NCQUFqQixNQUFNO2dCQUVHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gTUlUIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250YWluZXJNb2RhbFNlcnZpY2V9IGZyb20gJy4vYWRkb25zL2NvbnRhaW5lci1tb2RhbC9jb250YWluZXItbW9kYWwuc2VydmljZSc7XG5pbXBvcnQge01vZGFsU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7TW9kYWxSZXN1bHR9IGZyb20gJy4uL2NvcmUvZW51bXMvbW9kYWwtcmVzdWx0JztcbmltcG9ydCB7TW9kYWxPcHRpb25zfSBmcm9tICcuL2ludGVyZmFjZXMvbW9kYWwtb3B0aW9ucyc7XG5pbXBvcnQge1NpZGViYXJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL3NpZGViYXIuc2VydmljZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbmxldCBzdWJzY3JpYmVNb3VzZU1vdmU7XG5cbmxldCB1bmlxdWVJZGVudGlmaWVyID0gMDtcblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJy4vbW9kYWwuc2NzcycgXSxcbn0gKVxuZXhwb3J0IGNsYXNzIFRsTW9kYWwgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE1vZGFsT3B0aW9ucywgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBkcmFnZ2FibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG1pbmltaXphYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBtYXhpbWl6YWJsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgY2xvc2FibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGljb24gPSAnJztcblxuICBASW5wdXQoKSB0aXRsZSA9ICdNeSBNb2RhbCc7XG5cbiAgQElucHV0KCkgY29sb3IgPSAnYmFzaWMnO1xuXG4gIEBJbnB1dCgpIGhlaWdodCA9ICc1MDBweCc7XG5cbiAgQElucHV0KCkgY2xvc2VPbk9LID0gZmFsc2U7XG5cbiAgQElucHV0KCkgd2lkdGggPSAnNTAwcHgnO1xuXG4gIEBJbnB1dCgpIGZ1bGxzY3JlZW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSByZXN0b3JlTWF4aW1pemUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGJhY2tkcm9wID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdHJhbnNsdWNlbnQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBjbG9zZVNob3J0Y3V0ID0gJ2VzY2FwZSc7XG5cbiAgQElucHV0KCkgcmVzdG9yZVNob3J0Y3V0ID0gJyc7XG5cbiAgQElucHV0KCkgbWF4aW1pemVTaG9ydGN1dCA9ICcnO1xuXG4gIEBJbnB1dCgpIHNob3dUaXRsZWJhciA9IHRydWU7XG5cbiAgQElucHV0KCkgcGFyZW50RWxlbWVudCA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZCggJ2hlYWRlckJveCcsIHtzdGF0aWM6IHRydWV9ICkgaGVhZGVyQm94OiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoICdtb2RhbCcsIHtzdGF0aWM6IHRydWV9ICkgbW9kYWw6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCggJ2JvZHknLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9ICkgYm9keTogVmlld0NvbnRhaW5lclJlZjtcblxuICBAT3V0cHV0KCkgc2hvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIG1pbmltaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgbWF4aW1pemU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBjbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRsTW9kYWw+O1xuXG4gIHB1YmxpYyBpZCA9ICcnO1xuXG4gIHB1YmxpYyBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHVibGljIHN0YXR1cyA9ICcnO1xuXG4gIHB1YmxpYyBpbmRleDtcblxuICBwdWJsaWMgc2VydmljZUNvbnRyb2w6IE1vZGFsU2VydmljZTtcblxuICBwdWJsaWMgbWF4aW1pemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBtb3VzZVByZXNzWDtcblxuICBwcml2YXRlIG1vdXNlUHJlc3NZO1xuXG4gIHByaXZhdGUgcG9zaXRpb25Nb3VzZU1vdmVYO1xuXG4gIHByaXZhdGUgcG9zaXRpb25Nb3VzZU1vdmVZO1xuXG4gIHByaXZhdGUgbW92aW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBvZmZzZXRMZWZ0Q29udGVudDtcblxuICBwcml2YXRlIG9mZnNldFRvcENvbnRlbnQ7XG5cbiAgcHJpdmF0ZSBvZmZzZXRMZWZ0TW9kYWw7XG5cbiAgcHJpdmF0ZSBvZmZzZXRUb3BNb2RhbDtcblxuICBwcml2YXRlIHBhcmVudDtcblxuICBwcml2YXRlIG1vZGFsTGVmdDtcblxuICBwcml2YXRlIG1vZGFsVG9wO1xuXG4gIHByaXZhdGUgcG9zaXRpb25YO1xuXG4gIHByaXZhdGUgcG9zaXRpb25ZO1xuXG4gIHByaXZhdGUgc3Vic2NyaWJlUmVzaXplO1xuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgY29udGFpbmVyU2VydmljZTogQ29udGFpbmVyTW9kYWxTZXJ2aWNlLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBzaWRlYmFyU2VydmljZTogU2lkZWJhclNlcnZpY2UsXG4gICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuaWQgPSBgdGwtbW9kYWwtJHt1bmlxdWVJZGVudGlmaWVyKyt9YDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubGlzdGVuU2lkZWJhckNoYW5nZSgpO1xuICAgIHRoaXMucmVzaXplTGlzdGVuZXIoKTtcbiAgICB0aGlzLnZhbGlkYXRlUHJvcGVydHkoKTtcbiAgICB0aGlzLnNob3cuZW1pdCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZ2V0Qm91bmRpbmdDb250ZW50KCk7XG4gICAgdGhpcy5zZXREZWZhdWx0RGltZW5zaW9ucygpO1xuICAgIHRoaXMudmFsaWRhdGVNZWFzdXJlUGFyZW50QW5kTW9kYWwoKTtcbiAgICB0aGlzLmhhbmRsZUluaXRpYWxQb3NpdGlvbk1vZGFsKCk7XG4gICAgdGhpcy5oYW5kbGVGdWxsc2NyZWVuKCk7XG4gIH1cblxuICBsaXN0ZW5TaWRlYmFyQ2hhbmdlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNpZGViYXJTZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlU2lkZWJhcldoZW5NYXhpbWl6ZWQoKTtcbiAgICB9KSk7XG4gIH1cblxuICBoYW5kbGVDaGFuZ2VTaWRlYmFyV2hlbk1heGltaXplZCgpIHtcbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICB0aGlzLmdldEJvdW5kaW5nQ29udGVudCgpO1xuICAgICAgdGhpcy5zZXRQb3NpdGlvbigpO1xuICAgICAgdGhpcy5oYW5kbGVJbml0aWFsUG9zaXRpb25Nb2RhbCgpO1xuICAgICAgdGhpcy5zZXRPZmZzZXRMZWZ0TW9kYWwoIHRoaXMubW9kYWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICk7XG4gICAgICB0aGlzLnNldE9mZnNldFRvcE1vZGFsKCB0aGlzLm1vZGFsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICk7XG4gICAgICBpZiAoIHRoaXMubWF4aW1pemVkICkge1xuICAgICAgICB0aGlzLm1heGltaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1heGltaXplTW9kYWwoKTtcbiAgICAgIH1cbiA