@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
246 lines • 28.9 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Output, EventEmitter, ViewChild, Renderer2 } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Column, ColumnType, GridSettings } from '@true-directive/base';
import { Keys } from '@true-directive/base';
import { DropdownBaseComponent } from '../controls/dropdown-base.component';
let EditorSelectTrueComponent = class EditorSelectTrueComponent {
constructor(_renderer) {
this._renderer = _renderer;
this.destroy$ = new Subject();
this.ie = false;
this.valueChanged = false;
this.height = 0;
this.wasShown = false;
this.initialized = false;
this._value = null;
this.displayValue = '';
this.disableTextEditor = false;
this.commit = new EventEmitter();
this.change = new EventEmitter();
this.cancel = new EventEmitter();
/**
* Список колонок выпадающего списка
*/
this._columns = null;
/**
* Настройки грида в выпадающем списке
*/
this._settings = null;
/**
* Данные выпадающего списка
*/
this._items = null;
this._valueField = null;
this._displayField = null;
}
get value() {
return this._value;
}
set value(v) {
this._value = v;
this.change.emit(v);
}
get maxDropDownHeight() {
return this.state.settings.maxDropDownHeight;
}
get columns() {
if (this._columns === null) {
if (this.column.optionsColumns !== null) {
this._columns = this.column.optionsColumns;
}
else {
this._columns = [new Column('name', 'name', 300, ColumnType.STRING)];
}
}
return this._columns;
}
get settings() {
if (this._settings === null) {
this._settings = GridSettings.minimal();
this._settings.appearance.class = this.state.settings.appearance.class;
this._settings.appearance.enableFocusedAppearance = false;
this._settings.showHeader = false;
this._settings.searchDelay = 100;
}
return this._settings;
}
get items() {
if (this._items === null) {
if (this.column.optionsData instanceof Observable) {
// Подпись
const observable = this.column.optionsData;
observable.pipe(takeUntil(this.destroy$)).subscribe(data => {
this._items = data;
});
}
else {
this._items = this.column.optionsData;
}
}
return this._items;
}
get valueField() {
if (this._valueField === null) {
this._valueField = this.columns[0].fieldName;
}
return this._valueField;
}
get displayField() {
if (this._displayField === null) {
this._displayField = this.columns[0].fieldName;
}
return this._displayField;
}
init(value, valueChanged, height, ie = false, wasShown = false) {
if (this.state.touchMode) {
this.input.popupPosition = 'MODAL';
this.disableTextEditor = true;
}
if (valueChanged) {
if (!this.disableTextEditor) {
this.displayValue = value;
this.valueChanged = true;
}
else {
this.valueChanged = false;
}
this.change.emit(null);
}
else {
// Без события об изменении
this._value = value;
}
this.wasShown = wasShown;
this.height = height;
this.ie = ie;
}
inputItemSelect(e) {
if (this.state.touchMode) {
this.commit.emit(this.value);
}
}
// Останавливаем propagation, чтобы не влиять на grid
inputMouseDown(e) {
e.stopPropagation();
}
inputKeyDown(e) {
if (e.defaultPrevented) {
return;
}
if (e.keyCode === Keys.TAB) {
this.input.setValueFromDisplayed();
return;
}
if (e.keyCode === Keys.UP ||
e.keyCode === Keys.DOWN ||
e.keyCode === Keys.PAGE_UP ||
e.keyCode === Keys.PAGE_DOWN) {
// По идее просто их должен отработать грид
e.stopPropagation();
return;
}
e.stopPropagation();
if (e.keyCode === Keys.ESCAPE) {
this.cancel.emit();
return;
}
if (e.keyCode === Keys.ENTER) {
this.commit.emit(this.value);
return;
}
}
ngAfterContentInit() {
if (!this.valueChanged) {
if (this.state.touchMode) {
// На тач устройствах не будем фокусироваться на инпуте,
// нам достаточно показать форму для выбора в модальном режиме
if (!this.wasShown) {
setTimeout(() => this.input.showByTarget());
}
}
else {
setTimeout(() => this.input.focus());
}
return;
}
this.input.focus();
setTimeout(() => {
this._renderer.setProperty(this.input.input.nativeElement, 'value', this.displayValue);
this._renderer.setProperty(this.input.input.nativeElement, 'selectionStart', this.displayValue.length);
this._renderer.setProperty(this.input.input.nativeElement, 'selectionEnd', this.displayValue.length);
this.input.displayValue = this.displayValue === null ? '' : this.displayValue;
this.input.inputInput();
});
}
// Если у нас есть информация о высоте строки - берем её и не
// назначаем никакого класса
getClass() {
if ((this.height !== null && this.height > 0)) {
return 'true-grid__input-container';
}
if (this.ie) {
return 'true-grid-editor-ie';
}
return 'true-grid-editor-100p';
}
getH() {
if (this.height !== null && this.height > 0) {
return this.height + 'px';
}
return '100%';
}
ngOnDestroy() {
// Если нас удаляют...
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
};
tslib_1.__decorate([
ViewChild('input', { static: true }),
tslib_1.__metadata("design:type", DropdownBaseComponent)
], EditorSelectTrueComponent.prototype, "input", void 0);
tslib_1.__decorate([
Output("commit"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorSelectTrueComponent.prototype, "commit", void 0);
tslib_1.__decorate([
Output("change"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorSelectTrueComponent.prototype, "change", void 0);
tslib_1.__decorate([
Output("cancel"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorSelectTrueComponent.prototype, "cancel", void 0);
EditorSelectTrueComponent = tslib_1.__decorate([
Component({
selector: 'true-editor-select-true',
template: `<div [ngClass]="getClass()" [style.height]="getH()">
<true-select #input
class="true-editor-select__selector"
[(ngModel)]="value"
[style.height]="getH()"
[valueField]="valueField"
[displayField]="displayField"
[columns]="columns"
[settings]="settings"
[items]="items"
[useAltDown]="true"
[maxDropDownHeight]="maxDropDownHeight"
[disableTextEditor]="disableTextEditor"
(mousedown)="inputMouseDown($event)"
(itemSelect)="inputItemSelect($event)"
(keydown)="inputKeyDown($event)"></true-select>
</div>`,
styles: [":host{box-sizing:border-box;padding:0}.true-editor-select__selector{width:100%}.true-editor-select__selector ::ng-deep .true-select__input{height:100%}.true-editor-select__selector ::ng-deep input{border:0}.true-editor-select__container{padding:0;margin:0;background-color:#00f;box-sizing:border-box;height:100%}"]
}),
tslib_1.__metadata("design:paramtypes", [Renderer2])
], EditorSelectTrueComponent);
export { EditorSelectTrueComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2VkaXRvcnMvZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQVMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQ2pELFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBd0I1RSxJQUFhLHlCQUF5QixHQUF0QyxNQUFhLHlCQUF5QjtJQW9PcEMsWUFBc0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWxPaEMsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRXRELE9BQUUsR0FBWSxLQUFLLENBQUM7UUFDcEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFjcEIsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFFMUIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBVWpDLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdsRCxXQUFNLEdB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ZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCxcclxuICAgICAgICAgUmVuZGVyZXIyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5UeXBlLCBHcmlkU2V0dGluZ3MgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEtleXMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29udHJvbHMvZHJvcGRvd24tYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJRWRpdG9yIH0gZnJvbSBcIi4vZWRpdG9yLmludGVyZmFjZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWVkaXRvci1zZWxlY3QtdHJ1ZScsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IFtuZ0NsYXNzXT1cImdldENsYXNzKClcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEgoKVwiPlxyXG4gICAgICAgICAgICAgIDx0cnVlLXNlbGVjdCAjaW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1ZS1lZGl0b3Itc2VsZWN0X19zZWxlY3RvclwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SCgpXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cInZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlGaWVsZF09XCJkaXNwbGF5RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICBbc2V0dGluZ3NdPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICAgICAgICAgICAgICAgIFt1c2VBbHREb3duXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW21heERyb3BEb3duSGVpZ2h0XT1cIm1heERyb3BEb3duSGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlVGV4dEVkaXRvcl09XCJkaXNhYmxlVGV4dEVkaXRvclwiXHJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImlucHV0TW91c2VEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGl0ZW1TZWxlY3QpPVwiaW5wdXRJdGVtU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW5wdXRLZXlEb3duKCRldmVudClcIj48L3RydWUtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5gLFxyXG4gIHN0eWxlVXJsczogWycuL2VkaXRvci1zZWxlY3QtdHJ1ZS5jb21wb25lbnQuc2NzcyddXHJcbiAgfSlcclxuZXhwb3J0IGNsYXNzIEVkaXRvclNlbGVjdFRydWVDb21wb25lbnQgaW1wbGVtZW50cyBJRWRpdG9yLCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcm90ZWN0ZWQgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBwcml2YXRlIGllOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGhlaWdodDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHdhc1Nob3duID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQodik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG1heERyb3BEb3duSGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZXR0aW5ncy5tYXhEcm9wRG93bkhlaWdodDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVRleHRFZGl0b3IgPSBmYWxzZTtcclxuXHJcbiAgc3RhdGU6IEdyaWRTdGF0ZVNlcnZpY2U7XHJcbiAgY29sdW1uOiBDb2x1bW47XHJcbiAgcm93OiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0Jywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgaW5wdXQ6IERyb3Bkb3duQmFzZUNvbXBvbmVudDtcclxuXHJcbiAgQE91dHB1dChcImNvbW1pdFwiKVxyXG4gIGNvbW1pdDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoXCJjaGFuZ2VcIilcclxuICBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KFwiY2FuY2VsXCIpXHJcbiAgY2FuY2VsOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqINCh0L/QuNGB0L7QuiDQutC+0LvQvtC90L7QuiDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IENvbHVtbltdID0gbnVsbDtcclxuICBnZXQgY29sdW1ucygpOiBDb2x1bW5bXSB7XHJcbiAgICBpZiAodGhpcy5fY29sdW1ucyA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4ub3B0aW9uc0NvbHVtbnMgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW4ub3B0aW9uc0NvbHVtbnM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IFtuZXcgQ29sdW1uKCduYW1lJywgJ25hbWUnLCAzMDAsIENvbHVtblR5cGUuU1RSSU5HKV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0J3QsNGB0YLRgNC+0LnQutC4INCz0YDQuNC00LAg0LIg0LLRi9C/0LDQtNCw0Y7RidC10Lwg0YHQv9C40YHQutC1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0dGluZ3M6IEdyaWRTZXR0aW5ncyA9IG51bGw7XHJcbiAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzID0gR3JpZFNldHRpbmdzLm1pbmltYWwoKTtcclxuICAgICAgdGhpcy5fc2V0dGluZ3MuYXBwZWFyYW5jZS5jbGFzcyA9IHRoaXMuc3RhdGUuc2V0dGluZ3MuYXBwZWFyYW5jZS5jbGFzcztcclxuICAgICAgdGhpcy5fc2V0dGluZ3MuYXBwZWFyYW5jZS5lbmFibGVGb2N1c2VkQXBwZWFyYW5jZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zaG93SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLnNlYXJjaERlbGF5ID0gMTAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0JTQsNC90L3Ri9C1INCy0YvQv9Cw0LTQsNGO0YnQtdCz0L4g0YHQv9C40YHQutCwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdID0gbnVsbDtcclxuICBnZXQgaXRlbXMoKTogYW55W10ge1xyXG4gICAgaWYgKHRoaXMuX2l0ZW1zID09PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5vcHRpb25zRGF0YSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgICAvLyDQn9C+0LTQv9C40YHRjFxyXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSA8T2JzZXJ2YWJsZTxhbnk+PnRoaXMuY29sdW1uLm9wdGlvbnNEYXRhO1xyXG4gICAgICAgIG9ic2VydmFibGUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMuX2l0ZW1zID0gZGF0YTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHRoaXMuY29sdW1uLm9wdGlvbnNEYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IHZhbHVlRmllbGQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl92YWx1ZUZpZWxkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlRmllbGQgPSB0aGlzLmNvbHVtbnNbMF0uZmllbGROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNwbGF5RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIGdldCBkaXNwbGF5RmllbGQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5RmllbGQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGlzcGxheUZpZWxkID0gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RmllbGQ7XHJcbiAgfVxyXG5cclxuICBpbml0KHZhbHVlOiBhbnksIHZhbHVlQ2hhbmdlZDogYm9vbGVhbiwgaGVpZ2h0OiBudW1iZXIsIGllOiBib29sZWFuID0gZmFsc2UsIHdhc1Nob3duOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLnRvdWNoTW9kZSkge1xyXG4gICAgICB0aGlzLmlucHV0LnBvcHVwUG9zaXRpb24gPSAnTU9EQUwnO1xyXG4gICAgICB0aGlzLmRpc2FibGVUZXh0RWRpdG9yID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vINCR0LXQtyDRgdC+0LHRi9GC0LjRjyDQvtCxINC40LfQvNC10L3QtdC90LjQuFxyXG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2FzU2hvd24gPSB3YXNTaG93bjtcclxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgdGhpcy5pZSA9IGllO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRJdGVtU2VsZWN0KGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG91Y2hNb2RlKSB7XHJcbiAgICAgIHRoaXMuY29tbWl0LmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDQntGB0YLQsNC90LDQstC70LjQstCw0LXQvCBwcm9wYWdhdGlvbiwg0YfRgtC+0LHRiyDQvdC1INCy0LvQuNGP0YLRjCDQvdCwIGdyaWRcclxuICBpbnB1dE1vdXNlRG93bihlOiBhbnkpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBpbnB1dEtleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5UQUIpIHtcclxuICAgICAgdGhpcy5pbnB1dC5zZXRWYWx1ZUZyb21EaXNwbGF5ZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuVVAgfHxcclxuICAgICAgICBlLmtleUNvZGUgPT09IEtleXMuRE9XTiB8fFxyXG4gICAgICAgIGUua2V5Q29kZSA9PT0gS2V5cy5QQUdFX1VQIHx8XHJcbiAgICAgICAgZS5rZXlDb2RlID09PSBLZXlzLlBBR0VfRE9XTikge1xyXG4gICAgICAvLyDQn9C+INC40LTQtdC1INC/0YDQvtGB0YLQviDQuNGFINC00L7Qu9C20LXQvSDQvtGC0YDQsNCx0L7RgtCw0YLRjCDQs9GA0LjQtFxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVTQ0FQRSkge1xyXG4gICAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuY29tbWl0LmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIGlmICghdGhpcy52YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUudG91Y2hNb2RlKSB7XHJcbiAgICAgICAgLy8g0J3QsCDRgtCw0Ycg0YPRgdGC0YDQvtC50YHRgtCy0LDRhSDQvdC1INCx0YPQtNC10Lwg0YTQvtC60YPRgdC40YDQvtCy0LDRgtGM0YHRjyDQvdCwINC40L3Qv9GD0YLQtSxcclxuICAgICAgICAvLyDQvdCw0Lwg0LTQvtGB0YLQsNGC0L7Rh9C90L4g0L/QvtC60LDQt9Cw0YLRjCDRhNC+0YDQvNGDINC00LvRjyDQstGL0LHQvtGA0LAg0LIg0LzQvtC00LDQu9GM0L3QvtC8INGA0LXQttC40LzQtVxyXG4gICAgICAgIGlmICghdGhpcy53YXNTaG93bikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0LnNob3dCeVRhcmdldCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0LmZvY3VzKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlucHV0LmZvY3VzKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5pbnB1dC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLmRpc3BsYXlWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgdGhpcy5kaXNwbGF5VmFsdWUubGVuZ3RoKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdGhpcy5kaXNwbGF5VmFsdWUubGVuZ3RoKTtcclxuICAgICAgdGhpcy5pbnB1dC5kaXNwbGF5VmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZSA9PT0gbnVsbCA/ICcnIDogdGhpcy5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIHRoaXMuaW5wdXQuaW5wdXRJbnB1dCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDQldGB0LvQuCDRgyDQvdCw0YEg0LXRgdGC0Ywg0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LLRi9GB0L7RgtC1INGB0YLRgNC+0LrQuCAtINCx0LXRgNC10Lwg0LXRkSDQuCDQvdC1XHJcbiAgLy8g0L3QsNC30L3QsNGH0LDQtdC8INC90LjQutCw0LrQvtCz0L4g0LrQu9Cw0YHRgdCwXHJcbiAgZ2V0Q2xhc3MoKSB7XHJcbiAgICBpZiAoKHRoaXMuaGVpZ2h0ICE9PSBudWxsICYmIHRoaXMuaGVpZ2h0ID4gMCkpIHtcclxuICAgICAgcmV0dXJuICd0cnVlLWdyaWRfX2lucHV0LWNvbnRhaW5lcic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pZSkge1xyXG4gICAgICByZXR1cm4gJ3RydWUtZ3JpZC1lZGl0b3ItaWUnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICd0cnVlLWdyaWQtZWRpdG9yLTEwMHAnO1xyXG4gIH1cclxuXHJcbiAgZ2V0SCgpIHtcclxuICAgIGlmICh0aGlzLmhlaWdodCAhPT0gbnVsbCAmJiB0aGlzLmhlaWdodCA+IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiAnMTAwJSc7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vINCV0YHQu9C4INC90LDRgSDRg9C00LDQu9GP0Y7Rgi4uLlxyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxufVxyXG4iXX0=