@muzykantov/ngx-dadata
Version:
Angular 6+ [DaData][dadata] suggestion (подсказки) implementation
474 lines (464 loc) • 37.8 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/forms'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('@muzykantov/ngx-dadata', ['exports', '@angular/core', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/forms', '@angular/common'], factory) :
(factory((global.muzykantov = global.muzykantov || {}, global.muzykantov['ngx-dadata'] = {}),global.ng.core,global.ng.common.http,global.rxjs,global.rxjs.operators,global.ng.forms,global.ng.common));
}(this, (function (exports,i0,i1,rxjs,operators,forms,common) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @enum {string} */
var DaDataType = {
fio: "fio",
address: "address",
party: "party",
bank: "bank",
email: "email",
};
var NgxDaDataService = /** @class */ (function () {
function NgxDaDataService(http) {
this.http = http;
this.apiKey = '';
}
/**
* @param {?} key
* @return {?}
*/
NgxDaDataService.prototype.setApiKey = /**
* @param {?} key
* @return {?}
*/
function (key) {
this.apiKey = key;
};
/**
* @param {?} value
* @param {?=} type
* @param {?=} count
* @param {?=} options
* @return {?}
*/
NgxDaDataService.prototype.getData = /**
* @param {?} value
* @param {?=} type
* @param {?=} count
* @param {?=} options
* @return {?}
*/
function (value, type, count, options) {
if (type === void 0) {
type = DaDataType.address;
}
if (count === void 0) {
count = 10;
}
if (options === void 0) {
options = null;
}
/** @type {?} */
var httpOptions = {
headers: new i1.HttpHeaders({
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Token ' + this.apiKey,
})
};
/** @type {?} */
var body = Object.assign({ query: value, count: count }, options);
return this.http.post("https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/" + type, body, httpOptions);
};
NgxDaDataService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
NgxDaDataService.ctorParameters = function () {
return [
{ type: i1.HttpClient }
];
};
/** @nocollapse */ NgxDaDataService.ngInjectableDef = i0.defineInjectable({ factory: function NgxDaDataService_Factory() { return new NgxDaDataService(i0.inject(i1.HttpClient)); }, token: NgxDaDataService, providedIn: "root" });
return NgxDaDataService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
var DaDataConfigDefault = {
apiKey: '',
type: DaDataType.address,
delay: 500,
limit: 10,
width: 'auto',
minWidth: '0',
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
var NGX_DADATA_VALUE_ACCESSOR = {
provide: forms.NG_VALUE_ACCESSOR,
useExisting: i0.forwardRef(function () { return NgxDaDataComponent; }),
multi: true
};
/*const NGX_DADATA_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => NgxDaDataComponent),
multi: true,
};*/
/**
* @param {?} value
* @return {?}
*/
function createDaDataValidator(value) {
return function (c) {
/** @type {?} */
var err = {
rangeError: {
given: c.value,
expected: value,
}
};
return (c.value !== value) ? err : null;
};
}
var NgxDaDataComponent = /** @class */ (function () {
function NgxDaDataComponent(dataService, _r) {
this.dataService = dataService;
this._r = _r;
this._value = '';
this.currentFocus = -1;
this.data = [];
this.config = DaDataConfigDefault;
this.disabled = null;
this.type = DaDataType.address;
this.options = null;
this.limit = DaDataConfigDefault.limit;
this.placeholder = '';
this.selected = new i0.EventEmitter();
this.input = new i0.EventEmitter();
this.inputString$ = new rxjs.Subject();
// onSuggestionSelected = (value: string) => {};
this.onTouched = function () { };
this.propagateChange = function () { };
this.validateFn = function () { };
}
Object.defineProperty(NgxDaDataComponent.prototype, "value", {
get: /**
* @return {?}
*/ function () {
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/ function (v) {
if (v !== this._value) {
this._value = v;
this.propagateChange(v);
this.input.emit(v);
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxDaDataComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
/*this.validateFn = createDaDataValidator(this._value);
this.propagateChange(this._value);*/
this.type = this.config.type;
this.dataService.setApiKey(this.apiKey ? this.apiKey : this.config.apiKey);
this.inputString$.pipe(operators.debounce(function () { return rxjs.timer(_this.config.delay ? _this.config.delay : 500); })).subscribe(function (x) {
_this.dataService.getData(x, _this.type, _this.limit, _this.options).subscribe(function (y) {
_this.data = y.suggestions;
});
});
};
/**
* @param {?} changes
* @return {?}
*/
NgxDaDataComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.value) ;
};
/**
* @param {?} value
* @return {?}
*/
NgxDaDataComponent.prototype.getData = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.inputString$.next(value);
this.currentFocus = -1;
};
/**
* @param {?} e
* @param {?} item
* @return {?}
*/
NgxDaDataComponent.prototype.onClick = /**
* @param {?} e
* @param {?} item
* @return {?}
*/
function (e, item) {
//e.preventDefault();
this.inputValue.nativeElement.value = item.value;
this.propagateChange(item.value);
this.inputValue.nativeElement.focus();
this.selectedSuggestion = item;
this.data = [];
this.currentFocus = -1;
//this.writeValue(item.value);
this.selected.emit(item);
// this.selectedData.emit(item.data);
// this.selectedString.emit(item.value);
};
/**
* @return {?}
*/
NgxDaDataComponent.prototype.onOutsideClick = /**
* @return {?}
*/
function () {
this.data = [];
};
/**
* @return {?}
*/
NgxDaDataComponent.prototype.onArrowDown = /**
* @return {?}
*/
function () {
this.removeFocus(this.currentFocus);
if (this.currentFocus >= this.data.length - 1) {
this.currentFocus = 0;
}
else {
this.currentFocus++;
}
this.setFocus(this.currentFocus);
};
/**
* @return {?}
*/
NgxDaDataComponent.prototype.onArrowUp = /**
* @return {?}
*/
function () {
this.removeFocus(this.currentFocus);
if (this.currentFocus === 0) {
this.currentFocus = this.data.length - 1;
}
else {
this.currentFocus--;
}
this.setFocus(this.currentFocus);
};
/**
* @return {?}
*/
NgxDaDataComponent.prototype.onEnter = /**
* @return {?}
*/
function () {
this.selectedSuggestion = this.data[this.currentFocus];
this.inputValue.nativeElement.value = this.selectedSuggestion.value;
this.data = [];
this.currentFocus = -1;
this.propagateChange(this.selectedSuggestion.value);
// this.writeValue(this.selectedSuggestion.value);
this.selected.emit(this.selectedSuggestion);
// this.selectedData.emit(this.selectedSuggestion.data);
// this.selectedString.emit(this.selectedSuggestion.value);
};
/**
* @param {?} id
* @return {?}
*/
NgxDaDataComponent.prototype.setFocus = /**
* @param {?} id
* @return {?}
*/
function (id) {
/** @type {?} */
var activeEl = document.getElementById(id + "item");
this._r.addClass(activeEl, "active");
};
/**
* @param {?} id
* @return {?}
*/
NgxDaDataComponent.prototype.removeFocus = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (id !== -1) {
/** @type {?} */
var activeEl = document.getElementById(id + "item");
this._r.removeClass(activeEl, "active");
}
};
/**
* @param {?} value
* @return {?}
*/
NgxDaDataComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== undefined) {
this._value = value;
}
// this.onSuggestionSelected(value);
};
/**
* Set the function to be called
* when the control receives a change event.
*
* @param fn a function
*/
/**
* Set the function to be called
* when the control receives a change event.
*
* @param {?} fn a function
* @return {?}
*/
NgxDaDataComponent.prototype.registerOnChange = /**
* Set the function to be called
* when the control receives a change event.
*
* @param {?} fn a function
* @return {?}
*/
function (fn) {
// this.onSuggestionSelected = fn;
this.propagateChange = fn;
};
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param fn a function
*/
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param {?} fn a function
* @return {?}
*/
NgxDaDataComponent.prototype.registerOnTouched = /**
* Set the function to be called
* when the control receives a touch event.
*
* @param {?} fn a function
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* Implements disabled state for this element
*
* @param isDisabled
*/
/**
* Implements disabled state for this element
*
* @param {?} isDisabled
* @return {?}
*/
NgxDaDataComponent.prototype.setDisabledState = /**
* Implements disabled state for this element
*
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
alert("disabled!");
this.disabled = isDisabled;
};
NgxDaDataComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'ngx-da-data',
template: "<div class=\"autocomplete\">\r\n <label for=\"address_input\"></label>\r\n <input [disabled]=\"disabled ? true : null\" type=\"text\" id=\"address_input\" name=\"address\" class=\"search\" #inputValue (input)=\"getData(inputValue.value)\"\r\n [placeholder]=\"placeholder\" (keyup.ArrowDown)=\"onArrowDown()\" (keyup.ArrowUp)=\"onArrowUp()\"\r\n (keyup.Enter)=\"onEnter()\" spellcheck=\"false\" [(ngModel)]=\"value\" autocomplete=\"new-password\" />\r\n <div *ngIf=\"data.length\">\r\n <div class=\"autocomplete-items\">\r\n <div class=\"autocomplele-item\" *ngFor=\"let item of data;let i = index\" (click)=\"onClick($event, item)\" [id]=\"i+'item'\">\r\n {{item.value}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
providers: [NGX_DADATA_VALUE_ACCESSOR,],
styles: [".autocomplete{position:relative}input{border:0 solid transparent;background-color:#f1f1f1;padding:5px}input[type=text]{background-color:#f1f1f1;width:100%}input[type=submit]{background-color:#1e90ff;color:#fff}.autocomplete-items{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items .autocomplele-item{padding:5px 10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-items .autocomplele-item:hover{background-color:#e9e9e9}.autocomplete-items .autocomplele-item.active{background-color:#1e90ff!important;color:#fff}"]
}] }
];
NgxDaDataComponent.ctorParameters = function () {
return [
{ type: NgxDaDataService },
{ type: i0.Renderer2 }
];
};
NgxDaDataComponent.propDecorators = {
config: [{ type: i0.Input }],
apiKey: [{ type: i0.Input }],
disabled: [{ type: i0.Input }],
type: [{ type: i0.Input }],
options: [{ type: i0.Input }],
limit: [{ type: i0.Input }],
placeholder: [{ type: i0.Input }],
selectedSuggestion: [{ type: i0.Output }],
selected: [{ type: i0.Output }],
input: [{ type: i0.Output }],
inputValue: [{ type: i0.ViewChild, args: ['inputValue',] }],
onOutsideClick: [{ type: i0.HostListener, args: ['document:click',] }]
};
return NgxDaDataComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxDaDataModule = /** @class */ (function () {
function NgxDaDataModule() {
}
NgxDaDataModule.decorators = [
{ type: i0.NgModule, args: [{
imports: [
common.CommonModule,
forms.FormsModule
],
declarations: [NgxDaDataComponent],
exports: [NgxDaDataComponent]
},] }
];
return NgxDaDataModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.DaDataType = DaDataType;
exports.NgxDaDataService = NgxDaDataService;
exports.createDaDataValidator = createDaDataValidator;
exports.NgxDaDataComponent = NgxDaDataComponent;
exports.NgxDaDataModule = NgxDaDataModule;
exports.DaDataConfigDefault = DaDataConfigDefault;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV6eWthbnRvdi1uZ3gtZGFkYXRhLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQG11enlrYW50b3Yvbmd4LWRhZGF0YS9saWIvbmd4LWRhLWRhdGEuc2VydmljZS50cyIsIm5nOi8vQG11enlrYW50b3Yvbmd4LWRhZGF0YS9saWIvZGEtZGF0YS1jb25maWcudHMiLCJuZzovL0BtdXp5a2FudG92L25neC1kYWRhdGEvbGliL25neC1kYS1kYXRhLmNvbXBvbmVudC50cyIsIm5nOi8vQG11enlrYW50b3Yvbmd4LWRhZGF0YS9saWIvbmd4LWRhLWRhdGEubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtEYURhdGFSZXNwb25zZX0gZnJvbSBcIi4vbW9kZWxzL2RhLWRhdGEtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBlbnVtIERhRGF0YVR5cGUge1xyXG4gIGZpbyA9IFwiZmlvXCIsXHJcbiAgYWRkcmVzcyA9IFwiYWRkcmVzc1wiLFxyXG4gIHBhcnR5ID0gXCJwYXJ0eVwiLFxyXG4gIGJhbmsgPSBcImJhbmtcIixcclxuICBlbWFpbCA9IFwiZW1haWxcIlxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hEYURhdGFTZXJ2aWNlIHtcclxuICBhcGlLZXkgPSAnJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuXHJcbiAgc2V0QXBpS2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmFwaUtleSA9IGtleTtcclxuICB9XHJcblxyXG4gIGdldERhdGEodmFsdWU6IHN0cmluZywgdHlwZTogRGFEYXRhVHlwZSA9IERhRGF0YVR5cGUuYWRkcmVzcywgY291bnQ6IG51bWJlciA9IDEwLCBvcHRpb25zOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxEYURhdGFSZXNwb25zZT57XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAgJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogJ1Rva2VuICcgKyB0aGlzLmFwaUtleSxcclxuICAgICAgfSlcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oeyBxdWVyeTogdmFsdWUsIGNvdW50OiBjb3VudCB9LCBvcHRpb25zKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxEYURhdGFSZXNwb25zZT4oXCJodHRwczovL3N1Z2dlc3Rpb25zLmRhZGF0YS5ydS9zdWdnZXN0aW9ucy9hcGkvNF8xL3JzL3N1Z2dlc3QvXCIgKyB0eXBlLCBib2R5LCBodHRwT3B0aW9ucylcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtEYURhdGFUeXBlfSBmcm9tIFwiLi9uZ3gtZGEtZGF0YS5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhRGF0YUNvbmZpZyB7XHJcbiAgYXBpS2V5OiBzdHJpbmc7XHJcbiAgdHlwZT86IERhRGF0YVR5cGUsXHJcbiAgZGVsYXk/OiBudW1iZXI7XHJcbiAgbGltaXQ/OiBudW1iZXI7XHJcbiAgd2lkdGg/OiAnYXV0bycgfCBzdHJpbmcsXHJcbiAgbWluV2lkdGg/OiAnMCcgfCBzdHJpbmcsXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBEYURhdGFDb25maWdEZWZhdWx0OiBEYURhdGFDb25maWcgPSB7XHJcbiAgYXBpS2V5OiAnJyxcclxuICB0eXBlOiBEYURhdGFUeXBlLmFkZHJlc3MsXHJcbiAgZGVsYXk6IDUwMCxcclxuICBsaW1pdDogMTAsXHJcbiAgd2lkdGg6ICdhdXRvJyxcclxuICBtaW5XaWR0aDogJzAnLFxyXG59O1xyXG4iLCJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEYURhdGFUeXBlLCBOZ3hEYURhdGFTZXJ2aWNlfSBmcm9tIFwiLi9uZ3gtZGEtZGF0YS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3ViamVjdCwgdGltZXJ9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7ZGVib3VuY2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge0RhRGF0YVJlc3BvbnNlfSBmcm9tIFwiLi9tb2RlbHMvZGEtZGF0YS1yZXNwb25zZVwiO1xyXG5pbXBvcnQge0RhRGF0YVN1Z2dlc3Rpb259IGZyb20gXCIuL21vZGVscy9zdWdnZXN0aW9uXCI7XHJcbmltcG9ydCB7RGFEYXRhQ29uZmlnLCBEYURhdGFDb25maWdEZWZhdWx0fSBmcm9tIFwiLi9kYS1kYXRhLWNvbmZpZ1wiO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0RhRGF0YUFkZHJlc3MsIERhRGF0YUJhbmssIERhRGF0YUVtYWlsLCBEYURhdGFGSU8sIERhRGF0YVBhcnR5fSBmcm9tIFwiLi9tb2RlbHMvZGF0YVwiO1xyXG5cclxuY29uc3QgTkdYX0RBREFUQV9WQUxVRV9BQ0NFU1NPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hEYURhdGFDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG4vKmNvbnN0IE5HWF9EQURBVEFfVkFMSURBVE9SID0ge1xyXG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFEYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZSxcclxufTsqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhRGF0YVZhbGlkYXRvcih2YWx1ZSkge1xyXG4gIHJldHVybiAoYzogRm9ybUNvbnRyb2wpID0+IHtcclxuICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgcmFuZ2VFcnJvcjoge1xyXG4gICAgICAgIGdpdmVuOiBjLnZhbHVlLFxyXG4gICAgICAgIGV4cGVjdGVkOiB2YWx1ZSxcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKGMudmFsdWUgIT09IHZhbHVlKSA/IGVyciA6IG51bGw7XHJcbiAgfTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtZGEtZGF0YScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1kYS1kYXRhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZ3gtZGEtZGF0YS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW05HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IsIC8qTkdYX0RBREFUQV9WQUxJREFUT1IqL11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neERhRGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9ICcnO1xyXG4gIGN1cnJlbnRGb2N1cyA9IC0xO1xyXG5cclxuICBkYXRhOiBEYURhdGFTdWdnZXN0aW9uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBEYURhdGFDb25maWcgPSBEYURhdGFDb25maWdEZWZhdWx0O1xyXG4gIEBJbnB1dCgpIGFwaUtleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gbnVsbDtcclxuICBASW5wdXQoKSB0eXBlID0gRGFEYXRhVHlwZS5hZGRyZXNzO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnMgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGxpbWl0ID0gRGFEYXRhQ29uZmlnRGVmYXVsdC5saW1pdDtcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRTdWdnZXN0aW9uOiBEYURhdGFTdWdnZXN0aW9uO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGFEYXRhU3VnZ2VzdGlvbj4oKTtcclxuICBAT3V0cHV0KCkgaW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAvLyBAT3V0cHV0KCkgc2VsZWN0ZWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxEYURhdGFBZGRyZXNzIHwgRGFEYXRhRklPIHwgRGFEYXRhQmFuayB8IERhRGF0YVBhcnR5IHwgRGFEYXRhRW1haWw+KCk7XHJcbiAgLy8gQE91dHB1dCgpIHNlbGVjdGVkU3RyaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0VmFsdWUnKSBpbnB1dFZhbHVlOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGlucHV0U3RyaW5nJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgLy8gb25TdWdnZXN0aW9uU2VsZWN0ZWQgPSAodmFsdWU6IHN0cmluZykgPT4ge307XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcbiAgcHJvcGFnYXRlQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcclxuICB2YWxpZGF0ZUZuOiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogTmd4RGFEYXRhU2VydmljZSwgcHJpdmF0ZSBfcjogUmVuZGVyZXIyKSB7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHYpO1xyXG5cclxuICAgICAgdGhpcy5pbnB1dC5lbWl0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvKnRoaXMudmFsaWRhdGVGbiA9IGNyZWF0ZURhRGF0YVZhbGlkYXRvcih0aGlzLl92YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl92YWx1ZSk7Ki9cclxuICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7ICAgIFxyXG4gICAgdGhpcy5kYXRhU2VydmljZS5zZXRBcGlLZXkodGhpcy5hcGlLZXkgPyB0aGlzLmFwaUtleSA6IHRoaXMuY29uZmlnLmFwaUtleSk7XHJcbiAgICB0aGlzLmlucHV0U3RyaW5nJC5waXBlKFxyXG4gICAgICBkZWJvdW5jZSgoKSA9PiB0aW1lcih0aGlzLmNvbmZpZy5kZWxheSA/IHRoaXMuY29uZmlnLmRlbGF5IDogNTAwKSksXHJcbiAgICApLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgdGhpcy5kYXRhU2VydmljZS5nZXREYXRhKHgsIHRoaXMudHlwZSwgdGhpcy5saW1pdCwgdGhpcy5vcHRpb25zKS5zdWJzY3JpYmUoKHk6IERhRGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0geS5zdWdnZXN0aW9ucztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmlucHV0U3RyaW5nJC5uZXh0KHZhbHVlKTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IERhRGF0YVN1Z2dlc3Rpb24pIHtcclxuICAgIC8vZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBpdGVtLnZhbHVlO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbS52YWx1ZSk7XHJcbiAgICB0aGlzLmlucHV0VmFsdWUubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24gPSBpdGVtO1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG5cclxuICAgIC8vdGhpcy53cml0ZVZhbHVlKGl0ZW0udmFsdWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KGl0ZW0pO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZERhdGEuZW1pdChpdGVtLmRhdGEpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZFN0cmluZy5lbWl0KGl0ZW0udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIG9uT3V0c2lkZUNsaWNrKCkge1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgfVxyXG5cclxuICBvbkFycm93RG93bigpIHtcclxuICAgIHRoaXMucmVtb3ZlRm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZvY3VzID49IHRoaXMuZGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZvY3VzID0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZvY3VzKys7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICB9XHJcblxyXG4gIG9uQXJyb3dVcCgpIHtcclxuICAgIHRoaXMucmVtb3ZlRm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZvY3VzID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZvY3VzID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cy0tO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgfVxyXG5cclxuICBvbkVudGVyKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24gPSB0aGlzLmRhdGFbdGhpcy5jdXJyZW50Rm9jdXNdO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZTtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlKTtcclxuICAgIC8vIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24pO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZERhdGEuZW1pdCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi5kYXRhKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRTdHJpbmcuZW1pdCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzZXRGb2N1cyhpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgXCJpdGVtXCIpO1xyXG4gICAgdGhpcy5fci5hZGRDbGFzcyhhY3RpdmVFbCwgXCJhY3RpdmVcIik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGb2N1cyhpZDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaWQgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyBcIml0ZW1cIik7XHJcbiAgICAgIHRoaXMuX3IucmVtb3ZlQ2xhc3MoYWN0aXZlRWwsIFwiYWN0aXZlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZm4gYSBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCA9IGZuO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXHJcbiAgICogd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIHRvdWNoIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50cyBkaXNhYmxlZCBzdGF0ZSBmb3IgdGhpcyBlbGVtZW50XHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgYWxlcnQoXCJkaXNhYmxlZCFcIik7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmd4RGFEYXRhQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3gtZGEtZGF0YS5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIGRlY2xhcmF0aW9uczogW05neERhRGF0YUNvbXBvbmVudF0sXHJcbiAgZXhwb3J0czogW05neERhRGF0YUNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neERhRGF0YU1vZHVsZSB7IH1cclxuIl0sIm5hbWVzIjpbIkh0dHBIZWFkZXJzIiwiSW5qZWN0YWJsZSIsIkh0dHBDbGllbnQiLCJOR19WQUxVRV9BQ0NFU1NPUiIsImZvcndhcmRSZWYiLCJFdmVudEVtaXR0ZXIiLCJTdWJqZWN0IiwiZGVib3VuY2UiLCJ0aW1lciIsIkNvbXBvbmVudCIsIlJlbmRlcmVyMiIsIklucHV0IiwiT3V0cHV0IiwiVmlld0NoaWxkIiwiSG9zdExpc3RlbmVyIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiLCJGb3Jtc01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztRQU1FLEtBQU0sS0FBSztRQUNYLFNBQVUsU0FBUztRQUNuQixPQUFRLE9BQU87UUFDZixNQUFPLE1BQU07UUFDYixPQUFRLE9BQU87OztRQVNmLDBCQUFvQixJQUFnQjtZQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1lBRnBDLFdBQU0sR0FBRyxFQUFFLENBQUM7U0FFNkI7Ozs7O1FBRXpDLG9DQUFTOzs7O1lBQVQsVUFBVSxHQUFXO2dCQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzthQUNuQjs7Ozs7Ozs7UUFFRCxrQ0FBTzs7Ozs7OztZQUFQLFVBQVEsS0FBYSxFQUFFLElBQXFDLEVBQUUsS0FBa0IsRUFBRSxPQUFtQjtnQkFBOUUscUJBQUE7b0JBQUEsT0FBbUIsVUFBVSxDQUFDLE9BQU87O2dCQUFFLHNCQUFBO29CQUFBLFVBQWtCOztnQkFBRSx3QkFBQTtvQkFBQSxjQUFtQjs7O29CQUM3RixXQUFXLEdBQUc7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJQSxjQUFXLENBQUM7d0JBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7d0JBQzVCLGNBQWMsRUFBRyxrQkFBa0I7d0JBQ25DLGVBQWUsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU07cUJBQ3hDLENBQUM7aUJBQ0g7O29CQUVLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxD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