truly-ui
Version:
Web Components for Desktop Applications.
111 lines (109 loc) • 21.9 kB
JavaScript
/*
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 { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../../services/modal.service";
import * as i2 from "../../services/current-modal.service";
import * as i3 from "@angular/common";
import * as i4 from "../../../icons/icons";
export class TlModalToolbar {
constructor(modalService, changes, currentModalService) {
this.modalService = modalService;
this.changes = changes;
this.currentModalService = currentModalService;
this.containerColor = '';
this.height = '30px';
this.color = 'basic';
this.modalBoxWidth = 150;
this.limitStringBox = 12;
this.isScrolling = false;
this.subscription = new Subscription();
}
ngOnInit() {
this.subscribeFrontModal();
this.subscribeChanges();
}
subscribeFrontModal() {
this.subscription.add(this.currentModalService.currentFrontModal$.subscribe((value) => {
if (value?.activeModal) {
this.activeModal = value.activeModal;
this.changes.detectChanges();
}
}));
}
subscribeChanges() {
this.subscription.add(this.modalService.changeModal.subscribe(() => {
this.validateScroll();
this.changes.detectChanges();
}));
}
showWindow(item) {
this.modalService.showModal(item);
}
validateScroll() {
setTimeout(() => {
this.wrapper.nativeElement.offsetWidth >= this.container.nativeElement.offsetWidth ?
this.isScrolling = true : this.isScrolling = false;
}, 1);
}
handleArrowRight() {
if (this.container.nativeElement.scrollLeft < this.wrapper.nativeElement.offsetWidth) {
this.container.nativeElement.scrollLeft += 300;
}
this.handleScrollFinish();
}
handleArrowLeft() {
if (this.container.nativeElement.scrollLeft > 0) {
this.container.nativeElement.scrollLeft -= 300;
}
this.handleScrollFinish();
}
handleScrollFinish() {
const scrollLeft = this.container.nativeElement.scrollLeft + this.container.nativeElement.offsetWidth;
this.isScrolling = scrollLeft >= this.wrapper.nativeElement.offsetWidth;
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
/** @nocollapse */ TlModalToolbar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlModalToolbar, deps: [{ token: i1.ModalService }, { token: i0.ChangeDetectorRef }, { token: i2.CurrentModalService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlModalToolbar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlModalToolbar, selector: "tl-modal-toolbar", inputs: { containerColor: "containerColor", height: "height", color: "color", modalBoxWidth: "modalBoxWidth", limitStringBox: "limitStringBox" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }], ngImport: i0, template: "<div [class]=\"'container-wrapper '+ color\">\n <span [style.lineHeight]=\"height\"\n (click)=\"handleArrowLeft()\" *ngIf=\"container.scrollLeft > 0\" class=\"arrow-left\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">arrow-back</tl-icon>\n </span>\n <div #container [style.height]=\"height\" [style.background-color]=\"containerColor\" class=\"container-modals\">\n <div #wrapper class=\"wrapper-container-modals\" [style.line-height]=\"height\" [ngStyle]=\"\n {position: 'absolute'}\">\n <div class=\"container-modal-box\"\n [style.width]=\"modalBoxWidth + 'px'\"\n [style.height]=\"'calc(' + height + ' - 6px)'\"\n [style.lineHeight]=\"'calc(' + height + ' - 6px)'\"\n *ngFor=\"let item of modalService.componentList; let i = index\" (click)=\"showWindow(item.modal)\"\n [style.opacity]=\"item?.modal === modalService?.activeModal ? 1 : 0.7\">\n <span class=\"ui-container-item ui-container-icon\"><tl-icon>{{ item?.modal?.instance?.icon }}</tl-icon></span>\n <span class=\"ui-container-item ui-container-text\">{{item?.modal?.instance?.title}}</span>\n </div>\n </div>\n </div>\n <span [style.lineHeight]=\"height\" (click)=\"handleArrowRight()\" *ngIf=\"isScrolling\" class=\"arrow-right\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">arrow-forward</tl-icon>\n </span>\n</div>\n", styles: [".container-wrapper{position:relative;-webkit-user-select:none;user-select:none}.container-wrapper>.arrow-right{position:absolute;border-left:0;top:0;right:0;padding:0 5px;height:100%;box-sizing:border-box}.container-wrapper>.arrow-right:hover{cursor:pointer}.container-wrapper>.arrow-left{position:absolute;border-right:0;top:0;left:0;padding:0 5px;height:100%;z-index:100;box-sizing:border-box}.container-wrapper>.arrow-left:hover{cursor:pointer}.container-modals{width:100%;position:relative;overflow:auto;overflow-y:hidden;box-sizing:border-box}.container-modals>.wrapper-container-modals{display:inline-flex}.container-modals>.wrapper-container-modals>.container-modal-box{cursor:pointer;margin:2px 0 2px 2px;box-sizing:border-box;padding-right:5px}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-item{display:block;float:left;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:13px}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-icon{width:20%;text-align:center}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-text{width:80%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.container-modals::-webkit-scrollbar{height:0}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlModalToolbar, decorators: [{
type: Component,
args: [{ selector: 'tl-modal-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"'container-wrapper '+ color\">\n <span [style.lineHeight]=\"height\"\n (click)=\"handleArrowLeft()\" *ngIf=\"container.scrollLeft > 0\" class=\"arrow-left\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">arrow-back</tl-icon>\n </span>\n <div #container [style.height]=\"height\" [style.background-color]=\"containerColor\" class=\"container-modals\">\n <div #wrapper class=\"wrapper-container-modals\" [style.line-height]=\"height\" [ngStyle]=\"\n {position: 'absolute'}\">\n <div class=\"container-modal-box\"\n [style.width]=\"modalBoxWidth + 'px'\"\n [style.height]=\"'calc(' + height + ' - 6px)'\"\n [style.lineHeight]=\"'calc(' + height + ' - 6px)'\"\n *ngFor=\"let item of modalService.componentList; let i = index\" (click)=\"showWindow(item.modal)\"\n [style.opacity]=\"item?.modal === modalService?.activeModal ? 1 : 0.7\">\n <span class=\"ui-container-item ui-container-icon\"><tl-icon>{{ item?.modal?.instance?.icon }}</tl-icon></span>\n <span class=\"ui-container-item ui-container-text\">{{item?.modal?.instance?.title}}</span>\n </div>\n </div>\n </div>\n <span [style.lineHeight]=\"height\" (click)=\"handleArrowRight()\" *ngIf=\"isScrolling\" class=\"arrow-right\">\n <tl-icon [lib]=\"'ion'\" [style]=\"'ios'\">arrow-forward</tl-icon>\n </span>\n</div>\n", styles: [".container-wrapper{position:relative;-webkit-user-select:none;user-select:none}.container-wrapper>.arrow-right{position:absolute;border-left:0;top:0;right:0;padding:0 5px;height:100%;box-sizing:border-box}.container-wrapper>.arrow-right:hover{cursor:pointer}.container-wrapper>.arrow-left{position:absolute;border-right:0;top:0;left:0;padding:0 5px;height:100%;z-index:100;box-sizing:border-box}.container-wrapper>.arrow-left:hover{cursor:pointer}.container-modals{width:100%;position:relative;overflow:auto;overflow-y:hidden;box-sizing:border-box}.container-modals>.wrapper-container-modals{display:inline-flex}.container-modals>.wrapper-container-modals>.container-modal-box{cursor:pointer;margin:2px 0 2px 2px;box-sizing:border-box;padding-right:5px}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-item{display:block;float:left;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:13px}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-icon{width:20%;text-align:center}.container-modals>.wrapper-container-modals>.container-modal-box>.ui-container-text{width:80%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.container-modals::-webkit-scrollbar{height:0}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ModalService }, { type: i0.ChangeDetectorRef }, { type: i2.CurrentModalService }]; }, propDecorators: { containerColor: [{
type: Input
}], height: [{
type: Input
}], color: [{
type: Input
}], modalBoxWidth: [{
type: Input
}], limitStringBox: [{
type: Input
}], container: [{
type: ViewChild,
args: ['container', { static: true }]
}], wrapper: [{
type: ViewChild,
args: ['wrapper', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtdG9vbGJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL21vZGFsL2FkZG9ucy9tb2RhbC10b29sYmFyL21vZGFsLXRvb2xiYXIudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9tb2RhbC9hZGRvbnMvbW9kYWwtdG9vbGJhci9tb2RhbC10b29sYmFyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQWdCLEtBQUssRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXZJLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVNsQyxNQUFNLE9BQU8sY0FBYztJQXNCekIsWUFBb0IsWUFBMEIsRUFBVSxPQUEwQixFQUFVLG1CQUF3QztRQUFoSCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBQVUsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQXBCM0gsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFFcEIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUVoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRWhCLGtCQUFhLEdBQUcsR0FBRyxDQUFDO1FBRXBCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBTXRCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBSW5CLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUU4RixDQUFDO0lBRXpJLFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElB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Y2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TW9kYWxTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1cnJlbnRNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jdXJyZW50LW1vZGFsLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtbW9kYWwtdG9vbGJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC10b29sYmFyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJy4vbW9kYWwtdG9vbGJhci5zY3NzJyBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSApXG5leHBvcnQgY2xhc3MgVGxNb2RhbFRvb2xiYXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgY29udGFpbmVyQ29sb3IgPSAnJztcblxuICBASW5wdXQoKSBoZWlnaHQgPSAnMzBweCc7XG5cbiAgQElucHV0KCkgY29sb3IgPSAnYmFzaWMnO1xuXG4gIEBJbnB1dCgpIG1vZGFsQm94V2lkdGggPSAxNTA7XG5cbiAgQElucHV0KCkgbGltaXRTdHJpbmdCb3ggPSAxMjtcblxuICBAVmlld0NoaWxkKCAnY29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0gKSBjb250YWluZXI7XG5cbiAgQFZpZXdDaGlsZCggJ3dyYXBwZXInLCB7c3RhdGljOiB0cnVlfSApIHdyYXBwZXI7XG5cbiAgcHVibGljIGlzU2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIGFjdGl2ZU1vZGFsOiBDb21wb25lbnRSZWY8YW55PjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvciggcHVibGljIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLCBwcml2YXRlIGNoYW5nZXM6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGN1cnJlbnRNb2RhbFNlcnZpY2U6IEN1cnJlbnRNb2RhbFNlcnZpY2UgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaWJlRnJvbnRNb2RhbCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlQ2hhbmdlcygpO1xuICB9XG5cbiAgc3Vic2NyaWJlRnJvbnRNb2RhbCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoIHRoaXMuY3VycmVudE1vZGFsU2VydmljZS5jdXJyZW50RnJvbnRNb2RhbCQuc3Vic2NyaWJlKCAoIHZhbHVlOiBhbnkgKSA9PiB7XG4gICAgICBpZih2YWx1ZT8uYWN0aXZlTW9kYWwpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbCA9IHZhbHVlLmFjdGl2ZU1vZGFsO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0gKSApO1xuICB9XG5cbiAgc3Vic2NyaWJlQ2hhbmdlcygpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoIHRoaXMubW9kYWxTZXJ2aWNlLmNoYW5nZU1vZGFsLnN1YnNjcmliZSggKCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZVNjcm9sbCgpO1xuICAgICAgdGhpcy5jaGFuZ2VzLmRldGVjdENoYW5nZXMoKTtcbiAgICB9ICkgKTtcbiAgfVxuXG4gIHNob3dXaW5kb3coIGl0ZW06IENvbXBvbmVudFJlZjxhbnk+ICkge1xuICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3dNb2RhbCggaXRlbSApO1xuICB9XG5cbiAgdmFsaWRhdGVTY3JvbGwoKSB7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPj0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA/XG4gICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlIDogdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH0sIDEgKTtcbiAgfVxuXG4gIGhhbmRsZUFycm93UmlnaHQoKSB7XG4gICAgaWYgKCB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCApIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCArPSAzMDA7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlU2Nyb2xsRmluaXNoKCk7XG4gIH1cblxuICBoYW5kbGVBcnJvd0xlZnQoKSB7XG4gICAgaWYgKCB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPiAwICkge1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IC09IDMwMDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVTY3JvbGxGaW5pc2goKTtcbiAgfVxuXG4gIGhhbmRsZVNjcm9sbEZpbmlzaCgpIHtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ICsgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB0aGlzLmlzU2Nyb2xsaW5nID0gc2Nyb2xsTGVmdCA+PSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIidjb250YWluZXItd3JhcHBlciAnKyBjb2xvclwiPlxuICAgICA8c3BhbiBbc3R5bGUubGluZUhlaWdodF09XCJoZWlnaHRcIlxuICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXJyb3dMZWZ0KClcIiAqbmdJZj1cImNvbnRhaW5lci5zY3JvbGxMZWZ0ID4gMFwiIGNsYXNzPVwiYXJyb3ctbGVmdFwiPlxuICAgICAgIDx0bC1pY29uIFtsaWJdPVwiJ2lvbidcIiBbc3R5bGVdPVwiJ2lvcydcIj5hcnJvdy1iYWNrPC90bC1pY29uPlxuICAgICA8L3NwYW4+XG4gICAgPGRpdiAjY29udGFpbmVyIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29udGFpbmVyQ29sb3JcIiBjbGFzcz1cImNvbnRhaW5lci1tb2RhbHNcIj5cbiAgICAgIDxkaXYgI3dyYXBwZXIgY2xhc3M9XCJ3cmFwcGVyLWNvbnRhaW5lci1tb2RhbHNcIiBbc3R5bGUubGluZS1oZWlnaHRdPVwiaGVpZ2h0XCIgW25nU3R5bGVdPVwiXG4gICAgICB7cG9zaXRpb246ICdhYnNvbHV0ZSd9XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1tb2RhbC1ib3hcIlxuICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIm1vZGFsQm94V2lkdGggKyAncHgnXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJ2NhbGMoJyArIGhlaWdodCAgKyAnIC0gNnB4KSdcIlxuICAgICAgICAgICAgICAgW3N0eWxlLmxpbmVIZWlnaHRdPVwiJ2NhbGMoJyArIGhlaWdodCArICcgLSA2cHgpJ1wiXG4gICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtb2RhbFNlcnZpY2UuY29tcG9uZW50TGlzdDsgbGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJzaG93V2luZG93KGl0ZW0ubW9kYWwpXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cIml0ZW0/Lm1vZGFsID09PSBtb2RhbFNlcnZpY2U/LmFjdGl2ZU1vZGFsID8gMSA6IDAuN1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWNvbnRhaW5lci1pdGVtIHVpLWNvbnRhaW5lci1pY29uXCI+PHRsLWljb24+e3sgaXRlbT8ubW9kYWw/Lmluc3RhbmNlPy5pY29uIH19PC90bC1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1jb250YWluZXItaXRlbSB1aS1jb250YWluZXItdGV4dFwiPnt7aXRlbT8ubW9kYWw/Lmluc3RhbmNlPy50aXRsZX19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gW3N0eWxlLmxpbmVIZWlnaHRdPVwiaGVpZ2h0XCIgKGNsaWNrKT1cImhhbmRsZUFycm93UmlnaHQoKVwiICpuZ0lmPVwiaXNTY3JvbGxpbmdcIiBjbGFzcz1cImFycm93LXJpZ2h0XCI+XG4gICAgICA8dGwtaWNvbiBbbGliXT1cIidpb24nXCIgW3N0eWxlXT1cIidpb3MnXCI+YXJyb3ctZm9yd2FyZDwvdGwtaWNvbj5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbiJdfQ==