ngx-mat-tag-input
Version:
Angular tags-input based on Material Angular
173 lines • 19.7 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { map, startWith } from 'rxjs/operators';
var NgxMatTagInputComponent = /** @class */ (function () {
function NgxMatTagInputComponent() {
this.items = [];
this.selectedTags = [];
this.reset = new EventEmitter();
this.ngModelChange = new EventEmitter();
this.change = new EventEmitter();
this.focus = new EventEmitter();
this.select = new EventEmitter();
this.touched = new EventEmitter();
this.separatorKeysCodes = [ENTER, COMMA];
this.searchControl = new FormControl();
this.onChange = function () {
};
this.onTouched = function () {
};
}
NgxMatTagInputComponent_1 = NgxMatTagInputComponent;
Object.defineProperty(NgxMatTagInputComponent.prototype, "value", {
get: function () {
return this.selectedTags;
},
set: function (value) {
this.selectedTags = value;
this.onChange(value);
this._change(value);
this.onTouched();
},
enumerable: true,
configurable: true
});
NgxMatTagInputComponent.prototype.ngOnInit = function () {
var _this = this;
this.filteredItems = this.searchControl.valueChanges.pipe(startWith(null), map(function (tag) { return tag ? _this._filter(tag) : _this.items.slice(); }));
};
NgxMatTagInputComponent.prototype.writeValue = function (obj) {
if (obj) {
this.value = obj;
}
if (obj === null) {
this.value = [];
}
};
NgxMatTagInputComponent.prototype.registerOnChange = function (fn) {
this.change.emit(fn);
this.onChange = fn;
};
NgxMatTagInputComponent.prototype.registerOnTouched = function (fn) {
this.onTouched = fn;
this.touched.emit(fn);
};
NgxMatTagInputComponent.prototype.setDisabledState = function (isDisabled) {
this.searchControl.disable();
};
NgxMatTagInputComponent.prototype._modelChange = function (event) {
this.ngModelChange.emit(event);
};
NgxMatTagInputComponent.prototype._change = function (event) {
this.change.emit(event);
};
NgxMatTagInputComponent.prototype._focus = function (event) {
this.focus.emit(event);
};
NgxMatTagInputComponent.prototype.add = function (event) {
var input = event.input;
var value = event.value;
if ((value || '').trim()) {
this.selectedTags.push(value.trim());
}
if (input) {
input.value = '';
}
this.searchControl.setValue(null);
this._change(this.selectedTags);
};
NgxMatTagInputComponent.prototype.remove = function (fruit) {
var index = this.selectedTags.indexOf(fruit);
if (index >= 0) {
this.selectedTags.splice(index, 1);
}
this._change(this.selectedTags);
};
NgxMatTagInputComponent.prototype.selected = function (event) {
this.pushTag(event.option.value);
this.tagsInput.nativeElement.value = '';
this.searchControl.setValue(null);
this.select.emit(event.option.value);
};
NgxMatTagInputComponent.prototype.clear = function () {
this.selectedTags = [];
};
NgxMatTagInputComponent.prototype.pushTag = function (tag) {
if (!this.selectedTags.includes(tag)) {
this.selectedTags.push(tag);
this._change(this.selectedTags);
}
};
NgxMatTagInputComponent.prototype._filter = function (value) {
var _this = this;
var filterValue = (this.displayBy && value[this.displayBy] ? value[this.displayBy] : value).toLowerCase();
if (this.displayBy) {
return this.items.filter(function (option) { return option[_this.displayBy].toLowerCase().includes(filterValue); });
}
else {
return this.items.filter(function (option) { return option.toLowerCase().includes(filterValue); });
}
};
var NgxMatTagInputComponent_1;
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "appearance", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "readonly", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "items", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "placeholder", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "displayBy", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "isLoading", void 0);
__decorate([
Input()
], NgxMatTagInputComponent.prototype, "selectedTags", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "reset", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "ngModelChange", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "change", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "focus", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "select", void 0);
__decorate([
Output()
], NgxMatTagInputComponent.prototype, "touched", void 0);
__decorate([
ViewChild('tagsInput')
], NgxMatTagInputComponent.prototype, "tagsInput", void 0);
NgxMatTagInputComponent = NgxMatTagInputComponent_1 = __decorate([
Component({
selector: 'ngx-mat-tag-input',
template: "<mat-form-field [appearance]=\"appearance\" class=\"mat-tag-input-container\">\r\n <mat-chip-list #chipList>\r\n <mat-chip (removed)=\"remove(item)\" *ngFor=\"let item of selectedTags\" [removable]=\"true\" [selectable]=\"true\">\r\n {{displayBy ? item[displayBy] : item}}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input #tagsInput\r\n (focus)=\"_focus($event)\" (matChipInputTokenEnd)=\"add($event)\" (ngModelChange)=\"_modelChange($event)\"\r\n [formControl]=\"searchControl\" [matAutocomplete]=\"auto\" [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [placeholder]=\"placeholder\">\r\n </mat-chip-list>\r\n <button (click)=\"clear()\" *ngIf=\"selectedTags.length !== 0\" mat-button mat-icon-button\r\n matSuffix>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngIf=\"isLoading\" class=\"centered\">\r\n <mat-spinner diameter=\"40\"></mat-spinner>\r\n </mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems | async\" [value]=\"item\">\r\n {{displayBy ? item[displayBy] : item}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n</mat-form-field>\r\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return NgxMatTagInputComponent_1; }),
multi: true
}
],
styles: [".mat-tag-input-container{width:100%}.centered{width:100%;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:center}.centered mat-spinner{left:45%}"]
})
], NgxMatTagInputComponent);
return NgxMatTagInputComponent;
}());
export { NgxMatTagInputComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdC10YWctaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LW1hdC10YWctaW5wdXQvIiwic291cmNlcyI6WyJsaWIvbmd4LW1hdC10YWctaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBTW5ELE9BQU8sRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFjOUM7SUF1QkU7UUFuQlMsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUlsQixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUV4QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJaEMsdUJBQWtCLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsa0JBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBd0J6QyxhQUFRLEdBQVE7UUFDaEIsQ0FBQyxDQUFBO1FBRUQsY0FBUyxHQUFRO1FBQ2pCLENBQUMsQ0FBQTtJQXZCRCxDQUFDO2dDQXpCVSx1QkFBdUI7SUEyQmxDLHNCQUFJLDBDQUFLO2FBQVQ7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQzthQUVELFVBQVUsS0FBWTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7OztPQVBBO0lBU0QsMENBQVEsR0FBUjtRQUFBLGlCQUlDO1FBSEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFDZixHQUFHLENBQUMsVUFBQyxHQUFlLElBQUssT0FBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQTVDLENBQTRDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFRRCw0Q0FBVSxHQUFWLFVBQVcsR0FBUTtRQUNqQixJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELGtEQUFnQixHQUFoQixVQUFpQixFQUFPO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxtREFBaUIsR0FBakIsVUFBa0IsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsa0RBQWdCLEdBQWhCLFVBQWtCLFVBQW1CO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELDhDQUFZLEdBQVosVUFBYSxLQUFLO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRCx5Q0FBTyxHQUFQLFVBQVEsS0FBSztRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCx3Q0FBTSxHQUFOLFVBQU8sS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFFRCxxQ0FBRyxHQUFILFVBQUksS0FBd0I7UUFDMUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELHdDQUFNLEdBQU4sVUFBTyxLQUFVO1FBQ2YsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELDBDQUFRLEdBQVIsVUFBUyxLQUFtQztRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx1Q0FBSyxHQUFMO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELHlDQUFPLEdBQVAsVUFBUSxHQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVPLHlDQUFPLEdBQWYsVUFBZ0IsS0FBVTtRQUExQixpQkFPQztRQU5DLElBQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1RyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLE1BQU0sQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUExRCxDQUEwRCxDQUFDLENBQUM7U0FDaEc7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUExQyxDQUEwQyxDQUFDLENBQUM7U0FDaEY7SUFDSCxDQUFDOztJQWpJUTtRQUFSLEtBQUssRUFBRTsrREFBb0M7SUFDbkM7UUFBUixLQUFLLEVBQUU7NkRBQW1CO0lBQ2xCO1FBQVIsS0FBSyxFQUFFOzBEQUFtQjtJQUNsQjtRQUFSLEtBQUssRUFBRTtnRUFBcUI7SUFDcEI7UUFBUixLQUFLLEVBQUU7OERBQW1CO0lBQ2xCO1FBQVIsS0FBSyxFQUFFOzhEQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTtpRUFBMEI7SUFFeEI7UUFBVCxNQUFNLEVBQUU7MERBQTRCO0lBQzNCO1FBQVQsTUFBTSxFQUFFO2tFQUFvQztJQUNuQztRQUFULE1BQU0sRUFBRTsyREFBNkI7SUFDNUI7UUFBVCxNQUFNLEVBQUU7MERBQTRCO0lBQzNCO1FBQVQsTUFBTSxFQUFFOzJEQUE2QjtJQUM1QjtRQUFULE1BQU0sRUFBRTs0REFBOEI7SUFFZjtRQUF2QixTQUFTLENBQUMsV0FBVyxDQUFDOzhEQUF5QztJQWpCckQsdUJBQXVCO1FBWm5DLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsNHpDQUFpRDtZQUVqRCxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEseUJBQXVCLEVBQXZCLENBQXVCLENBQUM7b0JBQ3RELEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7O1NBQ0YsQ0FBQztPQUNXLHVCQUF1QixDQXNJbkM7SUFBRCw4QkFBQztDQUFBLEFBdElELElBc0lDO1NBdElZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtDT01NQSwgRU5URVJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge01hdEZvcm1GaWVsZEFwcGVhcmFuY2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtNYXRDaGlwSW5wdXRFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXAsIHN0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtbWF0LXRhZy1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtbWF0LXRhZy1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neC1tYXQtdGFnLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4TWF0VGFnSW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0VGFnSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgaXRlbXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc3BsYXlCeTogc3RyaW5nO1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdGVkVGFnczogYW55W10gPSBbXTtcblxuICBAT3V0cHV0KCkgcmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB0b3VjaGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhZ3NJbnB1dCcpIHRhZ3NJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwdWJsaWMgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUFdO1xuICBwdWJsaWMgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwdWJsaWMgZmlsdGVyZWRJdGVtczogT2JzZXJ2YWJsZTxhbnlbXT47XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWdzO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWdzID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy5fY2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5zZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgbWFwKCh0YWc6IGFueSB8IG51bGwpID0+IHRhZyA/IHRoaXMuX2ZpbHRlcih0YWcpIDogdGhpcy5pdGVtcy5zbGljZSgpKSk7XG4gIH1cblxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge1xuICB9XG5cbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKG9iaikge1xuICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoZm4pO1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIHRoaXMudG91Y2hlZC5lbWl0KGZuKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wuZGlzYWJsZSgpO1xuICB9XG5cbiAgX21vZGVsQ2hhbmdlKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQoZXZlbnQpXG4gIH1cblxuICBfY2hhbmdlKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBfZm9jdXMoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzLmVtaXQoZXZlbnQpXG4gIH1cblxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC5pbnB1dDtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgIGlmICgodmFsdWUgfHwgJycpLnRyaW0oKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhZ3MucHVzaCh2YWx1ZS50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICB0aGlzLl9jaGFuZ2UodGhpcy5zZWxlY3RlZFRhZ3MpO1xuICB9XG5cbiAgcmVtb3ZlKGZydWl0OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRUYWdzLmluZGV4T2YoZnJ1aXQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLl9jaGFuZ2UodGhpcy5zZWxlY3RlZFRhZ3MpO1xuICB9XG5cbiAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hUYWcoZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLnRhZ3NJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuc2VsZWN0LmVtaXQoZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWdzID0gW107XG4gIH1cblxuICBwdXNoVGFnKHRhZzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGFncy5pbmNsdWRlcyh0YWcpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFncy5wdXNoKHRhZyk7XG4gICAgICB0aGlzLl9jaGFuZ2UodGhpcy5zZWxlY3RlZFRhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlcih2YWx1ZTogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gKHRoaXMuZGlzcGxheUJ5ICYmIHZhbHVlW3RoaXMuZGlzcGxheUJ5XSA/IHZhbHVlW3RoaXMuZGlzcGxheUJ5XSA6IHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLmRpc3BsYXlCeSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb25bdGhpcy5kaXNwbGF5QnldLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG5cbn1cbiJdfQ==