@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
162 lines • 21.7 kB
JavaScript
import { Component, Input } from '@angular/core';
import { DataSource } from '@angular/cdk/table';
import { Observable, Subject, combineLatest } from 'rxjs';
import { debug } from '../../debug';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/material/table";
import * as i3 from "@angular/cdk/table";
export class MonitoringTableComponent {
/** Table columns */
columns = undefined;
dataSource = new MonitoringTableComponentDataSource();
set columnsMap(mapping) {
if (mapping) {
if (!this.columns) {
this.setupColumns();
}
for (const key in mapping) {
if (!this.columns?.find((info) => info.columnDef === key)) {
debug('Column ', key, 'is not in columns', this.columns);
this.addColumn(key, mapping[key]);
}
}
// Removing old columns
const toRemove = [];
this.columns?.forEach((column, index) => {
if (!(column.columnDef in mapping)) {
debug('Deleting column: ', column);
toRemove.push(index);
}
});
toRemove.reverse().forEach((index) => this.columns?.splice(index, 1));
// debug(`COLUMNS:`, this.columns)
this.displayedColumns = this.columns?.map((x) => x.columnDef);
// refresh data
this.dataSource.refresh();
}
}
/** Column definitions in order */
displayedColumns = [];
set variables(variables) {
combineLatest(variables.map((variable) => variable.values)).subscribe((values) => {
if (this.columns) {
const item = {};
this.columns.forEach((column, index) => {
if (column.columnDef === '__date') {
item[column.columnDef] = new Date().toLocaleTimeString();
}
else {
item[column.columnDef] = values[index - (this.date ? 1 : 0)];
}
});
this.dataSource.add(item);
}
});
}
set data$(stream) {
if (stream) {
stream.subscribe((value) => {
if (this.columns) {
this.dataSource.add(value);
}
});
}
}
set data(data) {
debug('Setting table data: ', data);
this.dataSource.data = data;
}
date = true;
constructor() { }
setupColumns() {
debug('setupColumns');
if (this.columns) {
this.columns.splice(0, this.columns.length);
}
else {
this.columns = [];
}
if (this.date) {
this.addColumn('__date', 'Date');
}
}
addColumn(id, header) {
if (!this.columns) {
this.columns = [];
}
const columnInfo = {
header: header,
columnDef: id,
cell: (row) => `${row[id]}`,
};
this.columns.push(columnInfo);
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MonitoringTableComponent, selector: "tap-app-monitoring-table", inputs: { columns: "columns", dataSource: "dataSource", columnsMap: "columnsMap", displayedColumns: "displayedColumns", variables: "variables", data$: "data$", data: "data", date: "date" }, ngImport: i0, template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i3.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i3.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringTableComponent, decorators: [{
type: Component,
args: [{ selector: 'tap-app-monitoring-table', template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n" }]
}], ctorParameters: () => [], propDecorators: { columns: [{
type: Input
}], dataSource: [{
type: Input
}], columnsMap: [{
type: Input
}], displayedColumns: [{
type: Input
}], variables: [{
type: Input
}], data$: [{
type: Input
}], data: [{
type: Input
}], date: [{
type: Input
}] } });
export class MonitoringTableComponentDataSource extends DataSource {
options;
_data = [];
_subject = new Subject();
constructor(options = {
max: -1,
newItemOnTop: true,
}) {
super();
this.options = options;
}
add(item) {
if (this.options.newItemOnTop) {
this._data.unshift(item);
if (this.options.max >= 0 && this._data.length > this.options.max) {
this._data.pop();
}
}
else {
this._data.push(item);
if (this.options.max >= 0 && this._data.length > this.options.max) {
this._data.shift();
}
}
this._subject.next(this._data);
// debug(`Adding values: `, item)
}
set data(d) {
this._data = d;
this._subject.next(this._data);
}
connect() {
return this._subject;
}
refresh() {
this._data = [...this._data];
this._subject.next(this._data);
}
disconnect() { }
clear() {
this._data = [];
this._subject.next(this._data);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvbW9uaXRvcmluZy10YWJsZS9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9tb25pdG9yaW5nLXRhYmxlL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQWtCcEMsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxvQkFBb0I7SUFDWCxPQUFPLEdBQXVCLFNBQVMsQ0FBQztJQUV4QyxVQUFVLEdBQUcsSUFBSSxrQ0FBa0MsRUFBRSxDQUFDO0lBRS9ELElBQWEsVUFBVSxDQUFDLE9BQWtDO1FBQ3hELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUNELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxF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QUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxDQUFtQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsS0FBSSxDQUFDO0lBRWYsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFic3RyYWN0VmFyaWFibGUgfSBmcm9tICdAaW90aXplL3RhcC9kYXRhJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vLi4vZGVidWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGF0YUVudHJ5IHtcbiAgX19kYXRlPzogbnVtYmVyO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW5UeXBlIHtcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIGNvbHVtbkRlZjogc3RyaW5nO1xuICBjZWxsOiAocm93OiBhbnkpID0+IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLWFwcC1tb25pdG9yaW5nLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudCB7XG4gIC8qKiBUYWJsZSBjb2x1bW5zICovXG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBUYWJsZUNvbHVtblR5cGVbXSA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBkYXRhU291cmNlID0gbmV3IE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudERhdGFTb3VyY2UoKTtcblxuICBASW5wdXQoKSBzZXQgY29sdW1uc01hcChtYXBwaW5nOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIGlmICghdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5zPy5maW5kKChpbmZvKSA9PiBpbmZvLmNvbHVtbkRlZiA9PT0ga2V5KSkge1xuICAgICAgICAgIGRlYnVnKCdDb2x1bW4gJywga2V5LCAnaXMgbm90IGluIGNvbHVtbnMnLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgICAgIHRoaXMuYWRkQ29sdW1uKGtleSwgbWFwcGluZ1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUmVtb3Zpbmcgb2xkIGNvbHVtbnNcbiAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zPy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghKGNvbHVtbi5jb2x1bW5EZWYgaW4gbWFwcGluZykpIHtcbiAgICAgICAgICBkZWJ1ZygnRGVsZXRpbmcgY29sdW1uOiAnLCBjb2x1bW4pO1xuICAgICAgICAgIHRvUmVtb3ZlLnB1c2goaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRvUmVtb3ZlLnJldmVyc2UoKS5mb3JFYWNoKChpbmRleCkgPT4gdGhpcy5jb2x1bW5zPy5zcGxpY2UoaW5kZXgsIDEpKTtcbiAgICAgIC8vIGRlYnVnKGBDT0xVTU5TOmAsIHRoaXMuY29sdW1ucylcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8ubWFwKCh4KSA9PiB4LmNvbHVtbkRlZik7XG5cbiAgICAgIC8vIHJlZnJlc2ggZGF0YVxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sdW1uIGRlZmluaXRpb25zIGluIG9yZGVyICovXG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gW107XG5cbiAgQElucHV0KCkgc2V0IHZhcmlhYmxlcyh2YXJpYWJsZXM6IEFic3RyYWN0VmFyaWFibGU8YW55PltdKSB7XG4gICAgY29tYmluZUxhdGVzdCh2YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gdmFyaWFibGUudmFsdWVzKSkuc3Vic2NyaWJlKFxuICAgICAgKHZhbHVlcykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgaXRlbTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sdW1uRGVmID09PSAnX19kYXRlJykge1xuICAgICAgICAgICAgICBpdGVtW2NvbHVtbi5jb2x1bW5EZWZdID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmNvbHVtbkRlZl0gPSB2YWx1ZXNbaW5kZXggLSAodGhpcy5kYXRlID8gMSA6IDApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYWRkKGl0ZW0gYXMgVGFibGVEYXRhRW50cnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkYXRhJChzdHJlYW06IE9ic2VydmFibGU8YW55Pikge1xuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgIHN0cmVhbS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGEoZGF0YTogVGFibGVEYXRhRW50cnlbXSkge1xuICAgIGRlYnVnKCdTZXR0aW5nIHRhYmxlIGRhdGE6ICcsIGRhdGEpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwcml2YXRlIHNldHVwQ29sdW1ucygpIHtcbiAgICBkZWJ1Zygnc2V0dXBDb2x1bW5zJyk7XG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZSgwLCB0aGlzLmNvbHVtbnMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgIHRoaXMuYWRkQ29sdW1uKCdfX2RhdGUnLCAnRGF0ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29sdW1uKGlkOiBzdHJpbmcsIGhlYWRlcjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkluZm8gPSB7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIGNvbHVtbkRlZjogaWQsXG4gICAgICBjZWxsOiAocm93OiBhbnkpID0+IGAke3Jvd1tpZF19YCxcbiAgICB9O1xuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb25pdG9yaW5nVGFibGVDb21wb25lbnREYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZTxUYWJsZURhdGFFbnRyeT4ge1xuICBfZGF0YTogVGFibGVEYXRhRW50cnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3N1YmplY3QgPSBuZXcgU3ViamVjdDxUYWJsZURhdGFFbnRyeVtdPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvcHRpb25zOiB7XG4gICAgICBtYXg6IG51bWJlcjtcbiAgICAgIG5ld0l0ZW1PblRvcDogYm9vbGVhbjtcbiAgICB9ID0ge1xuICAgICAgbWF4OiAtMSxcbiAgICAgIG5ld0l0ZW1PblRvcDogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhZGQoaXRlbTogVGFibGVEYXRhRW50cnkpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm5ld0l0ZW1PblRvcCkge1xuICAgICAgdGhpcy5fZGF0YS51bnNoaWZ0KGl0ZW0pO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXggPj0gMCAmJiB0aGlzLl9kYXRhLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXgpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXggPj0gMCAmJiB0aGlzLl9kYXRhLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXgpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gICAgLy8gZGVidWcoYEFkZGluZyB2YWx1ZXM6IGAsIGl0ZW0pXG4gIH1cblxuICBzZXQgZGF0YShkOiBUYWJsZURhdGFFbnRyeVtdKSB7XG4gICAgdGhpcy5fZGF0YSA9IGQ7XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHRoaXMuX2RhdGEpO1xuICB9XG5cbiAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRhYmxlRGF0YUVudHJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3ViamVjdDtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5fZGF0YSA9IFsuLi50aGlzLl9kYXRhXTtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cblxuICBkaXNjb25uZWN0KCkge31cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLl9kYXRhID0gW107XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHRoaXMuX2RhdGEpO1xuICB9XG59XG4iLCI8bWF0LXRhYmxlXG4gICpuZ0lmPVwiY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDBcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgI3RhYmxlXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIlxuICAgIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLmNvbHVtbkRlZlwiXG4gID5cbiAgICA8bWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmPnt7IGNvbHVtbi5oZWFkZXIgfX08L21hdC1oZWFkZXItY2VsbD5cbiAgICA8bWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93XCI+e3sgY29sdW1uLmNlbGwocm93KSB9fTwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LWhlYWRlci1yb3c+XG4gIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtcm93PlxuPC9tYXQtdGFibGU+XG4iXX0=