UNPKG

angular4x-auto-complete-multi

Version:

Remote autocomple for andular 4, 5, 6. Setup the url and field names of database which value will show in list, Multiple fiels can be set by comma separator. The data format of return value of remote url should be JSON. After start typing i

196 lines (195 loc) 24.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Renderer2, ElementRef, ViewChild, HostListener } from '@angular/core'; import { HttpClient } from '@angular/common/http'; var Angula4xAutoCompleteComponent = /** @class */ (function () { function Angula4xAutoCompleteComponent(http, renderer) { this.http = http; this.renderer = renderer; this.all_list_child = []; this.selected_row = []; this.selected_row_obj = {}; this._loading = "hidden"; } /** * @param {?} setting_obj * @return {?} */ Angula4xAutoCompleteComponent.prototype.setting = /** * @param {?} setting_obj * @return {?} */ function (setting_obj) { this.data_url = setting_obj.data_url; this.db_fields = setting_obj.db_fields; //console.log(this.data_url) }; /** * @return {?} */ Angula4xAutoCompleteComponent.prototype.clickout = /** * @return {?} */ function () { this._clearList(); }; /** * @param {?} event * @return {?} */ Angula4xAutoCompleteComponent.prototype.getData = /** * @param {?} event * @return {?} */ function (event) { var _this = this; var /** @type {?} */ input_val = event.target.value; if (input_val.length == 0) { this._clearList(); return; } var /** @type {?} */ final_url = this.data_url + '?q=' + input_val; this._loading = "visible"; this.http.get(final_url).subscribe(function (todo) { _this._clearList(); var _loop_1 = function (k) { var /** @type {?} */ new_div = _this.renderer.createElement('div'); var /** @type {?} */ field_array = _this.db_fields.split(","); var /** @type {?} */ display_text = ""; for (var /** @type {?} */ i = 0; i < field_array.length; i++) { display_text += todo[k][field_array[i]] + " "; } display_text = display_text.trim(); _this.renderer.appendChild(new_div, _this.renderer.createText(display_text)); _this.all_list_child.push(new_div); _this.renderer.listen(new_div, 'click', function (event) { //this.text_fld.nativeElement.value=event.target.innerHTML var /** @type {?} */ tindex = Array.from(event.target.parentNode.children).indexOf(event.target); var /** @type {?} */ id = todo[tindex].id; try { for (var _a = tslib_1.__values(_this.selected_row), _b = _a.next(); !_b.done; _b = _a.next()) { var row = _b.value; if (row.id == id) { _this.text_fld.nativeElement.value = ""; return; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } //this.selected_row.push(todo[tindex]) //this.selected_row.push(todo[tindex]) _this.selected_row_obj[display_text] = todo[tindex]; //console.log(this.selected_row_obj); var /** @type {?} */ select_new_div = _this.renderer.createElement('div'); var /** @type {?} */ remove_new_div = _this.renderer.createElement('div'); _this.renderer.appendChild(remove_new_div, _this.renderer.createText("x")); _this.renderer.addClass(remove_new_div, 'remove_div'); _this.renderer.setAttribute(remove_new_div, "id", display_text + "_" + "elem_autocomp"); _this.renderer.addClass(select_new_div, "selected_div"); _this.renderer.appendChild(select_new_div, remove_new_div); _this.renderer.appendChild(select_new_div, _this.renderer.createText(event.target.innerHTML)); _this.renderer.listen(remove_new_div, 'click', function (event) { var /** @type {?} */ id = event.target.id.split("_")[0]; var /** @type {?} */ i = 0; delete _this.selected_row_obj[id]; _this.renderer.removeChild(_this.list_div.nativeElement, event.target.parentNode); //console.log(this.selected_row_obj); }); _this.text_fld.nativeElement.value = ""; _this.renderer.appendChild(_this.list_div.nativeElement, select_new_div); var e_1, _c; }); _this.renderer.appendChild(_this.list.nativeElement, new_div); theight = _this.text_fld.nativeElement.parentElement.offsetHeight; _this.renderer.setStyle(_this.list.nativeElement, "top", theight + "px"); _this.renderer.setStyle(_this.list.nativeElement, "display", "block"); _this.renderer.addClass(new_div, "ngxautocomp_list_el"); }; var theight; for (var /** @type {?} */ k in todo) { _loop_1(k); } _this._loading = "hidden"; }); }; /** * @return {?} */ Angula4xAutoCompleteComponent.prototype._clearList = /** * @return {?} */ function () { for (var /** @type {?} */ i = 0; i < this.all_list_child.length; i++) this.renderer.removeChild(this.list.nativeElement, this.all_list_child[i]); this.all_list_child = []; this.renderer.setStyle(this.list.nativeElement, "display", "none"); }; /** * @return {?} */ Angula4xAutoCompleteComponent.prototype.getSelectedRow = /** * @return {?} */ function () { var /** @type {?} */ i = 0; this.selected_row = []; for (var /** @type {?} */ row in this.selected_row_obj) { this.selected_row[i++] = this.selected_row_obj[row]; } return JSON.stringify(this.selected_row); }; Angula4xAutoCompleteComponent.decorators = [ { type: Component, args: [{ selector: 'angula4x-auto-complete', template: "\n<div class=\"ngxautocomplete\">\n <div #_ng_autocomp_selected_list class=\"list_container\"></div>\n <input type=\"text\" value=\"\" name=\"ngx-autocomplete_field\" (keyup)=\"getData($event)\" #_ng_autocomp_txt>\n <div #_ng_autocom_list class=\"ngx-auto-list\"></div>\n <i class=\"fa fa-cog fa-spin\" [style.visibility]=\"_loading\" ></i>\n</div>", styles: [":focus{outline:0}.ngxautocomplete{position:relative;width:100%;border:1px solid #ccc}.ngxautocomplete .list_container{width:100%;float:left}.ngxautocomplete input{border:0;width:90%}.ngx-auto-list{display:none;position:absolute;width:100%;min-height:300px;overflow-y:scroll;border-left:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;top:0;background:#fff;z-index:99}.ngxautocomp_list_el{text-align:left;cursor:pointer;padding:5px}.ngxautocomp_list_el:hover{background-color:#ccc}.ngxautocomplete .selected_div{background-color:#d0e1ec;border:1px solid #d0e1ec;border-radius:10px;padding:5px;margin:3px;width:auto;float:left}.ngxautocomplete .selected_div .remove_div{cursor:pointer;margin-left:4px;border:1px solid #7c7a7a;padding:0 2px 5px;color:#2c2b2b;text-align:center;font-size:13px;line-height:17px;border-radius:100px;width:14px;height:14px;background:#fff;float:right;font-family:Arial,Helvetica,sans-serif}.ngxautocomplete .selected_div .remove_div:hover{color:#ec0606;border:1px solid #ec0606}"] },] }, ]; /** @nocollapse */ Angula4xAutoCompleteComponent.ctorParameters = function () { return [ { type: HttpClient }, { type: Renderer2 } ]; }; Angula4xAutoCompleteComponent.propDecorators = { list: [{ type: ViewChild, args: ['_ng_autocom_list',] }], text_fld: [{ type: ViewChild, args: ['_ng_autocomp_txt',] }], list_div: [{ type: ViewChild, args: ['_ng_autocomp_selected_list',] }], clickout: [{ type: HostListener, args: ['document:click',] }] }; return Angula4xAutoCompleteComponent; }()); export { Angula4xAutoCompleteComponent }; function Angula4xAutoCompleteComponent_tsickle_Closure_declarations() { /** @type {?} */ Angula4xAutoCompleteComponent.prototype.data_url; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.db_fields; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.all_list_child; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.selected_row; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.selected_row_obj; /** @type {?} */ Angula4xAutoCompleteComponent.prototype._loading; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.list; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.text_fld; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.list_div; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.http; /** @type {?} */ Angula4xAutoCompleteComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhNHgtYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS1tdWx0aS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hbmd1bGFyNHgtYXV0by1jb21wbGV0ZS9hbmd1bGE0eC1hdXRvLWNvbXBsZXRlL2FuZ3VsYTR4LWF1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDOztJQXdCOUMsdUNBQXNCLElBQWUsRUFBVyxRQUFrQjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFXO1FBQVcsYUFBUSxHQUFSLFFBQVEsQ0FBVTs4QkFQbkQsRUFBRTs0QkFDSixFQUFFO2dDQUNFLEVBQUU7d0JBQ0gsUUFBUTtLQUkrQzs7Ozs7SUFDdkUsK0NBQU87Ozs7SUFBUCxVQUFRLFdBQVc7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQzs7S0FFdkM7Ozs7SUFJRCxnREFBUTs7O0lBRFI7UUFHRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7S0FDbkI7Ozs7O0lBQ0QsK0NBQU87Ozs7SUFBUCxVQUFRLEtBQUs7UUFBYixpQkFzRUM7UUFyRUsscUJBQUksU0FBUyxHQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO1FBRWpDLEVBQUUsQ0FBQSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFB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RyxDQUFDLENBQUM7U0FDbkQ7UUFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDM0M7O2dCQXhIRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLGtXQU1MO29CQUNMLE1BQU0sRUFBRSxDQUFDLHNnQ0FBc2dDLENBQUM7aUJBQ2poQzs7OztnQkFiTyxVQUFVO2dCQURVLFNBQVM7Ozt1QkFzQmxDLFNBQVMsU0FBQyxrQkFBa0I7MkJBQzVCLFNBQVMsU0FBQyxrQkFBa0I7MkJBQzVCLFNBQVMsU0FBQyw0QkFBNEI7MkJBU3RDLFlBQVksU0FBQyxnQkFBZ0I7O3dDQWpDaEM7O1NBZWEsNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuZ3VsYTR4LWF1dG8tY29tcGxldGUnLFxuICB0ZW1wbGF0ZTogYFxuPGRpdiBjbGFzcz1cIm5neGF1dG9jb21wbGV0ZVwiPlxuICA8ZGl2ICNfbmdfYXV0b2NvbXBfc2VsZWN0ZWRfbGlzdCBjbGFzcz1cImxpc3RfY29udGFpbmVyXCI+PC9kaXY+XG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgbmFtZT1cIm5neC1hdXRvY29tcGxldGVfZmllbGRcIiAoa2V5dXApPVwiZ2V0RGF0YSgkZXZlbnQpXCIgI19uZ19hdXRvY29tcF90eHQ+XG4gIDxkaXYgI19uZ19hdXRvY29tX2xpc3QgY2xhc3M9XCJuZ3gtYXV0by1saXN0XCI+PC9kaXY+XG4gIDxpIGNsYXNzPVwiZmEgZmEtY29nIGZhLXNwaW5cIiBbc3R5bGUudmlzaWJpbGl0eV09XCJfbG9hZGluZ1wiID48L2k+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgOmZvY3Vze291dGxpbmU6MH0ubmd4YXV0b2NvbXBsZXRle3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjfS5uZ3hhdXRvY29tcGxldGUgLmxpc3RfY29udGFpbmVye3dpZHRoOjEwMCU7ZmxvYXQ6bGVmdH0ubmd4YXV0b2NvbXBsZXRlIGlucHV0e2JvcmRlcjowO3dpZHRoOjkwJX0ubmd4LWF1dG8tbGlzdHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwMHB4O292ZXJmbG93LXk6c2Nyb2xsO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjY2NjO2JvcmRlci1yaWdodDoxcHggc29saWQgI2NjYztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjO3RvcDowO2JhY2tncm91bmQ6I2ZmZjt6LWluZGV4Ojk5fS5uZ3hhdXRvY29tcF9saXN0X2Vse3RleHQtYWxpZ246bGVmdDtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjVweH0ubmd4YXV0b2NvbXBfbGlzdF9lbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjY2N9Lm5neGF1dG9jb21wbGV0ZSAuc2VsZWN0ZWRfZGl2e2JhY2tncm91bmQtY29sb3I6I2QwZTFlYztib3JkZXI6MXB4IHNvbGlkICNkMGUxZWM7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6NXB4O21hcmdpbjozcHg7d2lkdGg6YXV0bztmbG9hdDpsZWZ0fS5uZ3hhdXRvY29tcGxldGUgLnNlbGVjdGVkX2RpdiAucmVtb3ZlX2RpdntjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjN2M3YTdhO3BhZGRpbmc6MCAycHggNXB4O2NvbG9yOiMyYzJiMmI7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MTdweDtib3JkZXItcmFkaXVzOjEwMHB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7YmFja2dyb3VuZDojZmZmO2Zsb2F0OnJpZ2h0O2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmfS5uZ3hhdXRvY29tcGxldGUgLnNlbGVjdGVkX2RpdiAucmVtb3ZlX2Rpdjpob3Zlcntjb2xvcjojZWMwNjA2O2JvcmRlcjoxcHggc29saWQgI2VjMDYwNn1gXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGE0eEF1dG9Db21wbGV0ZUNvbXBvbmVudCB7XG4gIGRhdGFfdXJsOmFueTtcbiAgZGJfZmllbGRzOmFueTtcbiAgYWxsX2xpc3RfY2hpbGQ9W107XG4gIHNlbGVjdGVkX3Jvdz1bXVxuICBzZWxlY3RlZF9yb3dfb2JqPXt9XG4gIF9sb2FkaW5nOnN0cmluZz1cImhpZGRlblwiO1xuICBAVmlld0NoaWxkKCdfbmdfYXV0b2NvbV9saXN0JykgbGlzdDpFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdfbmdfYXV0b2NvbXBfdHh0JykgdGV4dF9mbGQ6RWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21wX3NlbGVjdGVkX2xpc3QnKSBsaXN0X2RpdjpFbGVtZW50UmVmO1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDpIdHRwQ2xpZW50LHByb3RlY3RlZCByZW5kZXJlcjpSZW5kZXJlcjIpIHsgfVxuICBzZXR0aW5nKHNldHRpbmdfb2JqKXtcbiAgICB0aGlzLmRhdGFfdXJsPXNldHRpbmdfb2JqLmRhdGFfdXJsO1xuICAgIHRoaXMuZGJfZmllbGRzPSBzZXR0aW5nX29iai5kYl9maWVsZHM7XG4gICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGFfdXJsKVxuICB9XG4gIFxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgY2xpY2tvdXQoKSB7XG4gICAgXG4gICAgIHRoaXMuX2NsZWFyTGlzdCgpXG4gIH1cbiAgZ2V0RGF0YShldmVudCl7XG4gICAgICAgIGxldCBpbnB1dF92YWw9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICBcbiAgICAgICAgaWYoaW5wdXRfdmFsLmxlbmd0aD09MCl7XG4gICAgICAgICAgdGhpcy5fY2xlYXJMaXN0KCk7XG4gICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBmaW5hbF91cmw9dGhpcy5kYXRhX3VybCsnP3E9JytpbnB1dF92YWxcbiAgICAgICAgdGhpcy5fbG9hZGluZz1cInZpc2libGVcIlxuICAgICAgICB0aGlzLmh0dHAuZ2V0KGZpbmFsX3VybCkuc3Vic2NyaWJlKHRvZG89PntcbiAgICAgICAgICAgICAgdGhpcy5fY2xlYXJMaXN0KClcbiAgICAgICAgICAgICAgZm9yKGxldCBrIGluIHRvZG8pe1xuICAgICAgICAgICAgICAgIGxldCBuZXdfZGl2PXRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkX2FycmF5PXRoaXMuZGJfZmllbGRzLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5X3RleHQ9XCJcIlxuICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8ZmllbGRfYXJyYXkubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICBkaXNwbGF5X3RleHQrPXRvZG9ba11bZmllbGRfYXJyYXlbaV1dK1wiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwbGF5X3RleHQ9ZGlzcGxheV90ZXh0LnRyaW0oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG5ld19kaXYsdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGRpc3BsYXlfdGV4dCkpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuYWxsX2xpc3RfY2hpbGQucHVzaChuZXdfZGl2KVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG5ld19kaXYsJ2NsaWNrJywoZXZlbnQpPT57XG4gICAgICAgICAgICAgICAgICAvL3RoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC52YWx1ZT1ldmVudC50YXJnZXQuaW5uZXJIVE1MXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgbGV0IHRpbmRleD1BcnJheS5mcm9tKGV2ZW50LnRhcmdldC5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAgIGxldCBpZD10b2RvW3RpbmRleF0uaWRcbiAgICAgICAgICAgICAgICAgIGZvcihsZXQgcm93IG9mIHRoaXMuc2VsZWN0ZWRfcm93KXtcbiAgICAgICAgICAgICAgICAgICAgaWYocm93LmlkPT1pZCl7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0X2ZsZC5uYXRpdmVFbGVtZW50LnZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5zZWxlY3RlZF9yb3cucHVzaCh0b2RvW3RpbmRleF0pXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkX3Jvd19vYmpbZGlzcGxheV90ZXh0XT10b2RvW3RpbmRleF07XG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRfcm93X29iaik7XG4gICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0X25ld19kaXY9dGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVfbmV3X2Rpdj10aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHJlbW92ZV9uZXdfZGl2LHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChcInhcIikpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHJlbW92ZV9uZXdfZGl2LCdyZW1vdmVfZGl2JylcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHJlbW92ZV9uZXdfZGl2LFwiaWRcIixkaXNwbGF5X3RleHQrXCJfXCIrXCJlbGVtX2F1dG9jb21wXCIpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHNlbGVjdF9uZXdfZGl2LFwic2VsZWN0ZWRfZGl2XCIpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHNlbGVjdF9uZXdfZGl2LHJlbW92ZV9uZXdfZGl2KVxuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzZWxlY3RfbmV3X2Rpdix0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoZXZlbnQudGFyZ2V0LmlubmVySFRNTCkpXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihyZW1vdmVfbmV3X2RpdiwnY2xpY2snLChldmVudCk9PntcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQ9ZXZlbnQudGFyZ2V0LmlkLnNwbGl0KFwiX1wiKVswXVxuICAgICAgICAgICAgICAgICAgICAgIGxldCBpPTA7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0ZWRfcm93X29ialtpZF1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubGlzdF9kaXYubmF0aXZlRWxlbWVudCxldmVudC50YXJnZXQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRfcm93X29iaik7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0X2ZsZC5uYXRpdmVFbGVtZW50LnZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5saXN0X2Rpdi5uYXRpdmVFbGVtZW50LHNlbGVjdF9uZXdfZGl2KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCxuZXdfZGl2KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciB0aGVpZ2h0PXRoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5saXN0Lm5hdGl2ZUVsZW1lbnQsXCJ0b3BcIix0aGVpZ2h0K1wicHhcIilcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwiZGlzcGxheVwiLFwiYmxvY2tcIilcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobmV3X2RpdixcIm5neGF1dG9jb21wX2xpc3RfZWxcIilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nPVwiaGlkZGVuXCJcbiAgICAgICAgfSlcblxuICB9IFxuXG4gIHByaXZhdGUgX2NsZWFyTGlzdCgpe1xuICAgIGZvcihsZXQgaT0wO2k8dGhpcy5hbGxfbGlzdF9jaGlsZC5sZW5ndGg7aSsrKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LHRoaXMuYWxsX2xpc3RfY2hpbGRbaV0pXG4gICAgdGhpcy5hbGxfbGlzdF9jaGlsZD1bXTsgICAgIFxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5saXN0Lm5hdGl2ZUVsZW1lbnQsXCJkaXNwbGF5XCIsXCJub25lXCIpXG4gIH1cblxuICBnZXRTZWxlY3RlZFJvdygpOnN0cmluZ3tcbiAgICBsZXQgaT0wO1xuICAgIHRoaXMuc2VsZWN0ZWRfcm93PVtdO1xuICAgIGZvcihsZXQgcm93IGluIHRoaXMuc2VsZWN0ZWRfcm93X29iail7XG4gICAgICB0aGlzLnNlbGVjdGVkX3Jvd1tpKytdPXRoaXMuc2VsZWN0ZWRfcm93X29ialtyb3ddO1xuICAgIH1cbiAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRfcm93KTtcbiAgfVxuXG59XG4iXX0=