UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

95 lines (93 loc) 21.1 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, Input, ContentChildren, Output, EventEmitter } from '@angular/core'; import { OverlayAnimation } from '../core/directives/overlay-animation'; import { TlSplitButtonAction } from './parts/splitbutton-action'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/cdk/overlay"; import * as i3 from "../button/button"; import * as i4 from "../icons/icons"; export class TlSplitButton { constructor(change) { this.change = change; this.text = ''; this.width = '100%'; this.height = '30px'; this.disabled = null; this.color = 'basic'; this.click = new EventEmitter(); this.positionOverlay = 'bottom'; this.listItems = []; } ngAfterContentInit() { this.listItems = this.actions.map((item) => item.templateList); this.actions.forEach((item) => item.click.subscribe(() => this.isOpen = false)); } onPositionChange($event) { this.positionOverlay = $event.connectionPair.originY; this.change.detectChanges(); } get disabledActions() { return this.actions.filter((item) => item.disabled).length === this.actions.length; } open($event) { this.stopEvent($event); if (!this.disabledActions) { this.isOpen = !this.isOpen; } } stopEvent($event) { $event.preventDefault(); $event.stopPropagation(); } onButtonClick($event) { if (!this.disabled) { this.click.emit($event); } this.stopEvent($event); } onBackdropClick() { this.isOpen = false; this.change.detectChanges(); } } /** @nocollapse */ TlSplitButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlSplitButton, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlSplitButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlSplitButton, selector: "tl-split-button", inputs: { text: "text", width: "width", height: "height", disabled: "disabled", color: "color" }, outputs: { click: "click" }, queries: [{ propertyName: "actions", predicate: TlSplitButtonAction }], ngImport: i0, template: "<div class=\"split-wrapper\" [ngClass]=\"color\" (click)=\"onButtonClick($event)\">\n <div class=\"split-content\" #split>\n <tl-button cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n [color]=\"color\"\n [text]=\"text\"\n [disabled]=\"disabled\"\n [width]=\"width\"\n [height]=\"height\">\n </tl-button>\n <div [class.active]=\"isOpen\"\n (click)=\"open($event)\"\n [class.disabled]=\"disabledActions\"\n class=\"split-button-actions\"\n [ngStyle]=\"{'height': height, 'line-height': height}\">\n <div class=\"icon-arrow\" [style.transform]=\"isOpen ? 'rotate(180deg)' : 'rotate(0)'\">\n <tl-icon [lib]=\"'fa'\" [style]=\"'fas'\">chevron-down</tl-icon>\n </div>\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onBackdropClick()\"\n (positionChange)=\"onPositionChange($event)\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <ul @overlay\n [style.minWidth]=\"split.offsetWidth + 'px'\"\n [class.margin-top]=\"positionOverlay === 'bottom'\"\n [class.margin-bottom]=\"positionOverlay === 'top'\"\n class=\"actions-menu\">\n <ng-container *ngFor=\"let item of listItems\">\n <ng-container *ngTemplateOutlet=\"item\"></ng-container>\n </ng-container>\n </ul>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".tl-button{border-radius:3px 0 0 3px}.split-wrapper{display:inline-block;position:relative}.split-wrapper>.split-content{display:flex}.split-wrapper>.split-content>::ng-deep tl-button button{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.split-wrapper>.split-content>.split-button-actions{margin:0;padding:0;cursor:pointer;float:right;-webkit-user-select:none;user-select:none;border-top-right-radius:3px;border-bottom-right-radius:3px;box-sizing:border-box}.split-wrapper>.split-content>.split-button-actions tl-icon{padding:0 15px}.split-wrapper>.split-content>.ui-button:hover{cursor:pointer}.icon-arrow{transition:transform .25s ease-in-out}.actions-menu{position:relative;left:0;margin:0;padding:0;height:auto;display:inline;overflow:hidden;list-style:none;box-shadow:0 0 3px #c1c1c166;z-index:1;cursor:auto;border-radius:3px;box-sizing:border-box}.actions-menu.margin-top{margin-top:2px}.actions-menu.margin-bottom{margin-bottom:2px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i3.TlButton, selector: "tl-button", inputs: ["text", "iconAddonBefore", "iconAddonAfter", "iconBeforeText", "iconAfterText", "height", "width", "disabled", "flatBorder", "colorIconBefore", "colorIconAfter", "template", "outline", "color", "loaderColor", "isLoading", "indexShortcut", "textLoading"], outputs: ["selected"] }, { kind: "component", type: i4.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }], animations: [OverlayAnimation] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlSplitButton, decorators: [{ type: Component, args: [{ selector: 'tl-split-button', animations: [OverlayAnimation], template: "<div class=\"split-wrapper\" [ngClass]=\"color\" (click)=\"onButtonClick($event)\">\n <div class=\"split-content\" #split>\n <tl-button cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\n [color]=\"color\"\n [text]=\"text\"\n [disabled]=\"disabled\"\n [width]=\"width\"\n [height]=\"height\">\n </tl-button>\n <div [class.active]=\"isOpen\"\n (click)=\"open($event)\"\n [class.disabled]=\"disabledActions\"\n class=\"split-button-actions\"\n [ngStyle]=\"{'height': height, 'line-height': height}\">\n <div class=\"icon-arrow\" [style.transform]=\"isOpen ? 'rotate(180deg)' : 'rotate(0)'\">\n <tl-icon [lib]=\"'fa'\" [style]=\"'fas'\">chevron-down</tl-icon>\n </div>\n <ng-template cdkConnectedOverlay\n (backdropClick)=\"onBackdropClick()\"\n (positionChange)=\"onPositionChange($event)\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayOpen]=\"isOpen\">\n <ul @overlay\n [style.minWidth]=\"split.offsetWidth + 'px'\"\n [class.margin-top]=\"positionOverlay === 'bottom'\"\n [class.margin-bottom]=\"positionOverlay === 'top'\"\n class=\"actions-menu\">\n <ng-container *ngFor=\"let item of listItems\">\n <ng-container *ngTemplateOutlet=\"item\"></ng-container>\n </ng-container>\n </ul>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".tl-button{border-radius:3px 0 0 3px}.split-wrapper{display:inline-block;position:relative}.split-wrapper>.split-content{display:flex}.split-wrapper>.split-content>::ng-deep tl-button button{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.split-wrapper>.split-content>.split-button-actions{margin:0;padding:0;cursor:pointer;float:right;-webkit-user-select:none;user-select:none;border-top-right-radius:3px;border-bottom-right-radius:3px;box-sizing:border-box}.split-wrapper>.split-content>.split-button-actions tl-icon{padding:0 15px}.split-wrapper>.split-content>.ui-button:hover{cursor:pointer}.icon-arrow{transition:transform .25s ease-in-out}.actions-menu{position:relative;left:0;margin:0;padding:0;height:auto;display:inline;overflow:hidden;list-style:none;box-shadow:0 0 3px #c1c1c166;z-index:1;cursor:auto;border-radius:3px;box-sizing:border-box}.actions-menu.margin-top{margin-top:2px}.actions-menu.margin-bottom{margin-bottom:2px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { text: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], disabled: [{ type: Input }], color: [{ type: Input }], click: [{ type: Output }], actions: [{ type: ContentChildren, args: [TlSplitButtonAction] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXRidXR0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9zcGxpdGJ1dHRvbi9zcGxpdGJ1dHRvbi50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3NwbGl0YnV0dG9uL3NwbGl0YnV0dG9uLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsZUFBZSxFQUVJLE1BQU0sRUFBRSxZQUFZLEVBQ3hDLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFTL0QsTUFBTSxPQUFPLGFBQWE7SUFzQnhCLFlBQW9CLE1BQXlCO1FBQXpCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBcEJwQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRVYsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUVmLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFaEIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUV6QixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRWYsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBTWpELG9CQUFlLEdBQUcsUUFBUSxDQUFDO1FBRTNCLGNBQVMsR0FBRyxFQUFFLENBQUM7SUFHdEIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUUsSUFBSSxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBc0M7UUFDckQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNyRixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU07UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFHO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFNO1FBQ2QsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQU07UUFDbEIsSUFBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUc7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDOzs4SEE3RFUsYUFBYTtrSEFBYixhQUFhLDhNQWNQLG1CQUFtQiw2QkN0RHRDLDhxREFxQ0Esc2lHRENjLENBQUMsZ0JBQWdCLENBQUM7NEZBRW5CLGFBQWE7a0JBTnpCLFNBQVM7K0JBQ0UsaUJBQWlCLGNBR2YsQ0FBQyxnQkFBZ0IsQ0FBQzt3R0FJckIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNO2dCQUUrQixPQUFPO3NCQUE1QyxlQUFlO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gTUlUIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIENoYW5nZURldGVjdG9yUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtPdmVybGF5QW5pbWF0aW9ufSBmcm9tICcuLi9jb3JlL2RpcmVjdGl2ZXMvb3ZlcmxheS1hbmltYXRpb24nO1xuaW1wb3J0IHtUbFNwbGl0QnV0dG9uQWN0aW9ufSBmcm9tICcuL3BhcnRzL3NwbGl0YnV0dG9uLWFjdGlvbic7XG5pbXBvcnQge0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0bC1zcGxpdC1idXR0b24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BsaXRidXR0b24uaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwbGl0YnV0dG9uLnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW092ZXJsYXlBbmltYXRpb25dXG59KVxuZXhwb3J0IGNsYXNzIFRsU3BsaXRCdXR0b24gaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcblxuICBASW5wdXQoKSB0ZXh0ID0gJyc7XG5cbiAgQElucHV0KCkgd2lkdGggPSAnMTAwJSc7XG5cbiAgQElucHV0KCkgaGVpZ2h0ID0gJzMwcHgnO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gbnVsbDtcblxuICBASW5wdXQoKSBjb2xvciA9ICdiYXNpYyc7XG5cbiAgQE91dHB1dCgpIGNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAQ29udGVudENoaWxkcmVuKFRsU3BsaXRCdXR0b25BY3Rpb24pIGFjdGlvbnM6IFF1ZXJ5TGlzdDxUbFNwbGl0QnV0dG9uQWN0aW9uPjtcblxuICBwdWJsaWMgaXNPcGVuOiBib29sZWFuO1xuXG4gIHB1YmxpYyBwb3NpdGlvbk92ZXJsYXkgPSAnYm90dG9tJztcblxuICBwdWJsaWMgbGlzdEl0ZW1zID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2U6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5saXN0SXRlbXMgPSB0aGlzLmFjdGlvbnMubWFwKCggaXRlbSApID0+IGl0ZW0udGVtcGxhdGVMaXN0ICk7XG4gICAgdGhpcy5hY3Rpb25zLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0uY2xpY2suc3Vic2NyaWJlKCgpID0+IHRoaXMuaXNPcGVuID0gZmFsc2UpKTtcbiAgfVxuXG4gIG9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50OiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpIHtcbiAgICB0aGlzLnBvc2l0aW9uT3ZlcmxheSA9ICRldmVudC5jb25uZWN0aW9uUGFpci5vcmlnaW5ZO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZGlzYWJsZWQpLmxlbmd0aCA9PT0gdGhpcy5hY3Rpb25zLmxlbmd0aDtcbiAgfVxuXG4gIG9wZW4oJGV2ZW50KSB7XG4gICAgdGhpcy5zdG9wRXZlbnQoJGV2ZW50KTtcbiAgICBpZiAoICF0aGlzLmRpc2FibGVkQWN0aW9ucyApIHtcbiAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgIH1cbiAgfVxuXG4gIHN0b3BFdmVudCgkZXZlbnQpIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKCRldmVudCkge1xuICAgIGlmICggIXRoaXMuZGlzYWJsZWQgKSB7XG4gICAgICB0aGlzLmNsaWNrLmVtaXQoJGV2ZW50KTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRXZlbnQoJGV2ZW50KTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljaygpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwic3BsaXQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cImNvbG9yXCIgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soJGV2ZW50KVwiPlxuICA8ZGl2IGNsYXNzPVwic3BsaXQtY29udGVudFwiICNzcGxpdD5cbiAgICA8dGwtYnV0dG9uIGNka092ZXJsYXlPcmlnaW4gI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICAgICAgICAgICBbdGV4dF09XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICBbd2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgW2hlaWdodF09XCJoZWlnaHRcIj5cbiAgICA8L3RsLWJ1dHRvbj5cbiAgICA8ZGl2IFtjbGFzcy5hY3RpdmVdPVwiaXNPcGVuXCJcbiAgICAgICAgIChjbGljayk9XCJvcGVuKCRldmVudClcIlxuICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkQWN0aW9uc1wiXG4gICAgICAgICBjbGFzcz1cInNwbGl0LWJ1dHRvbi1hY3Rpb25zXCJcbiAgICAgICAgIFtuZ1N0eWxlXT1cInsnaGVpZ2h0JzogaGVpZ2h0LCAnbGluZS1oZWlnaHQnOiBoZWlnaHR9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1hcnJvd1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiaXNPcGVuID8gJ3JvdGF0ZSgxODBkZWcpJyA6ICdyb3RhdGUoMCknXCI+XG4gICAgICAgIDx0bC1pY29uIFtsaWJdPVwiJ2ZhJ1wiIFtzdHlsZV09XCInZmFzJ1wiPmNoZXZyb24tZG93bjwvdGwtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3NdPVwiJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJ1wiXG4gICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlblwiPlxuICAgICAgICA8dWwgQG92ZXJsYXlcbiAgICAgICAgICAgIFtzdHlsZS5taW5XaWR0aF09XCJzcGxpdC5vZmZzZXRXaWR0aCArICdweCdcIlxuICAgICAgICAgICAgW2NsYXNzLm1hcmdpbi10b3BdPVwicG9zaXRpb25PdmVybGF5ID09PSAnYm90dG9tJ1wiXG4gICAgICAgICAgICBbY2xhc3MubWFyZ2luLWJvdHRvbV09XCJwb3NpdGlvbk92ZXJsYXkgPT09ICd0b3AnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9ucy1tZW51XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3RJdGVtc1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19