UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

395 lines 50.2 kB
import * as tslib_1 from "tslib"; /** * 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'; var SelectComponent = /** @class */ (function (_super) { tslib_1.__extends(SelectComponent, _super); function SelectComponent(_elementRef, _renderer) { var _this = _super.call(this, _elementRef, _renderer) || this; _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; return _this; } SelectComponent_1 = SelectComponent; Object.defineProperty(SelectComponent.prototype, "value", { get: function () { return this._value; }, /** * Current value */ set: function (v) { if (v !== this._value) { this._value = v; this.writeValue(this._value); this.onChange(v); } }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "valueField", { get: function () { if (this._valueField === null && this.columns.length > 0) { return this.columns[0].fieldName; } return this._valueField === null ? 'id' : this._valueField; }, set: function (fieldName) { this._valueField = fieldName; if (this._settings) { // Настройки могут быть еще не созданы this._settings.keyField = this._valueField; } }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "displayField", { get: function () { if (this._displayField === null && this.columns.length > 0) { return this.columns[0].fieldName; } return this._displayField === null ? 'name' : this._displayField; }, set: function (fieldName) { this._displayField = fieldName; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "settings", { get: function () { 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; }, set: function (v) { this._settings = v; this._settings.enableTouchScroll = false; }, enumerable: true, configurable: true }); SelectComponent.prototype.gridStartProcess = function (e) { if (this._empty && this.settings.requestData) { this._empty = false; this._updating = true; } }; SelectComponent.prototype.gridEndProcess = function (e) { var _this = this; setTimeout(function () { 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; } }; SelectComponent.prototype.gridDataQuery = function (e) { this.dataQuery.emit(e); }; // Отображаем значение в компоненте. Formatter: Ctrl --> View SelectComponent.prototype.writeValue = function (v) { var _this = this; this._value = v; var found = this.items.find(function (item) { return item[_this.valueField] === v; }); if (!found) { this.displayValue = ''; } else { this.displayValue = found[this.displayField]; } }; // За один раз устанавливаем и значение и отображение SelectComponent.prototype.setValue = function (value, displayValue) { if (value !== this._value || displayValue !== this.displayValue) { this._focusedValue = value; this.displayValue = displayValue; this.value = value; } }; // По введенному тексту ничего не найдено? SelectComponent.prototype.empty = function () { return this._empty; }; // Происходит обновление данных? SelectComponent.prototype.updating = function () { return this._updating; }; // Ответ SelectComponent.prototype.fetchData = function (dataQuery, data) { var 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 Ширина в заданных единицах измерения */ SelectComponent.prototype.gridWidth = function () { var ww = 0; this.columns.forEach(function (c) { return ww += c.width; }); return ww + this.settings.widthUnit; }; /** * Перекрываем показывание выпадающего окна, чтобы обновить вью грида * и выделить строку, содержащую текущее значение * @param e Параметры события */ SelectComponent.prototype.popupShow = function (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, если клавиша не обработана */ SelectComponent.prototype.processKey = function (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; }; // Клик по записи в гриде SelectComponent.prototype.gridRowClick = function (e) { this._onGrid = true; this._skipFocusOnPopupClose = false; this.value = e.row[this.valueField]; this.popup.closePopup(); this.itemSelect.emit(e.row); }; // Поворот иконки SelectComponent.prototype.iconClass = function () { var s = 'true-icon-angle-down true-turnable'; if (this.popupVisible) { s += ' true-turned'; } return s; }; // Ввод текста пользователем SelectComponent.prototype.inputInput = function (e) { var _this = this; if (e === void 0) { e = null; } // Окошко еще на выпало? показываем if (!this.popupVisible && this.displayValue !== '') { this.grid.searchString = this.displayValue; return; } if (this.popupVisible) { setTimeout(function () { // Устанавливаем фильтр по тексту _this.grid.searchString = _this.displayValue; }); } if (this.displayValue === '') { this.setValue(null, ''); return; } this._value = null; }; // Возврат выбранной строки в гриде SelectComponent.prototype.getSelectedRow = function () { if (this.grid && this.grid.state.selection.ranges.length > 0) { var item = this.grid.state.selection.ranges[0].fromCell.row; return item; } return null; }; SelectComponent.prototype.containsDisplayed = function (s) { return !this.displayValue || (s !== undefined && s.toLowerCase().indexOf(this.displayValue.toLowerCase()) >= 0); }; // Установка значения по выделенной в гриде записи SelectComponent.prototype.setValueFromGrid = function () { var _this = this; if (!this.popupVisible && this.grid.state.model) { var found = this.grid.state.model.find(function (item) { return item[_this.displayField].toLowerCase() === _this.displayValue.toLowerCase(); }); if (found) { this.setValue(found[this.valueField], found[this.displayField]); } else { this.setValue(null, ''); } return; } var sel = this.getSelectedRow(); if (sel && (this._onGrid || this.containsDisplayed(sel[this.displayField]))) { this.setValue(sel[this.valueField], sel[this.displayField]); } else { this.setValueFromDisplayed(); } }; /** * Установка значения по введенному тексту */ SelectComponent.prototype.setValueFromDisplayed = function () { var _this = this; // По запросу. Смотрим в гриде. Хотя, если подумать, можно всегда в гриде смотреть.. var f = null; if (this.grid && this.grid.resultRows) { f = this.grid.resultRows.find(function (item) { return item[_this.displayField].toLowerCase() === _this.displayValue.toLowerCase(); }); } if (f) { this.setValue(f[this.valueField], f[this.displayField]); } else { this.setValue(null, ''); } return; }; /** * Потеря фокуса инпутом * @param e Параметры события */ SelectComponent.prototype.inputBlur = function (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.prototype.inputBlur.call(this, e); }; var SelectComponent_1; 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: "\n <true-input-wrapper\n (btnClick)=\"btnClick($event)\"\n [disabled]=\"disabled\"\n class=\"true-select__input\"\n [class.true-input_popup-visible]=\"popupVisible\"\n [icon]=\"iconClass()\">\n <input #input\n [(ngModel)]=\"displayValue\"\n [readonly]=\"disableTextEditor\"\n [attr.disabled]=\"disabled\"\n [class.true-disable-te]=\"disableTextEditor\"\n (input)=\"inputInput($event)\"\n (click)=\"inputClick($event)\"\n (touchstart)=\"inputTouchStart($event)\"\n (touchmove)=\"inputTouchMove($event)\"\n (touchend)=\"inputTouchEnd($event)\"\n (blur)=\"inputBlur($event)\"\n (focus)=\"inputFocus($event)\"\n (keydown)=\"inputKeyDown($event)\"/>\n </true-input-wrapper>\n <true-popup #popup\n (close)=\"popupClose($event)\"\n (show)=\"popupShow($event)\" >\n <true-grid #grid\n [class.true-select__grid_hidden]=\"empty()\"\n class=\"true-select__grid\"\n [maxHeight]=\"maxDropDownHeight\"\n [columns]=\"columns\"\n [data]=\"items\"\n [settings]=\"settings\"\n (dataQuery)=\"gridDataQuery($event)\"\n (startProcess)=\"gridStartProcess($event)\"\n (endProcess)=\"gridEndProcess($event)\"\n (rowClick)=\"gridRowClick($event)\">\n </true-grid>\n <div *ngIf=\"empty()\" class=\"true-select__notfound\" [style.width]=\"gridWidth()\">\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E</div>\n <div *ngIf=\"updating()\" class=\"true-select__updating\">\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...</div>\n </true-popup>\n ", providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return SelectComponent_1; }), multi: true }], styles: ["\n\n .true-select__input {\n width: 100%;\n }\n\n input {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n\n .true-select__grid_hidden {\n display: none;\n }\n\n .true-select__grid {\n border: none !important;\n cursor: pointer;\n }\n\n .true-select__notfound, .true-select__updating {\n padding: 0.6em;\n box-sizing: border-box;\n color: #aaa;\n }\n "] }), tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2]) ], SelectComponent); return SelectComponent; }(DropdownBaseComponent)); export { SelectComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2NvbnRyb2xzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0VBSUU7QUFDRixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBRTFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUErRW5EO0lBQXFDLDJDQUFxQjtJQW1XeEQseUJBQ1ksV0FBdUIsRUFDdkIsU0FBb0I7UUFGaEMsWUFHSSxrQkFBTSxXQUFXLEVBQUUsU0FBUyxDQUFDLFNBRWhDO1FBSlcsaUJBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsZUFBUyxHQUFULFNBQVMsQ0FBVztRQW5XaEM7O1dBRUc7UUFDSSxrQkFBWSxHQUFXLEVBQUUsQ0FBQztRQWlCakMsZ0JBQWdCO1FBRWhCLGVBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUvQyxtQkFBYSxHQUFRLElBQUksQ0FBQztRQUMxQixpQkFBVyxHQUFXLElBQUksQ0FBQztRQWtCM0IsbUJBQWEsR0FBVyxJQUFJLENBQUM7UUFjckMsYUFBTyxHQUFrQixFQUFFLENBQUM7UUFNNUIsaUJBQVcsR0FBYyxJQUFJLENBQUM7UUFFdEIsZUFB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QkFBZSxFQUFmLENBQWUsQ0FBQztvQkFDOUMsS0FBSyxFQUFFLElBQUk7aUJBQUMsQ0FBQztxQkE5QlIsZ2NBMEJSO1NBS0EsQ0FBQztpREFxV3VCLFVBQVU7WUFDWixTQUFTO09BcldyQixlQUFlLENBeVczQjtJQUFELHNCQUFDO0NBQUEsQUF6V0QsQ0FBcUMscUJBQXFCLEdBeVd6RDtTQXpXWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU2V0dGluZ3MsIEdyaWRTdGF0ZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uLCBEYXRhUXVlcnkgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEtleXMsIFV0aWxzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6YFxyXG4gICAgICA8dHJ1ZS1pbnB1dC13cmFwcGVyXHJcbiAgICAgICAgKGJ0bkNsaWNrKT1cImJ0bkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9faW5wdXRcIlxyXG4gICAgICAgIFtjbGFzcy50cnVlLWlucHV0X3BvcHVwLXZpc2libGVdPVwicG9wdXBWaXNpYmxlXCJcclxuICAgICAgICBbaWNvbl09XCJpY29uQ2xhc3MoKVwiPlxyXG4gICAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLWRpc2FibGUtdGVdPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICAoaW5wdXQpPVwiaW5wdXRJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cImlucHV0VG91Y2hTdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJpbnB1dFRvdWNoTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNoZW5kKT1cImlucHV0VG91Y2hFbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChibHVyKT1cImlucHV0Qmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cImlucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5RG93bigkZXZlbnQpXCIvPlxyXG4gICAgICA8L3RydWUtaW5wdXQtd3JhcHBlcj5cclxuICAgICAgPHRydWUtcG9wdXAgI3BvcHVwXHJcbiAgICAgICAgKGNsb3NlKT1cInBvcHVwQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNob3cpPVwicG9wdXBTaG93KCRldmVudClcIiA+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=