UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

434 lines (429 loc) 47.5 kB
import * as tslib_1 from "tslib"; var SelectComponent_1; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DropdownBaseComponent } from './dropdown-base.component'; import { GridSettings, GridState } from '@true-directive/base'; import { GridComponent } from '../grid.component'; import { Keys, Utils } from '@true-directive/base'; let SelectComponent = SelectComponent_1 = class SelectComponent extends DropdownBaseComponent { constructor(_elementRef, _renderer) { super(_elementRef, _renderer); this._elementRef = _elementRef; this._renderer = _renderer; /** * Current text value */ this.displayValue = ''; // Запрос данных this.dataQuery = new EventEmitter(); this._focusedValue = null; this._valueField = null; this._displayField = null; this.columns = []; this.parentState = null; this._settings = null; this.itemSelect = new EventEmitter(); // Выбираем ли мы из грида this._onGrid = false; this._empty = false; this._updating = false; this.useAltDown = false; } /** * Current value */ set value(v) { if (v !== this._value) { this._value = v; this.writeValue(this._value); this.onChange(v); } } get value() { return this._value; } set valueField(fieldName) { this._valueField = fieldName; if (this._settings) { // Настройки могут быть еще не созданы this._settings.keyField = this._valueField; } } get valueField() { if (this._valueField === null && this.columns.length > 0) { return this.columns[0].fieldName; } return this._valueField === null ? 'id' : this._valueField; } set displayField(fieldName) { this._displayField = fieldName; } get displayField() { if (this._displayField === null && this.columns.length > 0) { return this.columns[0].fieldName; } return this._displayField === null ? 'name' : this._displayField; } set settings(v) { this._settings = v; this._settings.enableTouchScroll = false; } get settings() { if (!this._settings) { this._settings = GridSettings.minimal(); this._settings.keyField = this.valueField; this._settings.widthUnit = 'em'; this._settings.showHeader = false; this._settings.columnAutoWidth = false; this._settings.enableTouchScroll = false; this._settings.appearance.enableHoverAppearance = true; } return this._settings; } gridStartProcess(e) { if (this._empty && this.settings.requestData) { this._empty = false; this._updating = true; } } gridEndProcess(e) { setTimeout(() => { if (!this.popup.visible) { this.showByTarget(); } else { // Let's update position of popup window. When list reduce, it may move // up or down regarding input. this.popup.updatePosition(); } }); this._updating = false; if (this.grid.resultRows.length === 0) { this._empty = true; } else { this._empty = false; } } gridDataQuery(e) { this.dataQuery.emit(e); } // Отображаем значение в компоненте. Formatter: Ctrl --> View writeValue(v) { this._value = v; let found = this.items.find(item => item[this.valueField] === v); if (!found) { this.displayValue = ''; } else { this.displayValue = found[this.displayField]; } } // За один раз устанавливаем и значение и отображение setValue(value, displayValue) { if (value !== this._value || displayValue !== this.displayValue) { this._focusedValue = value; this.displayValue = displayValue; this.value = value; } } // По введенному тексту ничего не найдено? empty() { return this._empty; } // Происходит обновление данных? updating() { return this._updating; } // Ответ fetchData(dataQuery, data) { let sel = this.getSelectedRow(); if (sel) { this._focusedValue = sel[this.valueField]; } if (this.grid && this.popupVisible) { this.grid.fetchData(dataQuery, data); if (this._focusedValue) { this.grid.locateByKey(this._focusedValue); } else { if (this._value !== null) { this.grid.locateByKey(this._value); } } } } /** * Общая ширина грида в выпадающем списке * @return Ширина в заданных единицах измерения */ gridWidth() { let ww = 0; this.columns.forEach(c => ww += c.width); return ww + this.settings.widthUnit; } /** * Перекрываем показывание выпадающего окна, чтобы обновить вью грида * и выделить строку, содержащую текущее значение * @param e Параметры события */ popupShow(e) { this._onGrid = false; if (this._value !== null) { this.grid.locateByKey(this._value, this.valueField); } else { if (this.shownByKey) { this.grid.processKey(Keys.generateEvent(null, Keys.DOWN)); // Будет выбрана первая запись } } this.grid.checkSize(); } /** * Обработчик клавиш вызывается из родительского класса * Возвращает false, если клавиша не обработана */ processKey(e) { if (e.keyCode === Keys.ENTER) { this.setValueFromGrid(); this.popup.closePopup(); return true; } if (!this.popupVisible) { return false; } if (e.keyCode === Keys.ESCAPE) { this.popup.closePopup(); e.preventDefault(); e.stopPropagation(); return true; } if (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP) { this._onGrid = true; this.grid.processKey(e); e.preventDefault(); return true; } return false; } // Клик по записи в гриде gridRowClick(e) { this._onGrid = true; this._skipFocusOnPopupClose = false; this.value = e.row[this.valueField]; this.popup.closePopup(); this.itemSelect.emit(e.row); } // Поворот иконки iconClass() { let s = 'true-icon-angle-down true-turnable'; if (this.popupVisible) { s += ' true-turned'; } return s; } // Ввод текста пользователем inputInput(e = null) { // Окошко еще на выпало? показываем if (!this.popupVisible && this.displayValue !== '') { this.grid.searchString = this.displayValue; return; } if (this.popupVisible) { setTimeout(() => { // Устанавливаем фильтр по тексту this.grid.searchString = this.displayValue; }); } if (this.displayValue === '') { this.setValue(null, ''); return; } this._value = null; } // Возврат выбранной строки в гриде getSelectedRow() { if (this.grid && this.grid.state.selection.ranges.length > 0) { let item = this.grid.state.selection.ranges[0].fromCell.row; return item; } return null; } containsDisplayed(s) { return !this.displayValue || (s !== undefined && s.toLowerCase().indexOf(this.displayValue.toLowerCase()) >= 0); } // Установка значения по выделенной в гриде записи setValueFromGrid() { if (!this.popupVisible && this.grid.state.model) { const found = this.grid.state.model.find(item => item[this.displayField].toLowerCase() === this.displayValue.toLowerCase()); if (found) { this.setValue(found[this.valueField], found[this.displayField]); } else { this.setValue(null, ''); } return; } const sel = this.getSelectedRow(); if (sel && (this._onGrid || this.containsDisplayed(sel[this.displayField]))) { this.setValue(sel[this.valueField], sel[this.displayField]); } else { this.setValueFromDisplayed(); } } /** * Установка значения по введенному тексту */ setValueFromDisplayed() { // По запросу. Смотрим в гриде. Хотя, если подумать, можно всегда в гриде смотреть.. let f = null; if (this.grid && this.grid.resultRows) { f = this.grid.resultRows.find(item => item[this.displayField].toLowerCase() === this.displayValue.toLowerCase()); } if (f) { this.setValue(f[this.valueField], f[this.displayField]); } else { this.setValue(null, ''); } return; } /** * Потеря фокуса инпутом * @param e Параметры события */ inputBlur(e) { this._skipFocusOnPopupClose = true; if ((this.value === null || this.value === undefined) && this.displayValue !== '') { if (e.relatedTarget && Utils.isAncestor(this.popup.elementRef.nativeElement, e.relatedTarget)) { // Если фокус перешел на... return; } this.closePopup(); this.setValueFromDisplayed(); } super.inputBlur(e); } }; tslib_1.__decorate([ Output('dataQuery'), tslib_1.__metadata("design:type", EventEmitter) ], SelectComponent.prototype, "dataQuery", void 0); tslib_1.__decorate([ Input('valueField'), tslib_1.__metadata("design:type", String), tslib_1.__metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "valueField", null); tslib_1.__decorate([ Input('displayField'), tslib_1.__metadata("design:type", String), tslib_1.__metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "displayField", null); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], SelectComponent.prototype, "columns", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], SelectComponent.prototype, "items", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", GridState) ], SelectComponent.prototype, "parentState", void 0); tslib_1.__decorate([ Input('settings'), tslib_1.__metadata("design:type", Object), tslib_1.__metadata("design:paramtypes", [Object]) ], SelectComponent.prototype, "settings", null); tslib_1.__decorate([ Output('itemSelect'), tslib_1.__metadata("design:type", EventEmitter) ], SelectComponent.prototype, "itemSelect", void 0); tslib_1.__decorate([ ViewChild('grid', { static: true }), tslib_1.__metadata("design:type", GridComponent) ], SelectComponent.prototype, "grid", void 0); SelectComponent = SelectComponent_1 = tslib_1.__decorate([ Component({ selector: 'true-select', template: ` <true-input-wrapper (btnClick)="btnClick($event)" [disabled]="disabled" class="true-select__input" [class.true-input_popup-visible]="popupVisible" [icon]="iconClass()"> <input #input [(ngModel)]="displayValue" [readonly]="disableTextEditor" [attr.disabled]="disabled" [class.true-disable-te]="disableTextEditor" (input)="inputInput($event)" (click)="inputClick($event)" (touchstart)="inputTouchStart($event)" (touchmove)="inputTouchMove($event)" (touchend)="inputTouchEnd($event)" (blur)="inputBlur($event)" (focus)="inputFocus($event)" (keydown)="inputKeyDown($event)"/> </true-input-wrapper> <true-popup #popup (close)="popupClose($event)" (show)="popupShow($event)" > <true-grid #grid [class.true-select__grid_hidden]="empty()" class="true-select__grid" [maxHeight]="maxDropDownHeight" [columns]="columns" [data]="items" [settings]="settings" (dataQuery)="gridDataQuery($event)" (startProcess)="gridStartProcess($event)" (endProcess)="gridEndProcess($event)" (rowClick)="gridRowClick($event)"> </true-grid> <div *ngIf="empty()" class="true-select__notfound" [style.width]="gridWidth()">Ничего не найдено</div> <div *ngIf="updating()" class="true-select__updating">Загрузка...</div> </true-popup> `, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent_1), multi: true }], styles: [` .true-select__input { width: 100%; } input { box-sizing: border-box; width: 100%; height: 100%; } .true-select__grid_hidden { display: none; } .true-select__grid { border: none !important; cursor: pointer; } .true-select__notfound, .true-select__updating { padding: 0.6em; box-sizing: border-box; color: #aaa; } `] }), tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2]) ], SelectComponent); export { SelectComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2NvbnRyb2xzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFlLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUUxRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBK0VuRCxJQUFhLGVBQWUsdUJBQTVCLE1BQWEsZUFBZ0IsU0FBUSxxQkFBcUI7SUFtV3hELFlBQ1ksV0FBdUIsRUFDdkIsU0FBb0I7UUFDNUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUZ0QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBbldoQzs7V0FFRztRQUNJLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBaUJqQyxnQkFBZ0I7UUFFaEIsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRS9DLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLGdCQUFXLEdBQVcsSUFBSSxDQUFDO1FBa0IzQixrQkFBYSxHQUFXLElBQUksQ0FBQztRQWNyQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQU01QixnQkFBVyxHQUFjLElBQUksQ0FBQztRQUV0QixjQUFTLEdBQWlCLElBQUksQ0FBQztRQXNCdkMsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBS25ELDBCQUEwQjtRQUMxQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFTZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBOFBkLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFqV0Q7O09BRUc7SUFDSCxJQUFXLEtBQUssQ0FBQyxDQUFNO1FBQ3JCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQVVELElBQVcsVUFBVSxDQUFDLFNBQWlCO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUNsQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM3RCxDQUFDO0lBSUQsSUFBVyxZQUFZLENBQUMsU0FBaUI7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ25FLENBQUM7SUFjRCxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFZRCxnQkFBZ0IsQ0FBQyxDQUFNO1FBQ3JCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtJQUNILENBQUM7SUFHRCxjQUFjLENBQUMsQ0FBTTtRQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsdUVBQXVFO2dCQUN2RSw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDN0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLENBQU07UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxVQUFVLENBQUMsQ0FBTTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7U0FDeEI7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUM7SUFFRCxxREFBcUQ7SUFDckQsUUFBUSxDQUFDLEtBQVUsRUFBRSxZQUFvQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtJQUNSLFNBQVMsQ0FBQyxTQUFvQixFQUFFLElBQWdCO1FBQzlDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUMzQztpQkFBTTtnQkFDTCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3BDO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ1AsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLENBQU07UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCO2FBQzFGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsQ0FBTTtRQUVmLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlCQUF5QjtJQUNsQixZQUFZLENBQUMsQ0FBTTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQjtJQUNWLFNBQVM7UUFDZCxJQUFJLENBQUMsR0FBRyxvQ0FBb0MsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsQ0FBQyxJQUFJLGNBQWMsQ0FBQztTQUNyQjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELDRCQUE0QjtJQUNyQixVQUFVLENBQUMsSUFBUyxJQUFJO1FBQzdCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRTtZQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzNDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsbUNBQW1DO0lBQzNCLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM1RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGlCQUFpQixDQUFDLENBQVM7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxrREFBa0Q7SUFDMUMsZ0JBQWdCO1FBRXRCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUUvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FDcEYsQ0FBQztZQUVGLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDekI7WUFDRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHFCQUFxQjtRQUMxQixvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNsSDtRQUNELElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxDQUFhO1FBQ3JCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLEVBQUU7WUFFakYsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDN0YsMkJBQTJCO2dCQUMzQixPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7UUFDRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7Q0FRRixDQUFBO0FBalZDO0lBREMsTUFBTSxDQUFDLFdBQVcsQ0FBQztzQ0FDVCxZQUFZO2tEQUFnQztBQU12RDtJQURDLEtBQUssQ0FBQyxZQUFZLENBQUM7OztpREFPbkI7QUFXRDtJQURDLEtBQUssQ0FBQyxjQUFjLENBQUM7OzttREFHckI7QUFVRDtJQURDLEtBQUssRUFBRTtzQ0FDQyxLQUFLO2dEQUFjO0FBRzVCO0lBREMsS0FBSyxFQUFFO3NDQUNELEtBQUs7OENBQU07QUFHbEI7SUFEQyxLQUFLLEVBQUU7c0NBQ0ssU0FBUztvREFBUTtBQUs5QjtJQURDLEtBQUssQ0FBQyxVQUFVLENBQUM7OzsrQ0FJakI7QUFnQkQ7SUFEQyxNQUFNLENBQUMsWUFBWSxDQUFDO3NDQUNULFlBQVk7bURBQTJCO0FBR25EO0lBREMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQztzQ0FDNUIsYUFBYTs2Q0FBQztBQTVGVCxlQUFlO0lBN0UzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsYUFBYTtRQUN2QixRQUFRLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXVDTjtRQStCSCxTQUFTLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFlLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxJQUFJO2FBQUMsQ0FBQztpQkE5QlI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJSO0tBS0EsQ0FBQzs2Q0FxV3VCLFVBQVU7UUFDWixTQUFTO0dBcldyQixlQUFlLENBeVczQjtTQXpXWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU2V0dGluZ3MsIEdyaWRTdGF0ZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uLCBEYXRhUXVlcnkgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEtleXMsIFV0aWxzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6YFxyXG4gICAgICA8dHJ1ZS1pbnB1dC13cmFwcGVyXHJcbiAgICAgICAgKGJ0bkNsaWNrKT1cImJ0bkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9faW5wdXRcIlxyXG4gICAgICAgIFtjbGFzcy50cnVlLWlucHV0X3BvcHVwLXZpc2libGVdPVwicG9wdXBWaXNpYmxlXCJcclxuICAgICAgICBbaWNvbl09XCJpY29uQ2xhc3MoKVwiPlxyXG4gICAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLWRpc2FibGUtdGVdPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICAoaW5wdXQpPVwiaW5wdXRJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cImlucHV0VG91Y2hTdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJpbnB1dFRvdWNoTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNoZW5kKT1cImlucHV0VG91Y2hFbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChibHVyKT1cImlucHV0Qmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cImlucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5RG93bigkZXZlbnQpXCIvPlxyXG4gICAgICA8L3RydWUtaW5wdXQtd3JhcHBlcj5cclxuICAgICAgPHRydWUtcG9wdXAgI3BvcHVwXHJcbiAgICAgICAgKGNsb3NlKT1cInBvcHVwQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNob3cpPVwicG9wdXBTaG93KCRldmVudClcIiA+XHJcbiAgICAgICAgPHRydWUtZ3JpZCAjZ3JpZFxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLXNlbGVjdF9fZ3JpZF9oaWRkZW5dPVwiZW1wdHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9fZ3JpZFwiXHJcbiAgICAgICAgICAgICAgICAgW21heEhlaWdodF09XCJtYXhEcm9wRG93bkhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgKGRhdGFRdWVyeSk9XCJncmlkRGF0YVF1ZXJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgIChzdGFydFByb2Nlc3MpPVwiZ3JpZFN0YXJ0UHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAoZW5kUHJvY2Vzcyk9XCJncmlkRW5kUHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAocm93Q2xpY2spPVwiZ3JpZFJvd0NsaWNrKCRldmVudClcIj5cclxuICAgICAgICA8L3RydWUtZ3JpZD5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1wdHkoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX25vdGZvdW5kXCIgW3N0eWxlLndpZHRoXT1cImdyaWRXaWR0aCgpXCI+0J3QuNGH0LXQs9C+INC90LUg0L3QsNC50LTQtdC90L48L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBkYXRpbmcoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX3VwZGF0aW5nXCI+0JfQsNCz0YDRg9C30LrQsC4uLjwvZGl2PlxyXG4gICAgICA8L3RydWUtcG9wdXA+XHJcbiAgICBgLFxyXG4gICAgLypcclxuICAgICAgUmVtb3ZlZDogOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0gLSBpbnZhbGlkIGlvcyByZW5kZXJpbmcuXHJcbiAgICAgKi9cclxuICBzdHlsZXM6IFtgXHJcblxyXG4gICAgLnRydWUtc2VsZWN0X19pbnB1dCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0IHtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWRfaGlkZGVuIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWQge1xyXG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC50cnVlLXNlbGVjdF9fbm90Zm91bmQsIC50cnVlLXNlbGVjdF9fdXBkYXRpbmcge1xyXG4gICAgICBwYWRkaW5nOiAwLjZlbTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgY29sb3I6ICNhYWE7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWV9XVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBEcm9wZG93bkJhc2VDb21wb25lbnQge1xyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgKi9cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudCB2YWx1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5fdmFsdWUpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vINCX0LDQv9GA0L7RgSDQtNCw0L3QvdGL0YVcclxuICBAT3V0cHV0KCdkYXRhUXVlcnknKVxyXG4gIGRhdGFRdWVyeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfZm9jdXNlZFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3ZhbHVlRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgndmFsdWVGaWVsZCcpXHJcbiAgcHVibGljIHNldCB2YWx1ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWx1ZUZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzKSB7XHJcbiAgICAgIC8vINCd0LDRgdGC0YDQvtC50LrQuCDQvNC+0LPRg9GCINCx0YvRgtGMINC10YnQtSDQvdC1INGB0L7Qt9C00LDQvdGLXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy5fdmFsdWVGaWVsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLl92YWx1ZUZpZWxkID09PSBudWxsICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbMF0uZmllbGROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQgPT09IG51bGwgPyAnaWQnIDogdGhpcy5fdmFsdWVGaWVsZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc3BsYXlGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoJ2Rpc3BsYXlGaWVsZCcpXHJcbiAgcHVibGljIHNldCBkaXNwbGF5RmllbGQoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZCA9IGZpZWxkTmFtZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzcGxheUZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXlGaWVsZCA9PT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RmllbGQgPT09IG51bGwgPyAnbmFtZScgOiB0aGlzLl9kaXNwbGF5RmllbGQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbnM6IEFycmF5PENvbHVtbj4gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBpdGVtczogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBwYXJlbnRTdGF0ZTogR3JpZFN0YXRlID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfc2V0dGluZ3M6IEdyaWRTZXR0aW5ncyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxyXG4gIHNldCBzZXR0aW5ncyh2KSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHY7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgaWYgKCF0aGlzLl9zZXR0aW5ncykge1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IEdyaWRTZXR0aW5ncy5taW5pbWFsKCk7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy52YWx1ZUZpZWxkO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy53aWR0aFVuaXQgPSAnZW0nO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zaG93SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmNvbHVtbkF1dG9XaWR0aCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5hcHBlYXJhbmNlLmVuYWJsZUhvdmVyQXBwZWFyYW5jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCdpdGVtU2VsZWN0JylcclxuICBpdGVtU2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZ3JpZCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGdyaWQ6IEdyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8vINCS0YvQsdC40YDQsNC10Lwg0LvQuCDQvNGLINC40Lcg0LPRgNC40LTQsFxyXG4gIF9vbkdyaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfZW1wdHkgPSBmYWxzZTtcclxuXHJcbiAgZ3JpZFN0YXJ0UHJvY2VzcyhlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9lbXB0eSAmJiB0aGlzLnNldHRpbmdzLnJlcXVlc3REYXRhKSB7XHJcbiAgICAgIHRoaXMuX2VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3VwZGF0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF91cGRhdGluZyA9IGZhbHNlO1xyXG4gIGdyaWRFbmRQcm9jZXNzKGU6IGFueSkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5wb3B1cC52aXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93QnlUYXJnZXQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBMZXQncyB1cGRhdGUgcG9zaXRpb24gb2YgcG9wdXAgd2luZG93LiBXaGVuIGxpc3QgcmVkdWNlLCBpdCBtYXkgbW92ZVxyXG4gICAgICAgIC8vIHVwIG9yIGRvd24gcmVnYXJkaW5nIGlucHV0LlxyXG4gICAgICAgIHRoaXMucG9wdXAudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmdyaWQucmVzdWx0Um93cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyaWREYXRhUXVlcnkoZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFRdWVyeS5lbWl0KGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g0J7RgtC+0LHRgNCw0LbQsNC10Lwg0LfQvdCw0YfQtdC90LjQtSDQsiDQutC+0LzQv9C+0L3QtdC90YLQtS4gRm9ybWF0dGVyOiBDdHJsIC0tPiBWaWV3XHJcbiAgd3JpdGVWYWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgIGxldCBmb3VuZCA9IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSA9PT0gdik7XHJcbiAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGZvdW5kW3RoaXMuZGlzcGxheUZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vINCX0LAg0L7QtNC40L0g0YDQsNC3INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INC4INC30L3QsNGH0LXQvdC40LUg0Lgg0L7RgtC+0LHRgNCw0LbQtdC90LjQtVxyXG4gIHNldFZhbHVlKHZhbHVlOiBhbnksIGRpc3BsYXlWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ZhbHVlIHx8IGRpc3BsYXlWYWx1ZSAhPT0gdGhpcy5kaXNwbGF5VmFsdWUpIHtcclxuICAgICAgdGhpcy5fZm9jdXNlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlO1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+INCy0LLQtdC00LXQvdC90L7QvNGDINGC0LXQutGB0YLRgyDQvdC40YfQtdCz0L4g0L3QtSDQvdCw0LnQtNC10L3Qvj9cclxuICBlbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbXB0eTtcclxuICB9XHJcblxyXG4gIC8vINCf0YDQvtC40YHRhdC+0LTQuNGCINC+0LHQvdC+0LLQu9C10L3QuNC1INC00LDQvdC90YvRhT9cclxuICB1cGRhdGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl91cGRhdGluZztcclxuICB9XHJcblxyXG4gIC8vINCe0YLQstC10YJcclxuICBmZXRjaERhdGEoZGF0YVF1ZXJ5OiBEYXRhUXVlcnksIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIGxldCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsKSB7XHJcbiAgICAgIHRoaXMuX2ZvY3VzZWRWYWx1ZSA9IHNlbFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgdGhpcy5ncmlkLmZldGNoRGF0YShkYXRhUXVlcnksIGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2NhdGVCeUtleSh0aGlzLl9mb2N1c2VkVmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRidCw0Y8g0YjQuNGA0LjQvdCwINCz0YDQuNC00LAg0LIg0LLRi9C/0LDQtNCw0Y7RidC10Lwg0YHQv9C40YHQutC1XHJcbiAgICogQHJldHVybiDQqNC40YDQuNC90LAg0LIg0LfQsNC00LDQvdC90YvRhSDQtdC00LjQvdC40YbQsNGFINC40LfQvNC10YDQtdC90LjRj1xyXG4gICAqL1xyXG4gIGdyaWRXaWR0aCgpIHtcclxuICAgIGxldCB3dyA9IDA7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHd3ICs9IGMud2lkdGgpO1xyXG4gICAgcmV0dXJuIHd3ICsgdGhpcy5zZXR0aW5ncy53aWR0aFVuaXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C10YDQtdC60YDRi9Cy0LDQtdC8INC/0L7QutCw0LfRi9Cy0LDQvdC40LUg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDQvtC60L3QsCwg0YfRgtC+0LHRiyDQvtCx0L3QvtCy0LjRgtGMINCy0YzRjiDQs9GA0LjQtNCwXHJcbiAgICog0Lgg0LLRi9C00LXQu9C40YLRjCDRgdGC0YDQvtC60YMsINGB0L7QtNC10YDQttCw0YnRg9GOINGC0LXQutGD0YnQtdC1INC30L3QsNGH0LXQvdC40LVcclxuICAgKiBAcGFyYW0gIGUg0J/QsNGA0LDQvNC10YLRgNGLINGB0L7QsdGL0YLQuNGPXHJcbiAgICovXHJcbiAgcG9wdXBTaG93KGU6IGFueSkge1xyXG4gICAgdGhpcy5fb25HcmlkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd25CeUtleSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5wcm9jZXNzS2V5KEtleXMuZ2VuZXJhdGVFdmVudChudWxsLCBLZXlzLkRPV04pKTsgLy8g0JHRg9C00LXRgiDQstGL0LHRgNCw0L3QsCDQv9C10YDQstCw0Y8g0LfQsNC/0LjRgdGMXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5jaGVja1NpemUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INC60LvQsNCy0LjRiCDQstGL0LfRi9Cy0LDQtdGC0YHRjyDQuNC3INGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INC60LvQsNGB0YHQsFxyXG4gICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIGZhbHNlLCDQtdGB0LvQuCDQutC70LDQstC40YjQsCDQvdC1INC+0LHRgNCw0LHQvtGC0LDQvdCwXHJcbiAgICovXHJcbiAgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWVGcm9tR3JpZCgpO1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5VUCkge1xyXG4gICAgICB0aGlzLl9vbkdyaWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdyaWQucHJvY2Vzc0tleShlKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyDQmtC70LjQuiDQv9C+INC30LDQv9C40YHQuCDQsiDQs9GA0LjQtNC1XHJcbiAgcHVibGljIGdyaWRSb3dDbGljayhlOiBhbnkpIHtcclxuICAgIHRoaXMuX29uR3JpZCA9IHRydWU7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSBmYWxzZTtcclxuICAgIHRoaXMudmFsdWUgPSBlLnJvd1t0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChlLnJvdyk7XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+0LLQvtGA0L7RgiDQuNC60L7QvdC60LhcclxuICBwdWJsaWMgaWNvbkNsYXNzKCkge1xyXG4gICAgbGV0IHMgPSAndHJ1ZS1pY29uLWFuZ2xlLWRvd24gdHJ1ZS10dXJuYWJsZSc7XHJcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgcyArPSAnIHRydWUtdHVybmVkJztcclxuICAgIH1cclxuICAgIHJldHVybiBzO1xyXG4gIH1cclxuXHJcbiAgLy8g0JLQstC+0LQg0YLQtdC60YHRgtCwINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC8XHJcbiAgcHVibGljIGlucHV0SW5wdXQoZTogYW55ID0gbnVsbCkge1xyXG4gICAgLy8g0J7QutC+0YjQutC+INC10YnQtSDQvdCwINCy0YvQv9Cw0LvQvj8g0L/QvtC60LDQt9GL0LLQsNC10LxcclxuICAgIGlmICghdGhpcy5wb3B1cFZpc2libGUgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuZ3JpZC5zZWFyY2hTdHJpbmcgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRhNC40LvRjNGC0YAg0L/QviDRgtC10LrRgdGC0YNcclxuICAgICAgICB0aGlzLmdyaWQuc2VhcmNoU3RyaW5nID0gdGhpcy5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDQktC+0LfQstGA0LDRgiDQstGL0LHRgNCw0L3QvdC+0Lkg0YHRgtGA0L7QutC4INCyINCz0YDQuNC00LVcclxuICBwcml2YXRlIGdldFNlbGVjdGVkUm93KCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdyaWQuc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1swXS5mcm9tQ2VsbC5yb3c7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zRGlzcGxheWVkKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmRpc3BsYXlWYWx1ZSB8fCAocyAhPT0gdW5kZWZpbmVkICYmIHMudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuZGlzcGxheVZhbHVlLnRvTG93ZXJDYXNlKCkpID49IDApO1xyXG4gIH1cclxuXHJcbiAgLy8g0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstGL0LTQtdC70LXQvdC90L7QuSDQsiDQs9GA0LjQtNC1INC30LDQv9C40YHQuFxyXG4gIHByaXZhdGUgc2V0VmFsdWVGcm9tR3JpZCgpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMucG9wdXBWaXNpYmxlICYmIHRoaXMuZ3JpZC5zdGF0ZS5tb2RlbCkge1xyXG5cclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmdyaWQuc3RhdGUubW9kZWwuZmluZChcclxuICAgICAgICAgIGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShmb3VuZFt0aGlzLnZhbHVlRmllbGRdLCBmb3VuZFt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsICYmICh0aGlzLl9vbkdyaWQgfHwgdGhpcy5jb250YWluc0Rpc3BsYXllZChzZWxbdGhpcy5kaXNwbGF5RmllbGRdKSkpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShzZWxbdGhpcy52YWx1ZUZpZWxkXSwgc2VsW3RoaXMuZGlzcGxheUZpZWxkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstCy0LXQtNC10L3QvdC+0LzRgyDRgtC10LrRgdGC0YNcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VmFsdWVGcm9tRGlzcGxheWVkKCkge1xyXG4gICAgLy8g0J/QviDQt9Cw0L/RgNC+0YHRgy4g0KHQvNC+0YLRgNC40Lwg0LIg0LPRgNC40LTQtS4g0KXQvtGC0Y8sINC10YHQu9C4INC/0L7QtNGD0LzQsNGC0YwsINC80L7QttC90L4g0LLRgdC10LPQtNCwINCyINCz0YDQuNC00LUg0YHQvNC+0YLRgNC10YLRjC4uXHJcbiAgICBsZXQgZiA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5yZXN1bHRSb3dzKSB7XHJcbiAgICAgIGYgPSB0aGlzLmdyaWQucmVzdWx0Um93cy5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZikge1xyXG4gICAgICB0aGlzLnNldFZhbHVlKGZbdGhpcy52YWx1ZUZpZWxkXSwgZlt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C+0YLQtdGA0Y8g0YTQvtC60YPRgdCwINC40L3Qv9GD0YLQvtC8XHJcbiAgICogQHBhcmFtICBlINCf0LDRgNCw0LzQtdGC0YDRiyDRgdC+0LHRi9GC0LjRj1xyXG4gICAqL1xyXG4gIGlucHV0Qmx1cihlOiBGb2N1c0V2ZW50KSB7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSB0cnVlO1xyXG4gICAgaWYgKCh0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCkgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcblxyXG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIFV0aWxzLmlzQW5jZXN0b3IodGhpcy5wb3B1cC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGUucmVsYXRlZFRhcmdldCkpIHtcclxuICAgICAgICAvLyDQldGB0LvQuCDRhNC+0LrRg9GBINC/0LXRgNC10YjQtdC7INC90LAuLi5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gICAgc3VwZXIuaW5wdXRCbHVyKGUpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgICAgc3VwZXIoX2VsZW1lbnRSZWYsIF9yZW5kZXJlcik7XHJcbiAgICAgIHRoaXMudXNlQWx0RG93biA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=