UNPKG

@neocomplexx/ngx-neo-completer

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

362 lines 39.3 kB
'use strict'; 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'; var noop = function () { }; var ɵ0 = noop; var COMPLETER_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return CompleterCmp; }), multi: true }; var CompleterCmp = /** @class */ (function () { function CompleterCmp(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; } Object.defineProperty(CompleterCmp.prototype, "value", { get: function () { return this.searchStr; }, set: function (v) { if (v !== this.searchStr) { this.searchStr = v; } // Propagate the change in any case this._onChangeCallback(v); }, enumerable: true, configurable: true }); CompleterCmp.prototype.ngAfterViewInit = function () { if (this.autofocus) { this._focus = true; } }; CompleterCmp.prototype.ngAfterViewChecked = function () { var _this = this; if (this._focus) { setTimeout(function () { _this.ctrInput.nativeElement.focus(); _this._focus = false; }, 0); } }; CompleterCmp.prototype.onTouched = function () { this._onTouchedCallback(); }; CompleterCmp.prototype.writeValue = function (value) { this.searchStr = value; }; CompleterCmp.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; }; CompleterCmp.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; }; CompleterCmp.prototype.setDisabledState = function (isDisabled) { this.disableInput = isDisabled; }; Object.defineProperty(CompleterCmp.prototype, "datasource", { set: function (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; } } }, enumerable: true, configurable: true }); Object.defineProperty(CompleterCmp.prototype, "textNoResults", { set: function (text) { if (this._textNoResults !== text) { this._textNoResults = text; this.displayNoResults = !!this._textNoResults && this._textNoResults !== 'false'; } }, enumerable: true, configurable: true }); Object.defineProperty(CompleterCmp.prototype, "textSearching", { set: function (text) { if (this._textSearching !== text) { this._textSearching = text; this.displaySearching = !!this._textSearching && this._textSearching !== 'false'; } }, enumerable: true, configurable: true }); CompleterCmp.prototype.ngOnInit = function () { var _this = this; this.completer.selected.subscribe(function (item) { _this.selected.emit(item); }); this.completer.highlighted.subscribe(function (item) { _this.highlighted.emit(item); }); this.completer.opened.subscribe(function (isOpen) { _this._open = isOpen; _this.opened.emit(isOpen); }); }; CompleterCmp.prototype.onBlur = function () { this.blurEvent.emit(); this.onTouched(); this.cdr.detectChanges(); }; CompleterCmp.prototype.onFocus = function () { this.focusEvent.emit(); this.onTouched(); }; CompleterCmp.prototype.onClick = function (event) { this.click.emit(event); this.onTouched(); }; CompleterCmp.prototype.onKeyup = function (event) { this.keyup.emit(event); }; CompleterCmp.prototype.onKeydown = function (event) { this.keydown.emit(event); }; CompleterCmp.prototype.onChange = function (value) { this.value = value; }; CompleterCmp.prototype.open = function () { this.completer.open(); }; CompleterCmp.prototype.close = function () { this.completer.clear(); }; CompleterCmp.prototype.focus = function () { if (this.ctrInput) { this.ctrInput.nativeElement.focus(); } else { this._focus = true; } }; CompleterCmp.prototype.blur = function () { if (this.ctrInput) { this.ctrInput.nativeElement.blur(); } else { this._focus = false; } }; CompleterCmp.prototype.isOpen = function () { return this._open; }; CompleterCmp.ctorParameters = function () { return [ { 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: "\n <div class=\"completer-holder\" ctrCompleter>\n <input #ctrInput [attr.id]=\"inputId.length > 0 ? inputId : null\" type=\"search\" class=\"completer-input\" ctrInput [ngClass]=\"inputClass\"\n [(ngModel)]=\"searchStr\" (ngModelChange)=\"onChange($event)\" [attr.name]=\"inputName\" [placeholder]=\"placeholder\"\n [attr.maxlength]=\"maxChars\" [tabindex]=\"fieldTabindex\" [disabled]=\"disableInput\"\n [clearSelected]=\"clearSelected\" [clearUnselected]=\"clearUnselected\"\n [overrideSuggested]=\"overrideSuggested\" [openOnFocus]=\"openOnFocus\" [fillHighlighted]=\"fillHighlighted\"\n [openOnClick]=\"openOnClick\" [selectOnClick]=\"selectOnClick\" [autoSelectOnEnter]=\"autoSelectOnEnter\"\n (blur)=\"onBlur()\" (focus)=\"onFocus()\" (keyup)=\"onKeyup($event)\" (keydown)=\"onKeydown($event)\" (click)=\"onClick($event)\"\n autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" />\n\n <div class=\"completer-dropdown-holder\"\n *ctrList=\"dataService;\n minSearchLength: minSearchLength;\n pause: pause;\n autoMatch: autoMatch;\n initialValue: initialValue;\n autoHighlight: autoHighlight;\n displaySearching: displaySearching;\n let items = results;\n let searchActive = searching;\n let isInitialized = searchInitialized;\n let isOpen = isOpen;\">\n <div class=\"completer-dropdown\" ctrDropdown *ngIf=\"isInitialized && isOpen && (( items?.length > 0|| (displayNoResults && !searchActive)) || (searchActive && displaySearching))\">\n <div *ngIf=\"searchActive && displaySearching\" class=\"completer-searching\">{{_textSearching}}</div>\n <div *ngIf=\"!searchActive && (!items || items?.length === 0)\" class=\"completer-no-results\">{{_textNoResults}}</div>\n <div class=\"completer-row-wrapper\" *ngFor=\"let item of items; let rowIndex=index\">\n <div class=\"completer-row\" [ctrRow]=\"rowIndex\" [dataItem]=\"item\">\n <div *ngIf=\"item.image || item.image === ''\" class=\"completer-image-holder\">\n <img *ngIf=\"item.image != ''\" src=\"{{item.image}}\" class=\"completer-image\" />\n <div *ngIf=\"item.image === ''\" class=\"completer-image-default\"></div>\n </div>\n <div class=\"completer-item-text\" [ngClass]=\"{'completer-item-text-image': item.image || item.image === '' }\">\n <completer-list-item class=\"completer-title\" [text]=\"item.title\" [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"'title'\"></completer-list-item>\n <completer-list-item *ngIf=\"item.description && item.description != ''\" class=\"completer-description\" [text]=\"item.description\"\n [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"'description'\">\n </completer-list-item>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n ", 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); return CompleterCmp; }()); export { CompleterCmp }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGVyLWNtcC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWNvbXBsZXRlci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbXBsZXRlci1jbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUNiLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0gsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRyxJQUFNLElBQUksR0FBRyxjQUFRLENBQUMsQ0FBQzs7QUFFdkIsSUFBTSxnQ0FBZ0MsR0FBRztJQUNyQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLFlBQVksRUFBWixDQUFZLENBQUM7SUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBc0RGO0lBa0RJLHNCQUFvQixnQkFBa0MsRUFBVSxHQUFzQjtRQUFsRSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoRHRFLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsYUFBUSxHQUFH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RXJFO1FBREMsS0FBSyxFQUFFOzs7a0RBV1A7SUFHRDtRQURDLEtBQUssRUFBRTs7O3FEQU1QO0lBR0Q7UUFEQyxLQUFLLEVBQUU7OztxREFNUDtJQS9IUSxZQUFZO1FBbkR4QixTQUFTLENBQUM7WUFDUCxpQ0FBaUM7WUFDakMsUUFBUSxFQUFFLGVBQWU7WUFDekIsUUFBUSxFQUFFLG02R0EyQ1Q7WUFFRCxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQzs7U0FDaEQsQ0FBQztRQUNGLGtEQUFrRDs7eUNBbURSLGdCQUFnQixFQUFlLGlCQUFpQjtPQWxEN0UsWUFBWSxDQXFNeEI7SUFBRCxtQkFBQztDQUFBLEFBck1ELElBcU1DO1NBck1ZLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBBZnRlclZpZXdJbml0LCBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEN0ckNvbXBsZXRlciB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY3RyLWNvbXBsZXRlcic7XG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xuaW1wb3J0IHsgQ29tcGxldGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBsZXRlci1zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBsZXRlckl0ZW0gfSBmcm9tICcuL2NvbXBsZXRlci1pdGVtJztcbmltcG9ydCB7IE1BWF9DSEFSUywgTUlOX1NFQVJDSF9MRU5HVEgsIFBBVVNFLCBURVhUX1NFQVJDSElORywgVEVYVF9OT19SRVNVTFRTIH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5cbmNvbnN0IENPTVBMRVRFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbXBsZXRlckNtcCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cblxuQENvbXBvbmVudCh7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgc2VsZWN0b3I6ICduZW8tY29tcGxldGVyJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWhvbGRlclwiIGN0ckNvbXBsZXRlcj5cbiAgICAgICAgICAgIDxpbnB1dCAjY3RySW5wdXQgW2F0dHIuaWRdPVwiaW5wdXRJZC5sZW5ndGggPiAwID8gaW5wdXRJZCA6IG51bGxcIiB0eXBlPVwic2VhcmNoXCIgY2xhc3M9XCJjb21wbGV0ZXItaW5wdXRcIiBjdHJJbnB1dCBbbmdDbGFzc109XCJpbnB1dENsYXNzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0clwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiBbYXR0ci5uYW1lXT1cImlucHV0TmFtZVwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cIm1heENoYXJzXCIgW3RhYmluZGV4XT1cImZpZWxkVGFiaW5kZXhcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICAgICAgICBbY2xlYXJTZWxlY3RlZF09XCJjbGVhclNlbGVjdGVkXCIgW2NsZWFyVW5zZWxlY3RlZF09XCJjbGVhclVuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtvdmVycmlkZVN1Z2dlc3RlZF09XCJvdmVycmlkZVN1Z2dlc3RlZFwiIFtvcGVuT25Gb2N1c109XCJvcGVuT25Gb2N1c1wiIFtmaWxsSGlnaGxpZ2h0ZWRdPVwiZmlsbEhpZ2hsaWdodGVkXCJcbiAgICAgICAgICAgICAgICBbb3Blbk9uQ2xpY2tdPVwib3Blbk9uQ2xpY2tcIiBbc2VsZWN0T25DbGlja109XCJzZWxlY3RPbkNsaWNrXCIgW2F1dG9TZWxlY3RPbkVudGVyXT1cImF1dG9TZWxlY3RPbkVudGVyXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1kcm9wZG93bi1ob2xkZXJcIlxuICAgICAgICAgICAgICAgICpjdHJMaXN0PVwiZGF0YVNlcnZpY2U7XG4gICAgICAgICAgICAgICAgICAgIG1pblNlYXJjaExlbmd0aDogbWluU2VhcmNoTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwYXVzZTogcGF1c2U7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9NYXRjaDogYXV0b01hdGNoO1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXV0b0hpZ2hsaWdodDogYXV0b0hpZ2hsaWdodDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNlYXJjaGluZzogZGlzcGxheVNlYXJjaGluZztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEFjdGl2ZSA9IHNlYXJjaGluZztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBzZWFyY2hJbml0aWFsaXplZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzT3BlbiA9IGlzT3BlbjtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWRyb3Bkb3duXCIgY3RyRHJvcGRvd24gKm5nSWY9XCJpc0luaXRpYWxpemVkICYmIGlzT3BlbiAmJiAoKCBpdGVtcz8ubGVuZ3RoID4gMHx8IChkaXNwbGF5Tm9SZXN1bHRzICYmICFzZWFyY2hBY3RpdmUpKSB8fCAoc2VhcmNoQWN0aXZlICYmIGRpc3BsYXlTZWFyY2hpbmcpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoQWN0aXZlICYmIGRpc3BsYXlTZWFyY2hpbmdcIiBjbGFzcz1cImNvbXBsZXRlci1zZWFyY2hpbmdcIj57e190ZXh0U2VhcmNoaW5nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzZWFyY2hBY3RpdmUgJiYgKCFpdGVtcyB8fCBpdGVtcz8ubGVuZ3RoID09PSAwKVwiIGNsYXNzPVwiY29tcGxldGVyLW5vLXJlc3VsdHNcIj57e190ZXh0Tm9SZXN1bHRzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1yb3ctd3JhcHBlclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgcm93SW5kZXg9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItcm93XCIgW2N0clJvd109XCJyb3dJbmRleFwiIFtkYXRhSXRlbV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uaW1hZ2UgfHwgaXRlbS5pbWFnZSA9PT0gJydcIiBjbGFzcz1cImNvbXBsZXRlci1pbWFnZS1ob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0uaW1hZ2UgIT0gJydcIiBzcmM9XCJ7e2l0ZW0uaW1hZ2V9fVwiIGNsYXNzPVwiY29tcGxldGVyLWltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uaW1hZ2UgPT09ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItaW1hZ2UtZGVmYXVsdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItaXRlbS10ZXh0XCIgW25nQ2xhc3NdPVwieydjb21wbGV0ZXItaXRlbS10ZXh0LWltYWdlJzogaXRlbS5pbWFnZSB8fCBpdGVtLmltYWdlID09PSAnJyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV0ZXItbGlzdC1pdGVtIGNsYXNzPVwiY29tcGxldGVyLXRpdGxlXCIgW3RleHRdPVwiaXRlbS50aXRsZVwiIFttYXRjaENsYXNzXT1cIm1hdGNoQ2xhc3NcIiBbc2VhcmNoU3RyXT1cInNlYXJjaFN0clwiIFt0eXBlXT1cIid0aXRsZSdcIj48L2NvbXBsZXRlci1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV0ZXItbGlzdC1pdGVtICpuZ0lmPVwiaXRlbS5kZXNjcmlwdGlvbiAmJiBpdGVtLmRlc2NyaXB0aW9uICE9ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItZGVzY3JpcHRpb25cIiBbdGV4dF09XCJpdGVtLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRjaENsYXNzXT1cIm1hdGNoQ2xhc3NcIiBbc2VhcmNoU3RyXT1cInNlYXJjaFN0clwiIFt0eXBlXT1cIidkZXNjcmlwdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21wbGV0ZXItbGlzdC1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGAsXG4gICAgc3R5bGVVcmxzOiBbJ2NvbXBsZXRlci1jbXAuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW0NPTVBMRVRFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ29tcGxldGVyQ21wIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFTZXJ2aWNlOiBDb21wbGV0ZXJEYXRhO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbnB1dE5hbWUgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRJZCA9ICcnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwYXVzZSA9IFBBVVNFO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5TZWFyY2hMZW5ndGggPSBNSU5fU0VBUkNIX0xFTkdUSDtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4Q2hhcnMgPSBNQVhfQ0hBUlM7XG4gICAgQElucHV0KCkgcHVibGljIG92ZXJyaWRlU3VnZ2VzdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsZWFyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xlYXJVbnNlbGVjdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGZpbGxIaWdobGlnaHRlZCA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIG1hdGNoQ2xhc3M6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZmllbGRUYWJpbmRleDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvTWF0Y2ggPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZUlucHV0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGlucHV0Q2xhc3M6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b2ZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG9wZW5PbkZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG9wZW5PbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5pdGlhbFZhbHVlOiBhbnk7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9IaWdobGlnaHQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b1NlbGVjdE9uRW50ZXIgPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVySXRlbT4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIGhpZ2hsaWdodGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wbGV0ZXJJdGVtPigpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLW91dHB1dC1yZW5hbWVcbiAgICBAT3V0cHV0KCdibHVyJykgcHVibGljIGJsdXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIGNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoJ2ZvY3VzJykgcHVibGljIGZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBrZXl1cDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBrZXlkb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGQoQ3RyQ29tcGxldGVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgY29tcGxldGVyOiBDdHJDb21wbGV0ZXI7XG4gICAgQFZpZXdDaGlsZCgnY3RySW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgY3RySW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgc2VhcmNoU3RyID0gJyc7XG4gICAgcHVibGljIGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgIHB1YmxpYyBkaXNwbGF5U2VhcmNoaW5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgZGlzcGxheU5vUmVzdWx0cyA9IHRydWU7XG4gICAgcHVibGljIF90ZXh0Tm9SZXN1bHRzID0gVEVYVF9OT19SRVNVTFRTO1xuICAgIHB1YmxpYyBfdGV4dFNlYXJjaGluZyA9IFRFWFRfU0VBUkNISU5HO1xuXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgX2ZvY3VzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfb3BlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wbGV0ZXJTZXJ2aWNlOiBDb21wbGV0ZXJTZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnNlYXJjaFN0cjsgfVxuXG4gICAgc2V0IHZhbHVlKHY6IGFueSkge1xuICAgICAgICBpZiAodiAhPT0gdGhpcy5zZWFyY2hTdHIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZSBpbiBhbnkgY2FzZVxuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVG91Y2hlZCgpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUlucHV0ID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZGF0YXNvdXJjZShzb3VyY2U6IENvbXBsZXRlckRhdGEgfCBzdHJpbmcgfCBBcnJheTxhbnk+KSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSB0aGlzLmNvbXBsZXRlclNlcnZpY2UubG9jYWwoc291cmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChzb3VyY2UpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSB0aGlzLmNvbXBsZXRlclNlcnZpY2UucmVtb3RlKHNvdXJjZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGV4dE5vUmVzdWx0cyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHROb1Jlc3VsdHMgIT09IHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHROb1Jlc3VsdHMgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5Tm9SZXN1bHRzID0gISF0aGlzLl90ZXh0Tm9SZXN1bHRzICYmIHRoaXMuX3RleHROb1Jlc3VsdHMgIT09ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGV4dFNlYXJjaGluZyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHRTZWFyY2hpbmcgIT09IHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRTZWFyY2hpbmcgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U2VhcmNoaW5nID0gISF0aGlzLl90ZXh0U2VhcmNoaW5nICYmIHRoaXMuX3RleHRTZWFyY2hpbmcgIT09ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLnNlbGVjdGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuaGlnaGxpZ2h0ZWQuc3Vic2NyaWJlKChpdGVtOiBDb21wbGV0ZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkLmVtaXQoaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuZWQuc3Vic2NyaWJlKChpc09wZW46IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wZW4gPSBpc09wZW47XG4gICAgICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KGlzT3Blbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25LZXl1cChldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMua2V5dXAuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMua2V5ZG93bi5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW4oKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdHJJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5jdHJJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3RySW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW47XG4gICAgfVxufVxuIl19