@neocomplexx/ngx-neo-completer
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
388 lines (387 loc) • 36.9 kB
JavaScript
;
import { __decorate, __metadata } from "tslib";
import { ChangeDetectorRef, Component, Input, Output, EventEmitter, ViewChild, forwardRef, ElementRef } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CtrCompleter } from '../directives/ctr-completer';
import { CompleterService } from '../services/completer-service';
import { MAX_CHARS, MIN_SEARCH_LENGTH, PAUSE, TEXT_SEARCHING, TEXT_NO_RESULTS } from '../globals';
const noop = () => { };
const ɵ0 = noop;
const COMPLETER_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CompleterCmp),
multi: true
};
let CompleterCmp =
// tslint:disable-next-line:component-class-suffix
class CompleterCmp {
constructor(completerService, cdr) {
this.completerService = completerService;
this.cdr = cdr;
this.inputName = '';
this.inputId = '';
this.pause = PAUSE;
this.minSearchLength = MIN_SEARCH_LENGTH;
this.maxChars = MAX_CHARS;
this.overrideSuggested = false;
this.clearSelected = false;
this.clearUnselected = false;
this.fillHighlighted = true;
this.placeholder = '';
this.autoMatch = false;
this.disableInput = false;
this.autofocus = false;
this.openOnFocus = false;
this.openOnClick = false;
this.selectOnClick = false;
this.autoHighlight = false;
this.autoSelectOnEnter = true;
this.selected = new EventEmitter();
this.highlighted = new EventEmitter();
// tslint:disable:no-output-rename
this.blurEvent = new EventEmitter();
this.click = new EventEmitter();
this.focusEvent = new EventEmitter();
this.opened = new EventEmitter();
this.keyup = new EventEmitter();
this.keydown = new EventEmitter();
this.searchStr = '';
this.control = new FormControl('');
this.displaySearching = true;
this.displayNoResults = true;
this._textNoResults = TEXT_NO_RESULTS;
this._textSearching = TEXT_SEARCHING;
this._onTouchedCallback = noop;
this._onChangeCallback = noop;
this._focus = false;
this._open = false;
}
get value() { return this.searchStr; }
set value(v) {
if (v !== this.searchStr) {
this.searchStr = v;
}
// Propagate the change in any case
this._onChangeCallback(v);
}
ngAfterViewInit() {
if (this.autofocus) {
this._focus = true;
}
}
ngAfterViewChecked() {
if (this._focus) {
setTimeout(() => {
this.ctrInput.nativeElement.focus();
this._focus = false;
}, 0);
}
}
onTouched() {
this._onTouchedCallback();
}
writeValue(value) {
this.searchStr = value;
}
registerOnChange(fn) {
this._onChangeCallback = fn;
}
registerOnTouched(fn) {
this._onTouchedCallback = fn;
}
setDisabledState(isDisabled) {
this.disableInput = isDisabled;
}
set datasource(source) {
if (source) {
if (source instanceof Array) {
this.dataService = this.completerService.local(source);
}
else if (typeof (source) === 'string') {
this.dataService = this.completerService.remote(source);
}
else {
this.dataService = source;
}
}
}
set textNoResults(text) {
if (this._textNoResults !== text) {
this._textNoResults = text;
this.displayNoResults = !!this._textNoResults && this._textNoResults !== 'false';
}
}
set textSearching(text) {
if (this._textSearching !== text) {
this._textSearching = text;
this.displaySearching = !!this._textSearching && this._textSearching !== 'false';
}
}
ngOnInit() {
this.completer.selected.subscribe((item) => {
this.selected.emit(item);
});
this.completer.highlighted.subscribe((item) => {
this.highlighted.emit(item);
});
this.completer.opened.subscribe((isOpen) => {
this._open = isOpen;
this.opened.emit(isOpen);
});
}
onBlur() {
this.blurEvent.emit();
this.onTouched();
this.cdr.detectChanges();
}
onFocus() {
this.focusEvent.emit();
this.onTouched();
}
onClick(event) {
this.click.emit(event);
this.onTouched();
}
onKeyup(event) {
this.keyup.emit(event);
}
onKeydown(event) {
this.keydown.emit(event);
}
onChange(value) {
this.value = value;
}
open() {
this.completer.open();
}
close() {
this.completer.clear();
}
focus() {
if (this.ctrInput) {
this.ctrInput.nativeElement.focus();
}
else {
this._focus = true;
}
}
blur() {
if (this.ctrInput) {
this.ctrInput.nativeElement.blur();
}
else {
this._focus = false;
}
}
isOpen() {
return this._open;
}
};
CompleterCmp.ctorParameters = () => [
{ type: CompleterService },
{ type: ChangeDetectorRef }
];
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "dataService", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "inputName", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "inputId", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "pause", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "minSearchLength", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "maxChars", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "overrideSuggested", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "clearSelected", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "clearUnselected", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "fillHighlighted", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "placeholder", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], CompleterCmp.prototype, "matchClass", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], CompleterCmp.prototype, "fieldTabindex", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoMatch", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "disableInput", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], CompleterCmp.prototype, "inputClass", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autofocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "openOnFocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "openOnClick", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "selectOnClick", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "initialValue", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoHighlight", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoSelectOnEnter", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "selected", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "highlighted", void 0);
__decorate([
Output('blur'),
__metadata("design:type", Object)
], CompleterCmp.prototype, "blurEvent", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "click", void 0);
__decorate([
Output('focus'),
__metadata("design:type", Object)
], CompleterCmp.prototype, "focusEvent", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "opened", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], CompleterCmp.prototype, "keyup", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], CompleterCmp.prototype, "keydown", void 0);
__decorate([
ViewChild(CtrCompleter, { static: true }),
__metadata("design:type", CtrCompleter)
], CompleterCmp.prototype, "completer", void 0);
__decorate([
ViewChild('ctrInput', { static: true }),
__metadata("design:type", ElementRef)
], CompleterCmp.prototype, "ctrInput", void 0);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], CompleterCmp.prototype, "datasource", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], CompleterCmp.prototype, "textNoResults", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], CompleterCmp.prototype, "textSearching", null);
CompleterCmp = __decorate([
Component({
// tslint:disable:max-line-length
selector: 'neo-completer',
template: `
<div class="completer-holder" ctrCompleter>
<input #ctrInput [attr.id]="inputId.length > 0 ? inputId : null" type="search" class="completer-input" ctrInput [ngClass]="inputClass"
[(ngModel)]="searchStr" (ngModelChange)="onChange($event)" [attr.name]="inputName" [placeholder]="placeholder"
[attr.maxlength]="maxChars" [tabindex]="fieldTabindex" [disabled]="disableInput"
[clearSelected]="clearSelected" [clearUnselected]="clearUnselected"
[overrideSuggested]="overrideSuggested" [openOnFocus]="openOnFocus" [fillHighlighted]="fillHighlighted"
[openOnClick]="openOnClick" [selectOnClick]="selectOnClick" [autoSelectOnEnter]="autoSelectOnEnter"
(blur)="onBlur()" (focus)="onFocus()" (keyup)="onKeyup($event)" (keydown)="onKeydown($event)" (click)="onClick($event)"
autocomplete="off" autocorrect="off" autocapitalize="off" />
<div class="completer-dropdown-holder"
*ctrList="dataService;
minSearchLength: minSearchLength;
pause: pause;
autoMatch: autoMatch;
initialValue: initialValue;
autoHighlight: autoHighlight;
displaySearching: displaySearching;
let items = results;
let searchActive = searching;
let isInitialized = searchInitialized;
let isOpen = isOpen;">
<div class="completer-dropdown" ctrDropdown *ngIf="isInitialized && isOpen && (( items?.length > 0|| (displayNoResults && !searchActive)) || (searchActive && displaySearching))">
<div *ngIf="searchActive && displaySearching" class="completer-searching">{{_textSearching}}</div>
<div *ngIf="!searchActive && (!items || items?.length === 0)" class="completer-no-results">{{_textNoResults}}</div>
<div class="completer-row-wrapper" *ngFor="let item of items; let rowIndex=index">
<div class="completer-row" [ctrRow]="rowIndex" [dataItem]="item">
<div *ngIf="item.image || item.image === ''" class="completer-image-holder">
<img *ngIf="item.image != ''" src="{{item.image}}" class="completer-image" />
<div *ngIf="item.image === ''" class="completer-image-default"></div>
</div>
<div class="completer-item-text" [ngClass]="{'completer-item-text-image': item.image || item.image === '' }">
<completer-list-item class="completer-title" [text]="item.title" [matchClass]="matchClass" [searchStr]="searchStr" [type]="'title'"></completer-list-item>
<completer-list-item *ngIf="item.description && item.description != ''" class="completer-description" [text]="item.description"
[matchClass]="matchClass" [searchStr]="searchStr" [type]="'description'">
</completer-list-item>
</div>
</div>
</div>
</div>
</div>
</div>
`,
providers: [COMPLETER_CONTROL_VALUE_ACCESSOR],
styles: [".completer-dropdown{border-radius:0;width:calc(100% - 30px);cursor:pointer;z-index:9999;position:absolute;background-color:#fff;max-height:200px;height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #ececec}.completer-row{color:#000;width:100%;padding:5px 12px}.completer-selected-row{background-color:#add8e6;color:#fff}.completer-description{font-size:14px}.completer-image-default{width:16px;height:16px;background-image:url(demo/res/img/default.png)}.completer-image-holder{float:left;width:10%}.completer-item-text-image{float:right;width:90%}"]
})
// tslint:disable-next-line:component-class-suffix
,
__metadata("design:paramtypes", [CompleterService, ChangeDetectorRef])
], CompleterCmp);
export { CompleterCmp };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGVyLWNtcC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWNvbXBsZXRlci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbXBsZXRlci1jbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUNiLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0gsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBRXZCLE1BQU0sZ0NBQWdDLEdBQUc7SUFDckMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztJQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFzREYsSUFBYSxZQUFZO0FBRHpCLGtEQUFrRDtBQUNsRCxNQUFhLFlBQVk7SUFrRHJCLFlBQW9CLGdCQUFrQyxFQUFVLEdBQXNCO1FBQWxFLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWhEdEUsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2Qsb0JBQWUsR0FBRyxpQkFBaUIsQ0FBQztRQUNwQyxhQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUdqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFdEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUM3QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ2pFLGtDQUFrQztRQUNYLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzFCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzdDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3JDLFVBQUssR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5QyxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFLMUQsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFlBQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLG1CQUFjLEdBQUcsZUFBZSxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsY0FBYyxDQUFDO1FBRS9CLHVCQUFrQixHQUFlLElBQUksQ0FBQztRQUN0QyxzQkFBaUIsR0FBcUIsSUFBSSxDQUFDO1FBQzNDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixVQUFLLEdBQUcsS0FBSyxDQUFDO0lBRW9FLENBQUM7SUFFM0YsSUFBSSxLQUFLLEtBQVUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUUzQyxJQUFJLEtBQUssQ0FBQyxDQUFNO1FBQ1osSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELG1DQUFtQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixVQUFVLENBQ04sR0FBRyxFQUFFO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUN4QixDQUFDLEVBQ0QsQ0FBQyxDQUNKLENBQUM7U0FDTDtJQUNMLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFPO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQU87UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBbUI7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDbkMsQ0FBQztJQUdELElBQVcsVUFBVSxDQUFDLE1BQTJDO1FBQzdELElBQUksTUFBTSxFQUFFO1lBQ1IsSUFBSSxNQUFNLFlBQVksS0FBSyxFQUFFO2dCQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDMUQ7aUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0Q7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7YUFDN0I7U0FDSjtJQUNMLENBQUM7SUFHRCxJQUFXLGFBQWEsQ0FBQyxJQUFZO1FBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDO1NBQ3BGO0lBQ0wsQ0FBQztJQUdELElBQVcsYUFBYSxDQUFDLElBQVk7UUFDakMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxPQUFPLENBQUM7U0FDcEY7SUFDTCxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxLQUFVO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sT0FBTyxDQUFDLEtBQVU7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRU0sSUFBSTtRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUs7UUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxLQUFLO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdkM7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVNLElBQUk7UUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN0QzthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDdkI7SUFDTCxDQUFDO0lBRU0sTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0NBQ0osQ0FBQTs7WUFuSnlDLGdCQUFnQjtZQUFlLGlCQUFpQjs7QUFqRDdFO0lBQVIsS0FBSyxFQUFFOztpREFBbUM7QUFDbEM7SUFBUixLQUFLLEVBQUU7OytDQUF1QjtBQUN0QjtJQUFSLEtBQUssRUFBRTs7NkNBQXFCO0FBQ3BCO0lBQVIsS0FBSyxFQUFFOzsyQ0FBc0I7QUFDckI7SUFBUixLQUFLLEVBQUU7O3FEQUE0QztBQUMzQztJQUFSLEtBQUssRUFBRTs7OENBQTZCO0FBQzVCO0lBQVIsS0FBSyxFQUFFOzt1REFBa0M7QUFDakM7SUFBUixLQUFLLEVBQUU7O21EQUE4QjtBQUM3QjtJQUFSLEtBQUssRUFBRTs7cURBQWdDO0FBQy9CO0lBQVIsS0FBSyxFQUFFOztxREFBK0I7QUFDOUI7SUFBUixLQUFLLEVBQUU7O2lEQUF5QjtBQUN4QjtJQUFSLEtBQUssRUFBRTs7Z0RBQTJCO0FBQzFCO0lBQVIsS0FBSyxFQUFFOzttREFBOEI7QUFDN0I7SUFBUixLQUFLLEVBQUU7OytDQUEwQjtBQUN6QjtJQUFSLEtBQUssRUFBRTs7a0RBQTZCO0FBQzVCO0lBQVIsS0FBSyxFQUFFOztnREFBMkI7QUFDMUI7SUFBUixLQUFLLEVBQUU7OytDQUEwQjtBQUN6QjtJQUFSLEtBQUssRUFBRTs7aURBQTRCO0FBQzNCO0lBQVIsS0FBSyxFQUFFOztpREFBNEI7QUFDM0I7SUFBUixLQUFLLEVBQUU7O21EQUE4QjtBQUM3QjtJQUFSLEtBQUssRUFBRTs7a0RBQTBCO0FBQ3pCO0lBQVIsS0FBSyxFQUFFOzttREFBOEI7QUFDN0I7SUFBUixLQUFLLEVBQUU7O3VEQUFpQztBQUUvQjtJQUFULE1BQU0sRUFBRTs7OENBQXFEO0FBQ3BEO0lBQVQsTUFBTSxFQUFFOztpREFBd0Q7QUFFakQ7SUFBZixNQUFNLENBQUMsTUFBTSxDQUFDOzsrQ0FBNkM7QUFDbEQ7SUFBVCxNQUFNLEVBQUU7OzJDQUF5QztBQUNqQztJQUFoQixNQUFNLENBQUMsT0FBTyxDQUFDOztnREFBOEM7QUFDcEQ7SUFBVCxNQUFNLEVBQUU7OzRDQUE2QztBQUM1QztJQUFULE1BQU0sRUFBRTs4QkFBZSxZQUFZOzJDQUEyQjtBQUNyRDtJQUFULE1BQU0sRUFBRTs4QkFBaUIsWUFBWTs2Q0FBMkI7QUFFdEI7SUFBMUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs4QkFBbUIsWUFBWTsrQ0FBQztBQUNqQztJQUF4QyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOzhCQUFrQixVQUFVOzhDQUFDO0FBaUVyRTtJQURDLEtBQUssRUFBRTs7OzhDQVdQO0FBR0Q7SUFEQyxLQUFLLEVBQUU7OztpREFNUDtBQUdEO0lBREMsS0FBSyxFQUFFOzs7aURBTVA7QUEvSFEsWUFBWTtJQW5EeEIsU0FBUyxDQUFDO1FBQ1AsaUNBQWlDO1FBQ2pDLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTJDVDtRQUVELFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDOztLQUNoRCxDQUFDO0lBQ0Ysa0RBQWtEOztxQ0FtRFIsZ0JBQWdCLEVBQWUsaUJBQWlCO0dBbEQ3RSxZQUFZLENBcU14QjtTQXJNWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2N0ci1jb21wbGV0ZXInO1xuaW1wb3J0IHsgQ29tcGxldGVyRGF0YSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBsZXRlci1kYXRhJztcbmltcG9ydCB7IENvbXBsZXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb21wbGV0ZXItc2VydmljZSc7XG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi9jb21wbGV0ZXItaXRlbSc7XG5pbXBvcnQgeyBNQVhfQ0hBUlMsIE1JTl9TRUFSQ0hfTEVOR1RILCBQQVVTRSwgVEVYVF9TRUFSQ0hJTkcsIFRFWFRfTk9fUkVTVUxUUyB9IGZyb20gJy4uL2dsb2JhbHMnO1xuXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuXG5jb25zdCBDT01QTEVURVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21wbGV0ZXJDbXApLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuICAgIHNlbGVjdG9yOiAnbmVvLWNvbXBsZXRlcicsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1ob2xkZXJcIiBjdHJDb21wbGV0ZXI+XG4gICAgICAgICAgICA8aW5wdXQgI2N0cklucHV0IFthdHRyLmlkXT1cImlucHV0SWQubGVuZ3RoID4gMCA/IGlucHV0SWQgOiBudWxsXCIgdHlwZT1cInNlYXJjaFwiIGNsYXNzPVwiY29tcGxldGVyLWlucHV0XCIgY3RySW5wdXQgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hTdHJcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCIgW2F0dHIubmFtZV09XCJpbnB1dE5hbWVcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJtYXhDaGFyc1wiIFt0YWJpbmRleF09XCJmaWVsZFRhYmluZGV4XCIgW2Rpc2FibGVkXT1cImRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgICAgICAgW2NsZWFyU2VsZWN0ZWRdPVwiY2xlYXJTZWxlY3RlZFwiIFtjbGVhclVuc2VsZWN0ZWRdPVwiY2xlYXJVbnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbb3ZlcnJpZGVTdWdnZXN0ZWRdPVwib3ZlcnJpZGVTdWdnZXN0ZWRcIiBbb3Blbk9uRm9jdXNdPVwib3Blbk9uRm9jdXNcIiBbZmlsbEhpZ2hsaWdodGVkXT1cImZpbGxIaWdobGlnaHRlZFwiXG4gICAgICAgICAgICAgICAgW29wZW5PbkNsaWNrXT1cIm9wZW5PbkNsaWNrXCIgW3NlbGVjdE9uQ2xpY2tdPVwic2VsZWN0T25DbGlja1wiIFthdXRvU2VsZWN0T25FbnRlcl09XCJhdXRvU2VsZWN0T25FbnRlclwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIiAoZm9jdXMpPVwib25Gb2N1cygpXCIgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIC8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItZHJvcGRvd24taG9sZGVyXCJcbiAgICAgICAgICAgICAgICAqY3RyTGlzdD1cImRhdGFTZXJ2aWNlO1xuICAgICAgICAgICAgICAgICAgICBtaW5TZWFyY2hMZW5ndGg6IG1pblNlYXJjaExlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcGF1c2U6IHBhdXNlO1xuICAgICAgICAgICAgICAgICAgICBhdXRvTWF0Y2g6IGF1dG9NYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9IaWdobGlnaHQ6IGF1dG9IaWdobGlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZWFyY2hpbmc6IGRpc3BsYXlTZWFyY2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hBY3RpdmUgPSBzZWFyY2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0luaXRpYWxpemVkID0gc2VhcmNoSW5pdGlhbGl6ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc09wZW4gPSBpc09wZW47XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1kcm9wZG93blwiIGN0ckRyb3Bkb3duICpuZ0lmPVwiaXNJbml0aWFsaXplZCAmJiBpc09wZW4gJiYgKCggaXRlbXM/Lmxlbmd0aCA+IDB8fCAoZGlzcGxheU5vUmVzdWx0cyAmJiAhc2VhcmNoQWN0aXZlKSkgfHwgKHNlYXJjaEFjdGl2ZSAmJiBkaXNwbGF5U2VhcmNoaW5nKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlYXJjaEFjdGl2ZSAmJiBkaXNwbGF5U2VhcmNoaW5nXCIgY2xhc3M9XCJjb21wbGV0ZXItc2VhcmNoaW5nXCI+e3tfdGV4dFNlYXJjaGluZ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2VhcmNoQWN0aXZlICYmICghaXRlbXMgfHwgaXRlbXM/Lmxlbmd0aCA9PT0gMClcIiBjbGFzcz1cImNvbXBsZXRlci1uby1yZXN1bHRzXCI+e3tfdGV4dE5vUmVzdWx0c319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItcm93LXdyYXBwZXJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IHJvd0luZGV4PWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLXJvd1wiIFtjdHJSb3ddPVwicm93SW5kZXhcIiBbZGF0YUl0ZW1dPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmltYWdlIHx8IGl0ZW0uaW1hZ2UgPT09ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItaW1hZ2UtaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpdGVtLmltYWdlICE9ICcnXCIgc3JjPVwie3tpdGVtLmltYWdlfX1cIiBjbGFzcz1cImNvbXBsZXRlci1pbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmltYWdlID09PSAnJ1wiIGNsYXNzPVwiY29tcGxldGVyLWltYWdlLWRlZmF1bHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWl0ZW0tdGV4dFwiIFtuZ0NsYXNzXT1cInsnY29tcGxldGVyLWl0ZW0tdGV4dC1pbWFnZSc6IGl0ZW0uaW1hZ2UgfHwgaXRlbS5pbWFnZSA9PT0gJycgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxldGVyLWxpc3QtaXRlbSBjbGFzcz1cImNvbXBsZXRlci10aXRsZVwiIFt0ZXh0XT1cIml0ZW0udGl0bGVcIiBbbWF0Y2hDbGFzc109XCJtYXRjaENsYXNzXCIgW3NlYXJjaFN0cl09XCJzZWFyY2hTdHJcIiBbdHlwZV09XCIndGl0bGUnXCI+PC9jb21wbGV0ZXItbGlzdC1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxldGVyLWxpc3QtaXRlbSAqbmdJZj1cIml0ZW0uZGVzY3JpcHRpb24gJiYgaXRlbS5kZXNjcmlwdGlvbiAhPSAnJ1wiIGNsYXNzPVwiY29tcGxldGVyLWRlc2NyaXB0aW9uXCIgW3RleHRdPVwiaXRlbS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Y2hDbGFzc109XCJtYXRjaENsYXNzXCIgW3NlYXJjaFN0cl09XCJzZWFyY2hTdHJcIiBbdHlwZV09XCInZGVzY3JpcHRpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxldGVyLWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIHN0eWxlVXJsczogWydjb21wbGV0ZXItY21wLnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtDT01QTEVURVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENvbXBsZXRlckNtcCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhU2VydmljZTogQ29tcGxldGVyRGF0YTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXROYW1lID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIGlucHV0SWQgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgcGF1c2UgPSBQQVVTRTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluU2VhcmNoTGVuZ3RoID0gTUlOX1NFQVJDSF9MRU5HVEg7XG4gICAgQElucHV0KCkgcHVibGljIG1heENoYXJzID0gTUFYX0NIQVJTO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvdmVycmlkZVN1Z2dlc3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjbGVhclNlbGVjdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsZWFyVW5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlciA9ICcnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXRjaENsYXNzOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGZpZWxkVGFiaW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b01hdGNoID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVJbnB1dCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbnB1dENsYXNzOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9mb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuT25DbGljayA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RPbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGluaXRpYWxWYWx1ZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvSGlnaGxpZ2h0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9TZWxlY3RPbkVudGVyID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBsZXRlckl0ZW0+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVySXRlbT4oKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgQE91dHB1dCgnYmx1cicpIHB1YmxpYyBibHVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCdmb2N1cycpIHB1YmxpYyBmb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMga2V5dXA6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMga2V5ZG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKEN0ckNvbXBsZXRlciwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyO1xuICAgIEBWaWV3Q2hpbGQoJ2N0cklucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGN0cklucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIHNlYXJjaFN0ciA9ICcnO1xuICAgIHB1YmxpYyBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgICBwdWJsaWMgZGlzcGxheVNlYXJjaGluZyA9IHRydWU7XG4gICAgcHVibGljIGRpc3BsYXlOb1Jlc3VsdHMgPSB0cnVlO1xuICAgIHB1YmxpYyBfdGV4dE5vUmVzdWx0cyA9IFRFWFRfTk9fUkVTVUxUUztcbiAgICBwdWJsaWMgX3RleHRTZWFyY2hpbmcgPSBURVhUX1NFQVJDSElORztcblxuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIF9mb2N1cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX29wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcGxldGVyU2VydmljZTogQ29tcGxldGVyU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5zZWFyY2hTdHI7IH1cblxuICAgIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICAgICAgaWYgKHYgIT09IHRoaXMuc2VhcmNoU3RyKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2UgaW4gYW55IGNhc2VcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1cykge1xuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblRvdWNoZWQoKSB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVJbnB1dCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRhdGFzb3VyY2Uoc291cmNlOiBDb21wbGV0ZXJEYXRhIHwgc3RyaW5nIHwgQXJyYXk8YW55Pikge1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gdGhpcy5jb21wbGV0ZXJTZXJ2aWNlLmxvY2FsKHNvdXJjZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc291cmNlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gdGhpcy5jb21wbGV0ZXJTZXJ2aWNlLnJlbW90ZShzb3VyY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHRleHROb1Jlc3VsdHModGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0Tm9SZXN1bHRzICE9PSB0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0Tm9SZXN1bHRzID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5vUmVzdWx0cyA9ICEhdGhpcy5fdGV4dE5vUmVzdWx0cyAmJiB0aGlzLl90ZXh0Tm9SZXN1bHRzICE9PSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHRleHRTZWFyY2hpbmcodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2VhcmNoaW5nICE9PSB0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0U2VhcmNoaW5nID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVNlYXJjaGluZyA9ICEhdGhpcy5fdGV4dFNlYXJjaGluZyAmJiB0aGlzLl90ZXh0U2VhcmNoaW5nICE9PSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLmhpZ2hsaWdodGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZC5lbWl0KGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbmVkLnN1YnNjcmliZSgoaXNPcGVuOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuID0gaXNPcGVuO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdChpc09wZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmJsdXJFdmVudC5lbWl0KCk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGljayhldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuY2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5dXAoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmtleXVwLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmtleWRvd24uZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3RySW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGJsdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN0cklucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmN0cklucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc09wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICAgIH1cbn1cbiJdfQ==