UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

315 lines (313 loc) 49.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, Output, Input, ViewChild, ViewChildren, } from '@angular/core'; import { ActiveDescendantKeyManager } from '@angular/cdk/a11y'; import { TlListItem } from './list-item/list-item'; import { TlInput } from '../input/input'; import { scrollIntoView } from '../core/helper/scrollIntoView'; import * as objectPath from 'object-path'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "../i18n/i18n.service"; import * as i2 from "@angular/common"; import * as i3 from "../input/input"; import * as i4 from "./list-item/list-item"; import * as i5 from "../misc/highlight.pipe"; export class GroupList { } export class TlOverlayList { set dataSource(data) { this._datasource = data; this.getFilteredData(); } get dataSource() { return this._datasource; } get emptyList() { return this.i18n.getLocale().OverlayList.emptyList; } constructor(renderer, i18n) { this.renderer = renderer; this.i18n = i18n; this.searchOnList = false; this.itemHeight = ''; this.keyText = 'text'; this.groupBy = null; this.keyIcon = 'icon'; this.icon = null; this.defaultIcon = null; this.defaultOptionText = 'Reset'; this.width = '120px'; this.maxHeight = '200px'; this.hasDefaultOption = false; this.selectOption = new EventEmitter(); this.defaultOption = new EventEmitter(); this.search = new EventEmitter(); this.findByLetter = new EventEmitter(); this.close = new EventEmitter(); this.notFound = false; this.groups = []; this.unGrouped = []; this.searchText = ''; this._datasource = []; this.numberItems = 0; this.subscription = new Subscription(); } ngOnInit() { console.log(objectPath); } ngAfterViewInit() { this.handleCustomInputEvents(); this.keyManager = new ActiveDescendantKeyManager(this.items); this.keyManager.withWrap(); this.handleActiveItem(); this.handleModelOption(); this.getFilteredData(); } getFilteredData() { this.groups = []; this.unGrouped = []; if (!this.groupBy) { this.unGrouped = this.dataSource; return; } this.dataSource.forEach((value) => { if (!objectPath.get(value, this.groupBy)) { this.unGrouped = this.getItemsGroup(objectPath.get(value, this.groupBy)); return; } if (!this.existGroup(objectPath.get(value, this.groupBy))) { this.groups.push({ description: objectPath.get(value, this.groupBy), items: this.getItemsGroup(objectPath.get(value, this.groupBy)) }); } }); } existGroup(group) { for (const item of this.groups) { if (item.description === group) { return true; } } return false; } getTextContent(item) { return this.typeOfData === 'simple' ? item : objectPath.get(item, this.keyText); } getItemsGroup(group) { console.log(objectPath); const filter = this.dataSource.filter((item) => objectPath.get(item, this.groupBy) === group); this.numberItems += filter.length; return filter; } handleCustomInputEvents() { if (this.customInput) { this.handleInputFocus(); this.subscription.add(this.renderer.listen(this.customInput, 'keydown.enter', () => { if (this.hasDataOnDataSource()) { this.emitSelectOption(); } })); this.subscription.add(this.renderer.listen(this.customInput, 'keydown.arrowdown', () => { this.keyManager.setNextItemActive(); this.handleScrollIntoView(); })); this.subscription.add(this.renderer.listen(this.customInput, 'keydown.arrowup', () => { this.keyManager.setPreviousItemActive(); this.handleScrollIntoView(); })); } } handleEscape($event) { this.stopEvent($event); this.close.emit(); } handleInputFocus() { if (this.searchOnList && !this.customFocus) { setTimeout(() => { this.tlInput.setFocus(); }, 1); } } hasDataOnDataSource() { return this.dataSource.length > 0; } handleActiveItem() { setTimeout(() => { if (this.optionSelected) { this.setActiveItem(this.optionSelected.index); return; } this.setFirstItemActive(); }, 1); } setFirstItemActive() { this.removeSelectedAll(); this.keyManager.setFirstItemActive(); } setActiveItem(index) { this.removeSelectedAll(); this.keyManager.setActiveItem(index); } removeSelectedAll() { this.items.forEach((item) => item.selected = false); } handleScrollIntoView() { if (this.keyManager.activeItem) { scrollIntoView(this.keyManager.activeItem.element.nativeElement); } } handleInput($event) { if (this.searchOnList) { this.keydownSearch($event); } } handleModelOption() { if (this.inputModelIndex && this.items) { this.keyManager.setActiveItem(this.inputModelIndex); } } handleSearchByLetter($event) { this.findByLetter.emit($event.key); } handleClickOption($event, item) { this.stopEvent($event); this.keyManager.setActiveItem(item); this.emitSelectOption(); } defaultOptionClick() { this.defaultOption.emit(); } stopEvent($event) { $event.preventDefault(); $event.stopPropagation(); } emitSelectOption() { this.selectOption.emit({ option: this.keyManager.activeItem, index: this.keyManager.activeItemIndex }); } trackByFn(index) { return index; } keydownSearch($event) { this.searchText = $event.target.value; this.search.emit($event.target.value); this.unGrouped = []; } setNotFound() { this.notFound = this.dataSource.length === 0; } ngOnChanges(changes) { this.keyManager = new ActiveDescendantKeyManager(this.items); this.handleActiveItem(); if (changes['datasource']) { this.setNotFound(); } if (changes['inputModelIndex']) { this.handleModelOption(); } } ngOnDestroy() { this.subscription.unsubscribe(); } } /** @nocollapse */ TlOverlayList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlOverlayList, deps: [{ token: i0.Renderer2 }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlOverlayList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlOverlayList, selector: "tl-overlay-list", inputs: { dataSource: ["datasource", "dataSource"], searchOnList: "searchOnList", itemHeight: "itemHeight", inputModelIndex: "inputModelIndex", optionSelected: "optionSelected", typeOfData: "typeOfData", keyText: "keyText", groupBy: "groupBy", keyIcon: "keyIcon", icon: "icon", defaultIcon: "defaultIcon", defaultOptionText: "defaultOptionText", width: "width", maxHeight: "maxHeight", customInput: "customInput", customFocus: "customFocus", hasDefaultOption: "hasDefaultOption" }, outputs: { selectOption: "selectOption", defaultOption: "defaultOption", search: "search", findByLetter: "findByLetter", close: "close" }, viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, static: true }, { propertyName: "tlInput", first: true, predicate: TlInput, descendants: true }, { propertyName: "defaultPlaceholder", first: true, predicate: ["defaultPlaceholder"], descendants: true, static: true }, { propertyName: "items", predicate: TlListItem, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-wrapper-list\">\n <div class=\"dropdown-list-wrapper-select\" [style.width]=\"width\">\n <div class=\"search-input\" *ngIf=\"searchOnList && !customFocus\">\n <tl-input\n (input)=\"handleInput($event)\"\n (keydown.escape)=\"handleEscape($event)\"\n (keydown.ArrowUp)=\"keyManager.setPreviousItemActive(); handleScrollIntoView();\"\n (keydown.ArrowDown)=\"keyManager.setNextItemActive(); handleScrollIntoView();\"\n (keydown.enter)=\"emitSelectOption(); $event.preventDefault()\">\n </tl-input>\n </div>\n\n <section class=\"dropdown-list-select\"\n [style.maxHeight]=\"maxHeight\">\n <div class=\"ui-label-notfound\" *ngIf=\"notFound\">{{ emptyList }}</div>\n <div *ngIf=\"hasDefaultOption\"\n tabindex=\"-1\"\n class=\"default-option\"\n (click)=\"defaultOptionClick()\"\n [style.lineHeight]=\"itemHeight\" [style.height]=\"itemHeight\">\n <i *ngIf=\"defaultIcon\" class=\"{{ defaultIcon }}\"></i>\n {{ defaultOptionText }}\n </div>\n\n <div *ngFor=\"let group of groups; trackBy: trackByFn\" class=\"group-list\">\n <div *ngIf=\"group.description\" class=\"group-description\">{{ group.description }}</div>\n <tl-list-item *ngFor=\"let item of group.items; trackBy: trackByFn\"\n [height]=\"itemHeight\"\n #listItem=\"listItem\"\n [template]=\"groupTemplate\"\n (keydown)=\"handleSearchByLetter($event)\"\n (keydown.enter)=\"handleClickOption($event, listItem)\"\n (click)=\"handleClickOption($event, listItem)\"\n [item]=\"item\">\n <ng-template #groupTemplate>\n <i *ngIf=\"item[keyIcon]\" class=\"{{ item[keyIcon] }}\" style=\"padding: 0 5px\"></i>\n <span [innerHTML]=\"getTextContent(item) | highlight:searchText\"></span>\n </ng-template>\n </tl-list-item>\n </div>\n <tl-list-item *ngFor=\"let item of unGrouped; trackBy: trackByFn\"\n [height]=\"itemHeight\"\n [grouped]=\"false\"\n [template]=\"ungroupTemplate\"\n #listItem=\"listItem\"\n (keydown)=\"handleSearchByLetter($event)\"\n (keydown.enter)=\"handleClickOption($event, listItem)\"\n (click)=\"handleClickOption($event, listItem)\"\n [item]=\"item\">\n <ng-template #ungroupTemplate>\n <i *ngIf=\"item[keyIcon]\" class=\"{{ item[keyIcon] }}\" style=\"padding: 0 5px\"></i>\n <span [innerHTML]=\"getTextContent(item) | highlight:searchText\"></span>\n </ng-template>\n </tl-list-item>\n </section>\n </div>\n</div>\n", styles: [".ui-wrapper-list{position:relative;display:table;margin:0;padding:0}.ui-wrapper-list>.select{overflow:hidden;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;cursor:pointer;margin:0;padding-left:5px;vertical-align:middle;-webkit-user-select:none;user-select:none;border-radius:3px;box-sizing:border-box}.ui-wrapper-list>.select.without-icon{padding-left:10px;padding-right:30px}.ui-wrapper-list>.ui-dropdown-icon{position:absolute;display:table-cell;cursor:pointer;top:0;right:0;text-align:center;width:30px;height:100%}.ui-wrapper-list>.dropdown-list-wrapper-select{z-index:10;outline:none;cursor:pointer;padding:0;left:0;margin:0;text-align:left}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select{padding:0;margin:0;list-style:none;overflow-y:auto;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>.ui-label-notfound{font-weight:400;padding:5px;margin:0;background:white;color:#afa6a6}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li{display:grid;grid-template-columns:35px 1fr;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;outline:none;-webkit-user-select:none;user-select:none}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li i{text-align:center}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li span{text-align:left;font-weight:400}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select::-webkit-scrollbar{width:.5em}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select:focus{border-color:#40a9ff;outline:0;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px!important}.ui-wrapper-list>.dropdown-list-wrapper-select>.-placeholder{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;font-weight:400;cursor:default;outline:none;border-bottom:0;border-top:0;padding:0 10px;z-index:1000;-webkit-user-select:none;user-select:none}.ui-wrapper-list .search-input{box-sizing:border-box;padding:5px}.group-list .group-description{font-weight:600;color:#ababab;padding:5px;font-size:12px}.default-option{padding:0 5px}.default-option>i{padding:0 5px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "component", type: i4.TlListItem, selector: "tl-list-item", inputs: ["item", "disabled", "grouped", "height", "template"], exportAs: ["listItem"] }, { kind: "pipe", type: i5.HighlightPipe, name: "highlight" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlOverlayList, decorators: [{ type: Component, args: [{ selector: 'tl-overlay-list', template: "<div class=\"ui-wrapper-list\">\n <div class=\"dropdown-list-wrapper-select\" [style.width]=\"width\">\n <div class=\"search-input\" *ngIf=\"searchOnList && !customFocus\">\n <tl-input\n (input)=\"handleInput($event)\"\n (keydown.escape)=\"handleEscape($event)\"\n (keydown.ArrowUp)=\"keyManager.setPreviousItemActive(); handleScrollIntoView();\"\n (keydown.ArrowDown)=\"keyManager.setNextItemActive(); handleScrollIntoView();\"\n (keydown.enter)=\"emitSelectOption(); $event.preventDefault()\">\n </tl-input>\n </div>\n\n <section class=\"dropdown-list-select\"\n [style.maxHeight]=\"maxHeight\">\n <div class=\"ui-label-notfound\" *ngIf=\"notFound\">{{ emptyList }}</div>\n <div *ngIf=\"hasDefaultOption\"\n tabindex=\"-1\"\n class=\"default-option\"\n (click)=\"defaultOptionClick()\"\n [style.lineHeight]=\"itemHeight\" [style.height]=\"itemHeight\">\n <i *ngIf=\"defaultIcon\" class=\"{{ defaultIcon }}\"></i>\n {{ defaultOptionText }}\n </div>\n\n <div *ngFor=\"let group of groups; trackBy: trackByFn\" class=\"group-list\">\n <div *ngIf=\"group.description\" class=\"group-description\">{{ group.description }}</div>\n <tl-list-item *ngFor=\"let item of group.items; trackBy: trackByFn\"\n [height]=\"itemHeight\"\n #listItem=\"listItem\"\n [template]=\"groupTemplate\"\n (keydown)=\"handleSearchByLetter($event)\"\n (keydown.enter)=\"handleClickOption($event, listItem)\"\n (click)=\"handleClickOption($event, listItem)\"\n [item]=\"item\">\n <ng-template #groupTemplate>\n <i *ngIf=\"item[keyIcon]\" class=\"{{ item[keyIcon] }}\" style=\"padding: 0 5px\"></i>\n <span [innerHTML]=\"getTextContent(item) | highlight:searchText\"></span>\n </ng-template>\n </tl-list-item>\n </div>\n <tl-list-item *ngFor=\"let item of unGrouped; trackBy: trackByFn\"\n [height]=\"itemHeight\"\n [grouped]=\"false\"\n [template]=\"ungroupTemplate\"\n #listItem=\"listItem\"\n (keydown)=\"handleSearchByLetter($event)\"\n (keydown.enter)=\"handleClickOption($event, listItem)\"\n (click)=\"handleClickOption($event, listItem)\"\n [item]=\"item\">\n <ng-template #ungroupTemplate>\n <i *ngIf=\"item[keyIcon]\" class=\"{{ item[keyIcon] }}\" style=\"padding: 0 5px\"></i>\n <span [innerHTML]=\"getTextContent(item) | highlight:searchText\"></span>\n </ng-template>\n </tl-list-item>\n </section>\n </div>\n</div>\n", styles: [".ui-wrapper-list{position:relative;display:table;margin:0;padding:0}.ui-wrapper-list>.select{overflow:hidden;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;cursor:pointer;margin:0;padding-left:5px;vertical-align:middle;-webkit-user-select:none;user-select:none;border-radius:3px;box-sizing:border-box}.ui-wrapper-list>.select.without-icon{padding-left:10px;padding-right:30px}.ui-wrapper-list>.ui-dropdown-icon{position:absolute;display:table-cell;cursor:pointer;top:0;right:0;text-align:center;width:30px;height:100%}.ui-wrapper-list>.dropdown-list-wrapper-select{z-index:10;outline:none;cursor:pointer;padding:0;left:0;margin:0;text-align:left}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select{padding:0;margin:0;list-style:none;overflow-y:auto;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>.ui-label-notfound{font-weight:400;padding:5px;margin:0;background:white;color:#afa6a6}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li{display:grid;grid-template-columns:35px 1fr;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;outline:none;-webkit-user-select:none;user-select:none}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li i{text-align:center}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select>li span{text-align:left;font-weight:400}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select::-webkit-scrollbar{width:.5em}.ui-wrapper-list>.dropdown-list-wrapper-select>.dropdown-list-select:focus{border-color:#40a9ff;outline:0;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px!important}.ui-wrapper-list>.dropdown-list-wrapper-select>.-placeholder{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;font-weight:400;cursor:default;outline:none;border-bottom:0;border-top:0;padding:0 10px;z-index:1000;-webkit-user-select:none;user-select:none}.ui-wrapper-list .search-input{box-sizing:border-box;padding:5px}.group-list .group-description{font-weight:600;color:#ababab;padding:5px;font-size:12px}.default-option{padding:0 5px}.default-option>i{padding:0 5px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.I18nService }]; }, propDecorators: { dataSource: [{ type: Input, args: ['datasource'] }], searchOnList: [{ type: Input, args: ['searchOnList'] }], itemHeight: [{ type: Input, args: ['itemHeight'] }], inputModelIndex: [{ type: Input, args: ['inputModelIndex'] }], optionSelected: [{ type: Input, args: ['optionSelected'] }], typeOfData: [{ type: Input, args: ['typeOfData'] }], keyText: [{ type: Input, args: ['keyText'] }], groupBy: [{ type: Input, args: ['groupBy'] }], keyIcon: [{ type: Input, args: ['keyIcon'] }], icon: [{ type: Input, args: ['icon'] }], defaultIcon: [{ type: Input, args: ['defaultIcon'] }], defaultOptionText: [{ type: Input, args: ['defaultOptionText'] }], width: [{ type: Input, args: ['width'] }], maxHeight: [{ type: Input, args: ['maxHeight'] }], customInput: [{ type: Input, args: ['customInput'] }], customFocus: [{ type: Input, args: ['customFocus'] }], hasDefaultOption: [{ type: Input, args: ['hasDefaultOption'] }], selectOption: [{ type: Output }], defaultOption: [{ type: Output }], search: [{ type: Output }], findByLetter: [{ type: Output }], close: [{ type: Output }], list: [{ type: ViewChild, args: ['list', { static: true }] }], tlInput: [{ type: ViewChild, args: [TlInput, { static: false }] }], defaultPlaceholder: [{ type: ViewChild, args: ['defaultPlaceholder', { static: true }] }], items: [{ type: ViewChildren, args: [TlListItem] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvb3ZlcmxheWxpc3Qvb3ZlcmxheS1saXN0LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvb3ZlcmxheWxpc3Qvb3ZlcmxheS1saXN0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsWUFBWSxHQUVwRixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBR3BDLE1BQU0sT0FBTyxTQUFTO0NBR3JCO0FBT0QsTUFBTSxPQUFPLGFBQWE7SUFFeEIsSUFDSSxVQUFVLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBb0VELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FB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RSxPQUFPO2dCQUVPLFNBQVM7c0JBQTlCLEtBQUs7dUJBQUUsV0FBVztnQkFFSyxXQUFXO3NCQUFsQyxLQUFLO3VCQUFFLGFBQWE7Z0JBRUcsV0FBVztzQkFBbEMsS0FBSzt1QkFBRSxhQUFhO2dCQUVRLGdCQUFnQjtzQkFBNUMsS0FBSzt1QkFBRSxrQkFBa0I7Z0JBRWhCLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxLQUFLO3NCQUFkLE1BQU07Z0JBRThCLElBQUk7c0JBQXhDLFNBQVM7dUJBQUUsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFTyxPQUFPO3NCQUEvQyxTQUFTO3VCQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWEsa0JBQWtCO3NCQUFwRSxTQUFTO3VCQUFFLG9CQUFvQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFdEIsS0FBSztzQkFBOUIsWUFBWTt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPdXRwdXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LFxuICBBZnRlclZpZXdJbml0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIFJlbmRlcmVyMiwgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgVGxMaXN0SXRlbSB9IGZyb20gJy4vbGlzdC1pdGVtL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBUbElucHV0IH0gZnJvbSAnLi4vaW5wdXQvaW5wdXQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9pMThuL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMaXN0SXRlbUludGVyZmFjZSB9IGZyb20gJy4uL2Ryb3Bkb3dubGlzdC9pbnRlcmZhY2VzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBzY3JvbGxJbnRvVmlldyB9IGZyb20gJy4uL2NvcmUvaGVscGVyL3Njcm9sbEludG9WaWV3JztcbmltcG9ydCAqIGFzIG9iamVjdFBhdGggZnJvbSAnb2JqZWN0LXBhdGgnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cblxuZXhwb3J0IGNsYXNzIEdyb3VwTGlzdCB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGl0ZW1zOiBBcnJheTxhbnk+O1xufVxuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtb3ZlcmxheS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL292ZXJsYXktbGlzdC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL292ZXJsYXktbGlzdC5zY3NzJyBdLFxufSApXG5leHBvcnQgY2xhc3MgVGxPdmVybGF5TGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCggJ2RhdGFzb3VyY2UnIClcbiAgc2V0IGRhdGFTb3VyY2UoZGF0YSkge1xuICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBkYXRhO1xuICAgIHRoaXMuZ2V0RmlsdGVyZWREYXRhKCk7XG4gIH1cblxuICBnZXQgZGF0YVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YXNvdXJjZTtcbiAgfVxuXG4gIEBJbnB1dCggJ3NlYXJjaE9uTGlzdCcgKSBzZWFyY2hPbkxpc3QgPSBmYWxzZTtcblxuICBASW5wdXQoICdpdGVtSGVpZ2h0JyApIGl0ZW1IZWlnaHQgPSAnJztcblxuICBASW5wdXQoICdpbnB1dE1vZGVsSW5kZXgnICkgaW5wdXRNb2RlbEluZGV4O1xuXG4gIEBJbnB1dCggJ29wdGlvblNlbGVjdGVkJyApIG9wdGlvblNlbGVjdGVkO1xuXG4gIEBJbnB1dCggJ3R5cGVPZkRhdGEnICkgdHlwZU9mRGF0YTtcblxuICBASW5wdXQoICdrZXlUZXh0JyApIGtleVRleHQgPSAndGV4dCc7XG5cbiAgQElucHV0KCAnZ3JvdXBCeScgKSBncm91cEJ5ID0gbnVsbDtcblxuICBASW5wdXQoICdrZXlJY29uJyApIGtleUljb24gPSAnaWNvbic7XG5cbiAgQElucHV0KCAnaWNvbicgKSBpY29uID0gbnVsbDtcblxuICBASW5wdXQoICdkZWZhdWx0SWNvbicgKSBkZWZhdWx0SWNvbiA9IG51bGw7XG5cbiAgQElucHV0KCAnZGVmYXVsdE9wdGlvblRleHQnICkgZGVmYXVsdE9wdGlvblRleHQgPSAnUmVzZXQnO1xuXG4gIEBJbnB1dCggJ3dpZHRoJyApIHdpZHRoID0gJzEyMHB4JztcblxuICBASW5wdXQoICdtYXhIZWlnaHQnICkgbWF4SGVpZ2h0ID0gJzIwMHB4JztcblxuICBASW5wdXQoICdjdXN0b21JbnB1dCcgKSBjdXN0b21JbnB1dDtcblxuICBASW5wdXQoICdjdXN0b21Gb2N1cycgKSBjdXN0b21Gb2N1cztcblxuICBASW5wdXQoICdoYXNEZWZhdWx0T3B0aW9uJyApIGhhc0RlZmF1bHRPcHRpb24gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgc2VsZWN0T3B0aW9uOiBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1JbnRlcmZhY2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBkZWZhdWx0T3B0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgZmluZEJ5TGV0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoICdsaXN0Jywge3N0YXRpYzogdHJ1ZX0gKSBsaXN0OiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoIFRsSW5wdXQsIHsgc3RhdGljOiBmYWxzZSB9ICkgdGxJbnB1dDogVGxJbnB1dDtcblxuICBAVmlld0NoaWxkKCAnZGVmYXVsdFBsYWNlaG9sZGVyJywge3N0YXRpYzogdHJ1ZX0gKSBkZWZhdWx0UGxhY2Vob2xkZXI6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihUbExpc3RJdGVtKSBpdGVtczogUXVlcnlMaXN0PFRsTGlzdEl0ZW0+O1xuXG4gIHB1YmxpYyBrZXlNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxUbExpc3RJdGVtPjtcblxuICBwdWJsaWMgbm90Rm91bmQgPSBmYWxzZTtcblxuICBwdWJsaWMgZ3JvdXBzOiBHcm91cExpc3RbXSA9IFtdO1xuXG4gIHB1YmxpYyB1bkdyb3VwZWQgPSBbXTtcblxuICBwdWJsaWMgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIHByaXZhdGUgX2RhdGFzb3VyY2UgPSBbXTtcblxuICBwcml2YXRlIG51bWJlckl0ZW1zID0gMDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBnZXQgZW1wdHlMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuT3ZlcmxheUxpc3QuZW1wdHlMaXN0O1xuICB9XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnNvbGUubG9nKG9iamVjdFBhdGgpXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5oYW5kbGVDdXN0b21JbnB1dEV2ZW50cygpO1xuICAgIHRoaXMua2V5TWFuYWdlciA9IG5ldyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciggdGhpcy5pdGVtcyApO1xuICAgIHRoaXMua2V5TWFuYWdlci53aXRoV3JhcCgpO1xuICAgIHRoaXMuaGFuZGxlQWN0aXZlSXRlbSgpO1xuICAgIHRoaXMuaGFuZGxlTW9kZWxPcHRpb24oKTtcbiAgICB0aGlzLmdldEZpbHRlcmVkRGF0YSgpO1xuICB9XG5cbiAgZ2V0RmlsdGVyZWREYXRhKCkge1xuICAgIHRoaXMuZ3JvdXBzID0gW107XG4gICAgdGhpcy51bkdyb3VwZWQgPSBbXTtcbiAgICBpZiAoIXRoaXMuZ3JvdXBCeSkge1xuICAgICAgdGhpcy51bkdyb3VwZWQgPSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKCAoIHZhbHVlICkgPT4ge1xuICAgICAgaWYgKCFvYmplY3RQYXRoLmdldCh2YWx1ZSwgdGhpcy5ncm91cEJ5KSkge1xuICAgICAgICB0aGlzLnVuR3JvdXBlZCA9IHRoaXMuZ2V0SXRlbXNHcm91cChvYmplY3RQYXRoLmdldCh2YWx1ZSwgdGhpcy5ncm91cEJ5KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICggIXRoaXMuZXhpc3RHcm91cCggb2JqZWN0UGF0aC5nZXQodmFsdWUsIHRoaXMuZ3JvdXBCeSkgKSApIHtcbiAgICAgICAgdGhpcy5ncm91cHMucHVzaCgge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBvYmplY3RQYXRoLmdldCh2YWx1ZSwgdGhpcy5ncm91cEJ5KSxcbiAgICAgICAgICBpdGVtczogdGhpcy5nZXRJdGVtc0dyb3VwKCBvYmplY3RQYXRoLmdldCh2YWx1ZSwgdGhpcy5ncm91cEJ5KSApXG4gICAgICAgIH0gKTtcbiAgICAgIH1cbiAgICB9ICk7XG4gIH1cblxuICBleGlzdEdyb3VwKCBncm91cCApIHtcbiAgICBmb3IgKCBjb25zdCBpdGVtIG9mIHRoaXMuZ3JvdXBzICkge1xuICAgICAgaWYgKCBpdGVtLmRlc2NyaXB0aW9uID09PSBncm91cCApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFRleHRDb250ZW50KCBpdGVtICkge1xuICAgIHJldHVybiB0aGlzLnR5cGVPZkRhdGEgPT09ICdzaW1wbGUnID8gaXRlbSA6IG9iamVjdFBhdGguZ2V0KGl0ZW0sIHRoaXMua2V5VGV4dCk7XG4gIH1cblxuICBnZXRJdGVtc0dyb3VwKCBncm91cCApIHtcbiAgICBjb25zb2xlLmxvZyhvYmplY3RQYXRoKVxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoICggaXRlbSApID0+IG9iamVjdFBhdGguZ2V0KGl0ZW0sIHRoaXMuZ3JvdXBCeSkgPT09IGdyb3VwKTtcbiAgICB0aGlzLm51bWJlckl0ZW1zICs9IGZpbHRlci5sZW5ndGg7XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIGhhbmRsZUN1c3RvbUlucHV0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLmN1c3RvbUlucHV0KSB7XG4gICAgICB0aGlzLmhhbmRsZUlucHV0Rm9jdXMoKTtcblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmN1c3RvbUlucHV0LCAna2V5ZG93bi5lbnRlcicsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGF0YU9uRGF0YVNvdXJjZSgpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0U2VsZWN0T3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmN1c3RvbUlucHV0LCAna2V5ZG93bi5hcnJvd2Rvd24nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEludG9WaWV3KCk7XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5jdXN0b21JbnB1dCwgJ2tleWRvd24uYXJyb3d1cCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEludG9WaWV3KCk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRXNjYXBlKCRldmVudCkge1xuICAgIHRoaXMuc3RvcEV2ZW50KCAkZXZlbnQgKTtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZUlucHV0Rm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoT25MaXN0ICYmICF0aGlzLmN1c3RvbUZvY3VzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50bElucHV0LnNldEZvY3VzKCk7XG4gICAgICB9LCAxKTtcbiAgICB9XG4gIH1cblxuICBoYXNEYXRhT25EYXRhU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGhhbmRsZUFjdGl2ZUl0ZW0oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25TZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0oIHRoaXMub3B0aW9uU2VsZWN0ZWQuaW5kZXggKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICB9LCAxKTtcbiAgfVxuXG4gIHNldEZpcnN0SXRlbUFjdGl2ZSgpIHtcbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkQWxsKCk7XG4gICAgdGhpcy5rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICB9XG5cbiAgc2V0QWN0aXZlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEFsbCgpO1xuICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKGluZGV4KTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkQWxsKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgfVxuXG4gIGhhbmRsZVNjcm9sbEludG9WaWV3KCkge1xuICAgIGlmICh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgc2Nyb2xsSW50b1ZpZXcodGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVJbnB1dCggJGV2ZW50ICkge1xuICAgIGlmICggdGhpcy5zZWFyY2hPbkxpc3QgKSB7XG4gICAgICB0aGlzLmtleWRvd25TZWFyY2goICRldmVudCApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGVsT3B0aW9uKCkge1xuICAgIGlmICggdGhpcy5pbnB1dE1vZGVsSW5kZXggJiYgdGhpcy5pdGVtcyApIHtcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKCB0aGlzLmlucHV0TW9kZWxJbmRleCApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVNlYXJjaEJ5TGV0dGVyKCRldmVudCkge1xuICAgIHRoaXMuZmluZEJ5TGV0dGVyLmVtaXQoJGV2ZW50LmtleSk7XG4gIH1cblxuICBoYW5kbGVDbGlja09wdGlvbiggJGV2ZW50LCBpdGVtOiBUbExpc3RJdGVtICkge1xuICAgIHRoaXMuc3RvcEV2ZW50KCRldmVudCk7XG4gICAgdGhpcy5rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oIGl0ZW0gKTtcbiAgICB0aGlzLmVtaXRTZWxlY3RPcHRpb24oKTtcbiAgfVxuXG4gIGRlZmF1bHRPcHRpb25DbGljaygpIHtcbiAgICB0aGlzLmRlZmF1bHRPcHRpb24uZW1pdCgpO1xuICB9XG5cbiAgc3RvcEV2ZW50KCRldmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGVtaXRTZWxlY3RPcHRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RPcHRpb24uZW1pdCggPExpc3RJdGVtSW50ZXJmYWNlPntcbiAgICAgIG9wdGlvbjogdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0sXG4gICAgICBpbmRleDogdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAga2V5ZG93blNlYXJjaCggJGV2ZW50ICkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICRldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2guZW1pdCggJGV2ZW50LnRhcmdldC52YWx1ZSApO1xuICAgIHRoaXMudW5Hcm91cGVkID0gW107XG4gIH1cblxuICBzZXROb3RGb3VuZCgpIHtcbiAgICB0aGlzLm5vdEZvdW5kID0gdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKCB0aGlzLml0ZW1zICk7XG4gICAgdGhpcy5oYW5kbGVBY3RpdmVJdGVtKCk7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzb3VyY2UnXSkge1xuICAgICAgdGhpcy5zZXROb3RGb3VuZCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5wdXRNb2RlbEluZGV4J10pIHtcbiAgICAgIHRoaXMuaGFuZGxlTW9kZWxPcHRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbn1cblxuIiwiPGRpdiBjbGFzcz1cInVpLXdyYXBwZXItbGlzdFwiPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdC13cmFwcGVyLXNlbGVjdFwiIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiAqbmdJZj1cInNlYXJjaE9uTGlzdCAmJiAhY3VzdG9tRm9jdXNcIj5cbiAgICAgIDx0bC1pbnB1dFxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJoYW5kbGVFc2NhcGUoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLkFycm93VXApPVwia2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTsgaGFuZGxlU2Nyb2xsSW50b1ZpZXcoKTtcIlxuICAgICAgICAoa2V5ZG93bi5BcnJvd0Rvd24pPVwia2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpOyBoYW5kbGVTY3JvbGxJbnRvVmlldygpO1wiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImVtaXRTZWxlY3RPcHRpb24oKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgIDwvdGwtaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImRyb3Bkb3duLWxpc3Qtc2VsZWN0XCJcbiAgICAgICAgICAgICBbc3R5bGUubWF4SGVpZ2h0XT1cIm1heEhlaWdodFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInVpLWxhYmVsLW5vdGZvdW5kXCIgKm5nSWY9XCJub3RGb3VuZFwiPnt7IGVtcHR5TGlzdCB9fTwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImhhc0RlZmF1bHRPcHRpb25cIlxuICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgY2xhc3M9XCJkZWZhdWx0LW9wdGlvblwiXG4gICAgICAgICAgIChjbGljayk9XCJkZWZhdWx0T3B0aW9uQ2xpY2soKVwiXG4gICAgICAgICAgIFtzdHlsZS5saW5lSGVpZ2h0XT1cIml0ZW1IZWlnaHRcIiBbc3R5bGUuaGVpZ2h0XT1cIml0ZW1IZWlnaHRcIj5cbiAgICAgICAgPGkgKm5nSWY9XCJkZWZhdWx0SWNvblwiIGNsYXNzPVwie3sgZGVmYXVsdEljb24gfX1cIj48L2k+XG4gICAgICAgIHt7IGRlZmF1bHRPcHRpb25UZXh0IH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzOyB0cmFja0J5OiB0cmFja0J5Rm5cIiBjbGFzcz1cImdyb3VwLWxpc3RcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImdyb3VwLmRlc2NyaXB0aW9uXCIgY2xhc3M9XCJncm91cC1kZXNjcmlwdGlvblwiPnt7IGdyb3VwLmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgIDx0bC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCJpdGVtSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAjbGlzdEl0ZW09XCJsaXN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImdyb3VwVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVNlYXJjaEJ5TGV0dGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUNsaWNrT3B0aW9uKCRldmVudCwgbGlzdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPcHRpb24oJGV2ZW50LCBsaXN0SXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2dyb3VwVGVtcGxhdGU+XG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW1ba2V5SWNvbl1cIiBjbGFzcz1cInt7IGl0ZW1ba2V5SWNvbl0gfX1cIiBzdHlsZT1cInBhZGRpbmc6IDAgNXB4XCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJnZXRUZXh0Q29udGVudChpdGVtKSB8IGhpZ2hsaWdodDpzZWFyY2hUZXh0XCI+PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGwtbGlzdC1pdGVtPlxuICAgICAgPC9kaXY+XG4gICAgICAgIDx0bC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2YgdW5Hcm91cGVkOyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiaXRlbUhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2dyb3VwZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1bmdyb3VwVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICNsaXN0SXRlbT1cImxpc3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWFyY2hCeUxldHRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVDbGlja09wdGlvbigkZXZlbnQsIGxpc3RJdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrT3B0aW9uKCRldmVudCwgbGlzdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICN1bmdyb3VwVGVtcGxhdGU+XG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW1ba2V5SWNvbl1cIiBjbGFzcz1cInt7IGl0ZW1ba2V5SWNvbl0gfX1cIiBzdHlsZT1cInBhZGRpbmc6IDAgNXB4XCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJnZXRUZXh0Q29udGVudChpdGVtKSB8IGhpZ2hsaWdodDpzZWFyY2hUZXh0XCI+PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGwtbGlzdC1pdGVtPlxuICAgIDwvc2VjdGlvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==