@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
168 lines • 26.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { ModalController } from '@ionic/angular';
import { ColumnMode } from '@swimlane/ngx-datatable';
import { BehaviorSubject, Subject, combineLatest } from 'rxjs';
import { switchMap, takeUntil } from 'rxjs/operators';
import { MonitoringAppGenComponent } from '../../metadata/decorators';
import { ChartDataModel, } from '../ChartDataModel';
import { TapVariableDataPopupComponent } from '../tap-variable-data-popup/tap-variable-data-popup.component';
import * as i0 from "@angular/core";
import * as i1 from "@ionic/angular";
import * as i2 from "@angular/common";
import * as i3 from "@swimlane/ngx-datatable";
import * as i4 from "../../ui-directive/export-data.directive";
const TABLE_LIMIT = 10;
let TapVariableTableComponent = class TapVariableTableComponent {
modalController;
cdr;
rows = [];
columns;
darkModeStatus;
chartModel = new ChartDataModel();
loadingIndicator = true;
reorderable = false;
columnMode = ColumnMode.force;
limit = TABLE_LIMIT;
valueLabel = 'Value';
nameLabel;
set history(enable) {
this._history.next(enable);
}
set valueCountLimit(limit) {
if (limit === undefined) {
limit = 30;
}
this._valueCountLimit.next(limit);
}
showExportButton = false;
exportedFileName;
set label(indexOrArray) {
this.chartModel.initLabel(indexOrArray);
}
_history = new BehaviorSubject(true);
_valueCountLimit = new BehaviorSubject(30);
destroyed = new Subject();
_input = new BehaviorSubject([]);
multiple = false;
set variable(variableOrArray) {
this.multiple = !!Array.isArray(variableOrArray);
this.input = this.chartModel.initVariable(variableOrArray);
}
set input(inputs) {
this._input.next(inputs);
}
columnsPushForEachKey(key) {
console.log('DEBUG columnsPushForEachKey', key, this.columns);
if (this.history && key === 'name') {
this.columns.push({
prop: key,
name: !this.nameLabel
? this.history
? 'Time'
: 'Name'
: this.nameLabel,
sortable: true,
});
}
else if (key === 'value') {
this.columns.push({ prop: key, name: this.valueLabel, sortable: true });
}
else if (key !== 'extra') {
this.columns.push({ prop: key, name: key, sortable: true });
}
}
constructor(modalController, cdr) {
this.modalController = modalController;
this.cdr = cdr;
}
createExportedData() {
return this.rows;
}
ngAfterViewInit() {
this.darkModeStatus =
window.matchMedia &&
window.matchMedia('(prefers-color-scheme: dark)').matches;
combineLatest([this._valueCountLimit, this._input, this._history])
.pipe(takeUntil(this.destroyed), switchMap(([valueCountLimit, input, history]) => {
this.chartModel.destroyCurrentSub();
if (this.multiple) {
return this.chartModel.defineMultiInputStream(input);
}
else {
return this.chartModel.defineInputStreamSingle(input, history, valueCountLimit, true);
}
}))
.subscribe((result) => {
this.resultToTableData(result);
});
}
resultToTableData(result) {
this.rows = result;
this.columns = [];
const jsonData = JSON.parse(JSON.stringify(this.rows[0]));
for (const key of Object.keys(jsonData)) {
if (key === 'series') {
jsonData['series'].forEach((k) => this.columnsPushForEachKey(k.name));
}
else {
this.columnsPushForEachKey(key);
}
}
this.loadingIndicator = false;
this.cdr.detectChanges();
}
onSelect(event) {
if (typeof event === 'object') {
this.chartModel
.showDetail(event, this.modalController, TapVariableDataPopupComponent)
.catch((err) => {
console.warn(err);
});
}
}
ngOnDestroy() {
this.chartModel.destroyCurrentSub();
this.destroyed.next();
this.destroyed.complete();
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableTableComponent, deps: [{ token: i1.ModalController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TapVariableTableComponent, selector: "tap-variable-table", inputs: { loadingIndicator: "loadingIndicator", reorderable: "reorderable", columnMode: "columnMode", limit: "limit", valueLabel: "valueLabel", nameLabel: "nameLabel", history: "history", valueCountLimit: "valueCountLimit", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", variable: "variable", input: "input" }, ngImport: i0, template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i4.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
};
TapVariableTableComponent = __decorate([
MonitoringAppGenComponent({}),
__metadata("design:paramtypes", [ModalController,
ChangeDetectorRef])
], TapVariableTableComponent);
export { TapVariableTableComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableTableComponent, decorators: [{
type: Component,
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tap-variable-table', template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"] }]
}], ctorParameters: () => [{ type: i1.ModalController }, { type: i0.ChangeDetectorRef }], propDecorators: { loadingIndicator: [{
type: Input
}], reorderable: [{
type: Input
}], columnMode: [{
type: Input
}], limit: [{
type: Input
}], valueLabel: [{
type: Input
}], nameLabel: [{
type: Input
}], history: [{
type: Input
}], valueCountLimit: [{
type: Input
}], showExportButton: [{
type: Input
}], exportedFileName: [{
type: Input
}], label: [{
type: Input
}], variable: [{
type: Input
}], input: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FJZixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFFN0csTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBU2hCLElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBZ0czQjtJQUNDO0lBaEdWLElBQUksR0FBMkMsRUFBRSxDQUFDO0lBRWxELE9BQU8sQ0FBUztJQUNoQixjQUFjLENBQVc7SUFFakIsVUFBVSxHQUFtQixJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRzFELGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUd4QixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBR3BCLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBRzlCLEtBQUssR0FBVyxXQUFXLENBQUM7SUFHNUIsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUdyQixTQUFTLENBQVU7SUFFbkIsSUFDSSxPQUFPLENBQUMsTUFBZTtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFDSSxlQUFlLENBQUMsS0FBeUI7UUFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFHRCxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFHbEMsZ0JBQWdCLENBQVU7SUFFMUIsSUFDSSxLQUFLLENBQUMsWUFBc0Q7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUU5QyxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUVuRCxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVoQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQXdCLEVBQUUsQ0FBQyxDQUFDO0lBRXhELFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFbEMsSUFDSSxRQUFRLENBQ1YsZUFHYTtRQUViLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFDSSxLQUFLLENBQUMsTUFBNkI7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELHFCQUFxQixDQUFDLEdBQVc7UUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLElBQUksRUFBRSxHQUFHO2dCQUNULElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTO29CQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87d0JBQ1osQ0FBQyxDQUFDLE1BQU07d0JBQ1IsQ0FBQyxDQUFDLE1BQU07b0JBQ1YsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUNsQixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsWUFDUyxlQUFnQyxFQUMvQixHQUFzQjtRQUR2QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFDN0IsQ0FBQztJQUVKLGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsY0FBYztZQUNqQixNQUFNLENBQUMsVUFBVTtnQkFDakIsTUFBTSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM1RCxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDL0QsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3pCLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQzVDLEtBQUssRUFDTCxPQUFPLEVBQ1AsZUFBZSxFQUNmLElBQUksQ0FDTCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQVc7UUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBbUIsRUFBRSxFQUFFLENBQ2pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBeUI7UUFDaEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVTtpQkFDWixVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsNkJBQTZCLENBQUM7aUJBQ3RFLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7MkhBaktVLHlCQUF5QjsrR0FBekIseUJBQXlCLDhaQ2hDdEMsc2dDQW9DQTs7QURKYSx5QkFBeUI7SUFQckMseUJBQXlCLENBQUMsRUFBRSxDQUFDO3FDQXVHRixlQUFlO1FBQzFCLGlCQUFpQjtHQWpHckIseUJBQXlCLENBa0tyQzs7NEZBbEtZLHlCQUF5QjtrQkFOckMsU0FBUztzQ0FDUyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLG9CQUFvQjtvSEFhOUIsZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJRixPQUFPO3NCQURWLEtBQUs7Z0JBTUYsZUFBZTtzQkFEbEIsS0FBSztnQkFTTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJRixLQUFLO3NCQURSLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFZRixLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBYnN0cmFjdFZhcmlhYmxlIH0gZnJvbSAnQGlvdGl6ZS90YXAvZGF0YSc7XG5pbXBvcnQgeyBDb2x1bW5Nb2RlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIENoYXJ0RGF0YU1vZGVsLFxuICBDaGFydElucHV0U2luZ2xlLFxuICBDaGFydElucHV0U3RyZWFtVmFyLFxuICBDaGFydElucHV0VGFibGUsXG59IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7IE9uQ2hhcnRTZWxlY3RFdmVudCB9IGZyb20gJy4uL3NoYXJlZC10eXBlcyc7XG5pbXBvcnQgeyBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwLmNvbXBvbmVudCc7XG5cbmNvbnN0IFRBQkxFX0xJTUlUID0gMTA7XG5cbkBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50KHt9KVxuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ3RhcC12YXJpYWJsZS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXAtdmFyaWFibGUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXAtdmFyaWFibGUtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFwVmFyaWFibGVUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHJvd3M6IENoYXJ0SW5wdXRTaW5nbGVbXSB8IENoYXJ0SW5wdXRUYWJsZVtdID0gW107XG5cbiAgY29sdW1ucyE6IGFueVtdO1xuICBkYXJrTW9kZVN0YXR1cz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjaGFydE1vZGVsOiBDaGFydERhdGFNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdJbmRpY2F0b3IgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHJlb3JkZXJhYmxlID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgY29sdW1uTW9kZSA9IENvbHVtbk1vZGUuZm9yY2U7XG5cbiAgQElucHV0KClcbiAgbGltaXQ6IG51bWJlciA9IFRBQkxFX0xJTUlUO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlTGFiZWwgPSAnVmFsdWUnO1xuXG4gIEBJbnB1dCgpXG4gIG5hbWVMYWJlbD86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgaGlzdG9yeShlbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9oaXN0b3J5Lm5leHQoZW5hYmxlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZUNvdW50TGltaXQobGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW1pdCA9IDMwO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZUNvdW50TGltaXQubmV4dChsaW1pdCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZXhwb3J0ZWRGaWxlTmFtZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgbGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmluaXRMYWJlbChpbmRleE9yQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGlzdG9yeSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVDb3VudExpbWl0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDMwKTtcblxuICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfaW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0SW5wdXRTdHJlYW1WYXJbXT4oW10pO1xuXG4gIHByaXZhdGUgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgdmFyaWFibGUoXG4gICAgdmFyaWFibGVPckFycmF5OlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPltdXG4gICAgICB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLm11bHRpcGxlID0gISFBcnJheS5pc0FycmF5KHZhcmlhYmxlT3JBcnJheSk7XG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuY2hhcnRNb2RlbC5pbml0VmFyaWFibGUodmFyaWFibGVPckFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBpbnB1dChpbnB1dHM6IENoYXJ0SW5wdXRTdHJlYW1WYXJbXSkge1xuICAgIHRoaXMuX2lucHV0Lm5leHQoaW5wdXRzKTtcbiAgfVxuXG4gIGNvbHVtbnNQdXNoRm9yRWFjaEtleShrZXk6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKCdERUJVRyBjb2x1bW5zUHVzaEZvckVhY2hLZXknLCBrZXksIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKHRoaXMuaGlzdG9yeSAmJiBrZXkgPT09ICduYW1lJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xuICAgICAgICBwcm9wOiBrZXksXG4gICAgICAgIG5hbWU6ICF0aGlzLm5hbWVMYWJlbFxuICAgICAgICAgID8gdGhpcy5oaXN0b3J5XG4gICAgICAgICAgICA/ICdUaW1lJ1xuICAgICAgICAgICAgOiAnTmFtZSdcbiAgICAgICAgICA6IHRoaXMubmFtZUxhYmVsLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAndmFsdWUnKSB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7IHByb3A6IGtleSwgbmFtZTogdGhpcy52YWx1ZUxhYmVsLCBzb3J0YWJsZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2V4dHJhJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goeyBwcm9wOiBrZXksIG5hbWU6IGtleSwgc29ydGFibGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1vZGFsQ29udHJvbGxlcjogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgY3JlYXRlRXhwb3J0ZWREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXJrTW9kZVN0YXR1cyA9XG4gICAgICB3aW5kb3cubWF0Y2hNZWRpYSAmJlxuICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX3ZhbHVlQ291bnRMaW1pdCwgdGhpcy5faW5wdXQsIHRoaXMuX2hpc3RvcnldKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXG4gICAgICAgIHN3aXRjaE1hcCgoW3ZhbHVlQ291bnRMaW1pdCwgaW5wdXQsIGhpc3RvcnldKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0TW9kZWwuZGVmaW5lTXVsdGlJbnB1dFN0cmVhbShpbnB1dCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0TW9kZWwuZGVmaW5lSW5wdXRTdHJlYW1TaW5nbGUoXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgICAgICB2YWx1ZUNvdW50TGltaXQsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMucmVzdWx0VG9UYWJsZURhdGEocmVzdWx0KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzdWx0VG9UYWJsZURhdGEocmVzdWx0OiBhbnkpIHtcbiAgICB0aGlzLnJvd3MgPSByZXN1bHQ7XG4gICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93c1swXSkpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGpzb25EYXRhKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3NlcmllcycpIHtcbiAgICAgICAganNvbkRhdGFbJ3NlcmllcyddLmZvckVhY2goKGs6IHsgbmFtZTogc3RyaW5nIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zUHVzaEZvckVhY2hLZXkoay5uYW1lKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zUHVzaEZvckVhY2hLZXkoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nSW5kaWNhdG9yID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE9uQ2hhcnRTZWxlY3RFdmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmNoYXJ0TW9kZWxcbiAgICAgICAgLnNob3dEZXRhaWwoZXZlbnQsIHRoaXMubW9kYWxDb250cm9sbGVyLCBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj5cbiAgPG5neC1kYXRhdGFibGVcbiAgICBbbmdDbGFzc109XCJkYXJrTW9kZVN0YXR1cyA/ICdkYXJrJyA6ICdtYXRlcmlhbCdcIlxuICAgIFtyb3dzXT1cInJvd3NcIlxuICAgIFtsb2FkaW5nSW5kaWNhdG9yXT1cImxvYWRpbmdJbmRpY2F0b3JcIlxuICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtjb2x1bW5Nb2RlXT1cImNvbHVtbk1vZGVcIlxuICAgIFtoZWFkZXJIZWlnaHRdPVwiNTBcIlxuICAgIFtmb290ZXJIZWlnaHRdPVwiNTBcIlxuICAgIFtyb3dIZWlnaHRdPVwiNTBcIlxuICAgIFtyZW9yZGVyYWJsZV09XCJyZW9yZGVyYWJsZVwiXG4gICAgW3Njcm9sbGJhckhdPVwidHJ1ZVwiXG4gICAgW2xpbWl0XT1cImxpbWl0XCJcbiAgPlxuICA8L25neC1kYXRhdGFibGU+XG4gIDwhLS1cbiAgICAgICAgW3RhcmdldE1hcmtlclRlbXBsYXRlXT1cInRhcmdldE1hcmtlclRlbXBsYXRlXCJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0YXJnZXRNYXJrZXJUZW1wbGF0ZSBsZXQtY2xhc3M9XCJjbGFzc1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiY2xhc3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uIGRhdGF0YWJsZS1pY29uLWRvd25cIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uIGRhdGF0YWJsZS1pY29uLXVwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgLS0+XG5cbiAgPGlvbi1mYWItYnV0dG9uXG4gICAgaWQ9XCJleHBvcnRGYWJCdXR0b25cIlxuICAgIHNpemU9XCJzbWFsbFwiXG4gICAgdGFwRXhwb3J0RGF0YVxuICAgIFtkYXRhVG9FeHBvcnRdPVwiY3JlYXRlRXhwb3J0ZWREYXRhLmJpbmQodGhpcylcIlxuICAgIFtleHBvcnRlZEZpbGVOYW1lXT1cImV4cG9ydGVkRmlsZU5hbWVcIlxuICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gID5cbiAgICA8aW9uLWljb24gbmFtZT1cImRvd25sb2FkXCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19