@neocomplexx/ngx-neo-completer
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
331 lines • 32.6 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { Directive, ElementRef, EventEmitter, Host, HostListener, Input, Output } from '@angular/core';
import { NgModel } from '@angular/forms';
import { timer } from 'rxjs';
import { take } from 'rxjs/operators';
import { CtrCompleter } from './ctr-completer';
import { isNil } from '../globals';
// keyboard events
const KEY_DW = 40;
const KEY_RT = 39;
const KEY_UP = 38;
const KEY_LF = 37;
const KEY_ES = 27;
const KEY_EN = 13;
const KEY_TAB = 9;
const KEY_BK = 8;
const KEY_SH = 16;
const KEY_CL = 20;
const KEY_F1 = 112;
const KEY_F12 = 123;
let CtrInput =
// tslint:disable-next-line:directive-class-suffix
class CtrInput {
constructor(completer, ngModel, el) {
this.completer = completer;
this.ngModel = ngModel;
this.el = el;
// tslint:disable:no-input-rename
this.clearSelected = false;
this.clearUnselected = false;
this.overrideSuggested = false;
this.fillHighlighted = true;
this.openOnFocus = false;
this.openOnClick = false;
this.selectOnClick = false;
this.selectOnFocus = false;
this.autoSelectOnEnter = true;
this.ngModelChange = new EventEmitter();
this._searchStr = '';
this._displayStr = '';
this.blurTimer = null;
this.completer.selected.subscribe((item) => {
if (!item) {
return;
}
if (this.clearSelected) {
this.searchStr = '';
}
else {
this.searchStr = item.title;
}
this.ngModelChange.emit(this.searchStr);
});
this.completer.highlighted.subscribe((item) => {
if (this.fillHighlighted) {
if (item) {
this._displayStr = item.title;
this.ngModelChange.emit(item.title);
}
else {
this._displayStr = this.searchStr;
this.ngModelChange.emit(this.searchStr);
}
}
});
this.completer.dataSourceChange.subscribe(() => {
this.completer.search(this.searchStr);
});
if (this.ngModel.valueChanges) {
this.ngModel.valueChanges.subscribe(value => {
if (!isNil(value) && this._displayStr !== value) {
if (this.searchStr !== value) {
this.completer.search(value);
}
this.searchStr = value;
}
});
}
}
keyupHandler(event) {
if (event.keyCode === KEY_LF || event.keyCode === KEY_RT || event.keyCode === KEY_TAB) {
// do nothing
return;
}
if (event.keyCode === KEY_UP || event.keyCode === KEY_EN) {
event.preventDefault();
}
else if (event.keyCode === KEY_DW) {
event.preventDefault();
this.completer.search(this.searchStr);
}
else if (event.keyCode === KEY_ES) {
if (this.completer.isOpen) {
this.restoreSearchValue();
this.completer.clear();
event.stopPropagation();
event.preventDefault();
}
}
}
pasteHandler(event) {
this.completer.open();
}
keydownHandler(event) {
const keyCode = event.keyCode || event.which;
if (keyCode === KEY_EN) {
if (this.completer.hasHighlighted()) {
event.preventDefault();
}
else {
if (this.autoSelectOnEnter) {
event.preventDefault();
this.completer.open();
this.completer.nextRow();
}
}
this.handleSelection();
}
else if (keyCode === KEY_DW) {
event.preventDefault();
this.completer.open();
this.completer.nextRow();
}
else if (keyCode === KEY_UP) {
event.preventDefault();
this.completer.prevRow();
}
else if (keyCode === KEY_TAB) {
this.handleSelection();
}
else if (keyCode === KEY_BK) {
this.completer.open();
}
else if (keyCode === KEY_ES) {
// This is very specific to IE10/11 #272
// without this, IE clears the input text
event.preventDefault();
if (this.completer.isOpen) {
event.stopPropagation();
}
}
else {
if (keyCode !== 0 && keyCode !== KEY_SH && keyCode !== KEY_CL &&
(keyCode <= KEY_F1 || keyCode >= KEY_F12) &&
!event.ctrlKey && !event.metaKey && !event.altKey) {
this.completer.open();
}
}
}
onBlur(event) {
// Check if we need to cancel Blur for IE
if (this.completer.isCancelBlur()) {
setTimeout(() => {
// get the focus back
this.el.nativeElement.focus();
}, 0);
return;
}
if (this.completer.isOpen) {
this.blurTimer = timer(200).pipe(take(1)).subscribe(() => this.doBlur());
}
}
onfocus() {
if (this.blurTimer) {
this.blurTimer.unsubscribe();
this.blurTimer = null;
}
if (this.selectOnFocus) {
this.el.nativeElement.select();
}
if (this.openOnFocus) {
this.completer.open();
}
}
onClick(event) {
if (this.selectOnClick) {
this.el.nativeElement.select();
}
if (this.openOnClick) {
if (this.completer.isOpen) {
this.completer.clear();
}
else {
this.completer.open();
}
}
}
get searchStr() {
return this._searchStr;
}
set searchStr(term) {
this._searchStr = term;
this._displayStr = term;
}
handleSelection() {
if (this.completer.hasHighlighted()) {
this._searchStr = '';
this.completer.selectCurrent();
}
else if (this.overrideSuggested) {
this.completer.onSelected({ title: this.searchStr, originalObject: null });
}
else {
if (this.clearUnselected && !this.completer.hasSelected) {
this.searchStr = '';
this.ngModelChange.emit(this.searchStr);
}
this.completer.clear();
}
}
restoreSearchValue() {
if (this.fillHighlighted) {
if (this._displayStr !== this.searchStr) {
this._displayStr = this.searchStr;
this.ngModelChange.emit(this.searchStr);
}
}
}
doBlur() {
if (this.blurTimer) {
this.blurTimer.unsubscribe();
this.blurTimer = null;
}
if (this.overrideSuggested) {
this.completer.onSelected({ title: this.searchStr, originalObject: null });
}
else {
if (this.clearUnselected && !this.completer.hasSelected) {
this.searchStr = '';
this.ngModelChange.emit(this.searchStr);
}
else {
this.restoreSearchValue();
}
}
this.completer.clear();
}
};
CtrInput.ctorParameters = () => [
{ type: CtrCompleter, decorators: [{ type: Host }] },
{ type: NgModel },
{ type: ElementRef }
];
__decorate([
Input('clearSelected'),
__metadata("design:type", Object)
], CtrInput.prototype, "clearSelected", void 0);
__decorate([
Input('clearUnselected'),
__metadata("design:type", Object)
], CtrInput.prototype, "clearUnselected", void 0);
__decorate([
Input('overrideSuggested'),
__metadata("design:type", Object)
], CtrInput.prototype, "overrideSuggested", void 0);
__decorate([
Input('fillHighlighted'),
__metadata("design:type", Object)
], CtrInput.prototype, "fillHighlighted", void 0);
__decorate([
Input('openOnFocus'),
__metadata("design:type", Object)
], CtrInput.prototype, "openOnFocus", void 0);
__decorate([
Input('openOnClick'),
__metadata("design:type", Object)
], CtrInput.prototype, "openOnClick", void 0);
__decorate([
Input('selectOnClick'),
__metadata("design:type", Object)
], CtrInput.prototype, "selectOnClick", void 0);
__decorate([
Input('selectOnFocus'),
__metadata("design:type", Object)
], CtrInput.prototype, "selectOnFocus", void 0);
__decorate([
Input('autoSelectOnEnter'),
__metadata("design:type", Object)
], CtrInput.prototype, "autoSelectOnEnter", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], CtrInput.prototype, "ngModelChange", void 0);
__decorate([
HostListener('keyup', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "keyupHandler", null);
__decorate([
HostListener('paste', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "pasteHandler", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "keydownHandler", null);
__decorate([
HostListener('blur', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "onBlur", null);
__decorate([
HostListener('focus', []),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "onfocus", null);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], CtrInput.prototype, "onClick", null);
CtrInput = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: '[ctrInput]',
})
// tslint:disable-next-line:directive-class-suffix
,
__param(0, Host()),
__metadata("design:paramtypes", [CtrCompleter, NgModel, ElementRef])
], CtrInput);
export { CtrInput };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWlucHV0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tY29tcGxldGVyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkMsa0JBQWtCO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBT3BCLElBQWEsUUFBUTtBQURyQixrREFBa0Q7QUFDbEQsTUFBYSxRQUFRO0lBa0Jq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QUFyQixLQUFLLENBQUMsYUFBYSxDQUFDOzs2Q0FBNEI7QUFDM0I7SUFBckIsS0FBSyxDQUFDLGFBQWEsQ0FBQzs7NkNBQTRCO0FBQ3pCO0lBQXZCLEtBQUssQ0FBQyxlQUFlLENBQUM7OytDQUE4QjtBQUM3QjtJQUF2QixLQUFLLENBQUMsZUFBZSxDQUFDOzsrQ0FBOEI7QUFDekI7SUFBM0IsS0FBSyxDQUFDLG1CQUFtQixDQUFDOzttREFBaUM7QUFFbEQ7SUFBVCxNQUFNLEVBQUU7OEJBQXVCLFlBQVk7K0NBQTJCO0FBZ0R2RTtJQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Ozs0Q0FvQmpDO0FBR0Q7SUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7NENBR2pDO0FBR0Q7SUFEQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7OENBd0NuQztBQUdEO0lBREMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O3NDQWlCaEM7QUFHRDtJQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDOzs7O3VDQWN6QjtBQUdEO0lBREMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O3VDQWFqQztBQWhMUSxRQUFRO0lBTHBCLFNBQVMsQ0FBQztRQUNQLDhDQUE4QztRQUM5QyxRQUFRLEVBQUUsWUFBWTtLQUN6QixDQUFDO0lBQ0Ysa0RBQWtEOztJQW1CakMsV0FBQSxJQUFJLEVBQUUsQ0FBQTtxQ0FBb0IsWUFBWSxFQUFtQixPQUFPLEVBQWMsVUFBVTtHQWxCNUYsUUFBUSxDQXNPcEI7U0F0T1ksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0aW1lciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wbGV0ZXItaXRlbSc7XG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcblxuXG4vLyBrZXlib2FyZCBldmVudHNcbmNvbnN0IEtFWV9EVyA9IDQwO1xuY29uc3QgS0VZX1JUID0gMzk7XG5jb25zdCBLRVlfVVAgPSAzODtcbmNvbnN0IEtFWV9MRiA9IDM3O1xuY29uc3QgS0VZX0VTID0gMjc7XG5jb25zdCBLRVlfRU4gPSAxMztcbmNvbnN0IEtFWV9UQUIgPSA5O1xuY29uc3QgS0VZX0JLID0gODtcbmNvbnN0IEtFWV9TSCA9IDE2O1xuY29uc3QgS0VZX0NMID0gMjA7XG5jb25zdCBLRVlfRjEgPSAxMTI7XG5jb25zdCBLRVlfRjEyID0gMTIzO1xuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbY3RySW5wdXRdJyxcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEN0cklucHV0IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1pbnB1dC1yZW5hbWVcbiAgICBASW5wdXQoJ2NsZWFyU2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJTZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgnY2xlYXJVbnNlbGVjdGVkJykgcHVibGljIGNsZWFyVW5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgnb3ZlcnJpZGVTdWdnZXN0ZWQnKSBwdWJsaWMgb3ZlcnJpZGVTdWdnZXN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2ZpbGxIaWdobGlnaHRlZCcpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgIEBJbnB1dCgnb3Blbk9uRm9jdXMnKSBwdWJsaWMgb3Blbk9uRm9jdXMgPSBmYWxzZTtcbiAgICBASW5wdXQoJ29wZW5PbkNsaWNrJykgcHVibGljIG9wZW5PbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCdzZWxlY3RPbkNsaWNrJykgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcbiAgICBASW5wdXQoJ3NlbGVjdE9uRm9jdXMnKSBwdWJsaWMgc2VsZWN0T25Gb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgnYXV0b1NlbGVjdE9uRW50ZXInKSBwdWJsaWMgYXV0b1NlbGVjdE9uRW50ZXIgPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBuZ01vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByaXZhdGUgX3NlYXJjaFN0ciA9ICcnO1xuICAgIHByaXZhdGUgX2Rpc3BsYXlTdHIgPSAnJztcbiAgICBwcml2YXRlIGJsdXJUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHByaXZhdGUgY29tcGxldGVyOiBDdHJDb21wbGV0ZXIsIHByaXZhdGUgbmdNb2RlbDogTmdNb2RlbCwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IGl0ZW0udGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmhpZ2hsaWdodGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IGl0ZW0udGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KGl0ZW0udGl0bGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSB0aGlzLnNlYXJjaFN0cjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuZGF0YVNvdXJjZUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VhcmNoKHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKHZhbHVlKSAmJiB0aGlzLl9kaXNwbGF5U3RyICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdHIgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWFyY2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGtleXVwSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfTEYgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX1JUIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9UQUIpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfVVAgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VOKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9EVykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlYXJjaCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIHBhc3RlSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMga2V5ZG93bkhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtFWV9FTikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmhhc0hpZ2hsaWdodGVkKCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvU2VsZWN0T25FbnRlcikge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm5leHRSb3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IEtFWV9EVykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm5leHRSb3coKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfVVApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5wcmV2Um93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX1RBQikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfQkspIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfRVMpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdmVyeSBzcGVjaWZpYyB0byBJRTEwLzExICMyNzJcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgSUUgY2xlYXJzIHRoZSBpbnB1dCB0ZXh0XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGtleUNvZGUgIT09IDAgJiYga2V5Q29kZSAhPT0gS0VZX1NIICYmIGtleUNvZGUgIT09IEtFWV9DTCAmJlxuICAgICAgICAgICAgICAgIChrZXlDb2RlIDw9IEtFWV9GMSB8fCBrZXlDb2RlID49IEtFWV9GMTIpICYmXG4gICAgICAgICAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmFsdEtleVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQmx1cihldmVudDogYW55KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gY2FuY2VsIEJsdXIgZm9yIElFXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc0NhbmNlbEJsdXIoKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZm9jdXMgYmFja1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHRpbWVyKDIwMCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kb0JsdXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFtdKVxuICAgIHB1YmxpYyBvbmZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5ibHVyVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RPbkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3Blbk9uQ2xpY2spIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFN0cigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlYXJjaFN0cih0ZXJtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoU3RyID0gdGVybTtcbiAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IHRlcm07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5oYXNIaWdobGlnaHRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlbGVjdEN1cnJlbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVTZWFyY2hWYWx1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheVN0ciAhPT0gdGhpcy5zZWFyY2hTdHIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5U3RyID0gdGhpcy5zZWFyY2hTdHI7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkb0JsdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmJsdXJUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgfVxufVxuIl19